$regfile = "m32def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 8
$framesize = 24




Match_rom Alias &H55
Skip_rom Alias &HCC
Auslesen Alias &HBE
Messen Alias &H44


Dim Lftag As Word 'Tag des Jahres
Dim Jahreszeit As Bit 'Jahreszeiten für Sommer / Winter
Dim Tz As Byte 'Zeit Zone
Dim Wochentag As Byte , Monat As Byte , Jahr As Word 'Datums anzeige
Dim Takt as byte , Takt_alt as byte
Dim Ds1820id(16) As Byte , Sc(9) As Byte 'Anzahle Sensoren 8 = 1 16 = 2 , 24 = 3 , 32 = 4 ,40 = 5 , 48 = 6 , 54 = 7
Dim I As Byte
Dim Dgc As Integer
Dim T1 As Integer , T2 As Integer ,temperr as bit


'für Multiplexen
Dim Einerh as byte , Zehnerh as byte , Einermin as byte , Zehnermin as byte
Dim Zahl as Byte , Stelle as Byte
Dim Dezimalziffern(4) as Word


'Für Temperatur
Dim T10 As Integer , T20 As Integer 'für min max berechnung


'Für Geschwindikeit
Dim Strecke as byte , weg as word , radzeit as byte , kmh1 as word , kmh as word


'Für ADC
Dim Messwert As word , Spannung As Single , Spannung1 As Single , Target As String * 10




Declare Sub Funkuhr
Declare Sub Tempmessung
declare Sub Geschwindigkeit
declare Sub Einzelzeit


Declare Function Decigrades18b20(byval Sc(9) As Byte) As Integer 'für DS18b20 ( China Sensoren )












Config Lcd = 16 * 2 '8x2 Display = 16x1a
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , _
Db7 = Portd.7 , E = Portd.2 , Rs = Portd.3
Initlcd
Cls


Config Dcf77 = PinC.0 , Timer = 1 , Timer1sec = 1 , Debug = 1 , Update = 0 , Check = 1 , Inverted = 0 , Gosub = Sectic 'Update = 2 wird stündlich (default 3uhr nachts), Update = 0 Funkhr wird immer aktuell gehalten
'Config Dcf77 = PinC.0 , Timer = 1 , Debug = 1 , Check = 1 , Inverted = 0 , Gosub = Sectic


Config Date = Dmy , Separator = .


Cursor off


Config Adc = Single , Prescaler = auto , Reference = Internal_2.56 'Internal_1.1 oder Internal_2.56 avcc aref
Const Adc_multi = 0.0025 '2,56/1024




Config Portb.3 = Output




Config timer2 = Timer , PRESCALE = 8


Config Timer0 = Pwm , Compare Pwm = Clear Up , Prescale = 8


On Ovf2 Isr_multiplex 'hier werden die Anzeigen geschalten
Enable Ovf2




Enable Interrupts


' 76543210
Ddra = &B00001111 'Tempsensoren A6, Reedkontakt A5, Spannung A4 , A0-A3 Transistor für Segmente Eingang = 0 Ausgang = 1
DDRC = &B11111110 'C7 - C1 4 * 7 Segmentanzeigen , C0 DCF-77




'************ Auslesen Temp Sensoren ************************


Config 1WIRE = Porta.6 '1Wire-Port festlegen war mal PortC.1


Restore Sensor_ids
For I = 1 To 17
Read Ds1820id(i)
Next I
1wreset
1wwrite Skip_rom
1wwrite Messen


Cls


Reed Alias PinA.5
Set PortA.5
reed = 1


Start Adc






Do


Dezimalziffern(1) = Zehnerh 'einzenle Zahlen für die Zeit anzeige
Dezimalziffern(2) = Einerh 'einzenle Zahlen für die Zeit anzeige
Dezimalziffern(3) = Zehnermin 'einzenle Zahlen für die Zeit anzeige
Dezimalziffern(4) = Einermin 'einzenle Zahlen für die Zeit anzeige


Debounce Reed , 0 , Kilometer , Sub 'Reedkontakt für Geschwindigkeit (noch nicht ganz sicher ob es bis 80km/h geht


Call Tempmessung 'Temperaturmessung starten
Call Geschwindigkeit 'kmh anzeige aufrufen
Call Einzelzeit 'Einzelne Zeitstellen


OCR0 = 250 'Display helligkeit


Locate 1 , 1
lcd Zehnerh ; einerh ;":" ; Zehnermin ; Einermin 'Einzelne Zeit anzeigen




'if Takt >=3 and Takt <=30 or Takt >=33 and Takt <=59 then 'später wieder einblenden
if kmh <= 9 then
Locate 2 , 11 '10
Lcd " "; kmh ; "km/h"
else
Locate 2 , 11 '10
Lcd kmh ; "km/h"
end if
'end if




'Messwert = 2
Messwert = Getadc(4)
Spannung = Messwert * Adc_multi
Spannung = Spannung * 5




'if Takt <3 or Takt >30 and Takt <33 then 'später wieder einblenden
'Runden Board Spannung messen
Target = Str(spannung)
Target = Fusing(spannung , "#.##")
If spannung <9 then
Locate 2 , 6 '10
Lcd " " ; Target ; "V"
else
Locate 2 , 6 '10
Lcd Target ; "V"
end if
'end if


Loop


'(
Sub Funkuhr


Lftag = Dayofyear() 'Tag des Jahres
Incr Lftag 'Tag des Jahres
Tz = Dcf77timezone() 'Zeitzone


End Sub Funkuhr
')


Sub Tempmessung
'Belegung von Pins zu einen von Links nach Rechts Flach oben
'1 = GND
'2 = Signal
'3 = VCC (5V)


' - - -
' 1 2 3
' \ _ /




If Takt <> Takt_alt Then
Takt_alt = Takt


1wverify Ds1820id(1) 'Sensor aus China
Locate 2 , 1
If Err = 1 Then
temperr = 1
Lcd "L NIO"
Elseif Err = 0 Then
1wwrite Auslesen
Sc(1) = 1wread(9)
T1 = Makeint(sc(1) , Sc(2))
If Sc(9) = Crc8(sc(1) , Then
Dgc = Decigrades18b20(sc(9))
End If
if Takt >=5 and Takt <10 or Takt >=15 _
and Takt <20 or takt >=25 and Takt <30 _
or takt >=35 and Takt <40 or takt >=45 _
and Takt <50 or takt >=55 then
If T1 >= 10 Then
Locate 2 , 1
Lcd "L " ; Dgc ; "C"
Else
Locate 2 , 1
Lcd "L " ; Dgc ; "C"
End If
end if
End if
1wverify Ds1820id(9) 'Sensor aus China
Locate 2 , 1
If Err = 1 Then
temperr = 1
Lcd "O NIO"
Elseif Err = 0 Then
1wwrite Auslesen
Sc(1) = 1wread(9)
T2 = Makeint(sc(1) , Sc(2))
If Sc(9) = Crc8(sc(1) , Then
Dgc = Decigrades18b20(sc(9))
End If


if Takt <5 or Takt >=10 and Takt <15 _
or Takt >=20 and takt <25 or Takt >=30 _
and takt <35 or Takt >=40 and takt <45 _
or Takt >=50 and takt <55 then
If T2 >= 10 Then
Locate 2 , 1
Lcd "O " ; Dgc ; "C"
Else
Locate 2 , 1
Lcd "O " ; Dgc ; "C"
End If
end if
If Takt = 9 Or Takt = 19 Or Takt = 29 _
Or Takt = 39 Or Takt = 49 Or Takt = 59 then 'alle 10 sekunden Messen
Restore Sensor_ids
For I = 1 To 17
Read Ds1820id(i)
Next I
1wreset
1wwrite Skip_rom
1wwrite Messen
End If
End if
End If




End Sub TEMPMESSUNG




Sub Geschwindigkeit
'V = S : T
'Geschwindigkeit = Weg / Zeit
if radzeit > 1 then
radzeit = 0
strecke = 0
end if




weg = Strecke * 1455 'radumfang im mm gemessen an Heidenheim reifen
if radzeit = 1 then
kmh1 = weg / radzeit
end if
kmh= kmh1 / 3600


End Sub Geschwindigkeit


Sub Einzelzeit


'Zehner Stunden
If _hour <10 or _hour = 20 then Zehnerh = 0
if _hour =>10 and _hour <20 then Zehnerh = 1
if _hour >=20 then Zehnerh = 2


'Einer Stunden
If _hour <10 then einerh = _hour
if _hour =>10 and _hour <20 then
Einerh = _hour - 10
End if
if _hour >20 then
einerh = _hour - 20
End if


'Zehner Minuten
if _Min <10 then Zehnermin = 0
if _Min =>10 and _Min <20 then Zehnermin = 1
if _Min =>20 and _Min <30 then Zehnermin = 2
if _Min =>30 and _Min <40 then Zehnermin = 3
if _Min =>40 and _Min <50 then Zehnermin = 4
if _Min =>50 then Zehnermin = 5


'einer Minuten
if _min <10 then einermin = _min
if _min >=10 and _min <20 then
einermin = _min - 10
end if
if _min >=20 and _min <30 then
einermin = _min - 20
end if
if _min >=30 and _min <40 then
einermin = _min - 30
end if
if _min >=40 and _min <50 then
einermin = _min - 40
end if
if _min >=50 then
einermin = _min - 50
end if


End sub Einzelzeit


'Formal für China Sensoren ( DS18B20 )
Function Decigrades18b20(byval Sc(9) As Byte)
Decigrades18b20 = 0
Decigrades18b20 = Makeint(sc(1) , Sc(2))
Decigrades18b20 = Decigrades18b20 / 16
End Function




Sectic:
Takt = _sec
Radzeit = Radzeit + 1


Return


Kilometer:
incr STRECKE


return


'Tempsensoren
Sensor_ids:
Data &H28 , &HA0 , &H29 , &H34 , &H05 , &H00 , &H00 , &H3A 'Innen Sensor T1
Data &H28 , &HDE , &H06 , &H34 , &H05 , &H00 , &H00 , &H26 'Ausen Sensor T2






Isr_multiplex:
'Bei jedem Aufruf der ISR wird
'sicherheitshalber alle Stellen über die Transistoren der Stellenansteueung die Anzeige abgeschaltet
'die Segmente der nächsten anzuzeigenden Dezimalziffer vorbereitet
'die entsprechende Stelle eingeschaltet.


If Stelle < 5 Then Incr Stelle Else Stelle = 1 'Index weiterschalten zur nächsten Stelle
Porta = Porta And &B00000000 'Alle 4 Stellen abschalten, andere Portpins nicht verändern '&B11110000




Portc = Lookup(dezimalziffern(stelle) , Ziffern_pattern) 'Lookup holt aus den Daten unter Ziffern_pattern
'das Pattern, das zur Zahl in Dezimalstellen(stelle) gehört
'und setzt damit im PORTB die Segmentportpins
Select Case Stelle 'und eine Stelle der vier wieder unter Strom setzen
Case 1 : Porta.0 = 1 'Stelle 1 einschalten am Porta.0
Case 2 : Porta.1 = 1 'Stelle 2 einschalten am Porta.1
Case 3 : Porta.2 = 1 'Stelle 3 einschalten am porta.2
Case 4 : Porta.3 = 1 'Stelle 4 einschalten am porta.3
End Select
Return




Ziffern_pattern: 'Daten zur Segmentansteuerung.
'Eine "1" bringt zusammen mit der Stellenansteuerung
'das entsprechende Segment zum leuchten


' 10 9 8 7 6
' . . . . .


' a e = 1
' 76543210 ' ________ d = 2
Data &B01111110 '0 ' | | A(K) = 3
Data &B00001100 '1 ' | | c = 4
Data &B10110110 '2 ' f | | b DP = 5
Data &B10011110 '3 ' | g | b = 6
Data &B11001100 '4 ' |_______ | a = 7
Data &B11011010 '5 ' | | A(K) = 8
Data &B11111010 '6 ' | | f = 9
Data &B00001110 '7 ' e | | c g = 10
Data &B11111110 '8 ' | d |
Data &B11011110 '9 ' |________|


' . . . . .
' 1 2 3 4 5






Im Großen und Ganzen sieht das Programm so aus.
aber es kann gut sein wie du schreibst das es daran liegt da muss ich mir das nochmal anschauen.
wie gesagt die multiplex Sache hab ich hier gefunden und im großen und ganzen nur etwas auf mein Projekt angepasst.
gibt bestimmt auch noch andere Möglichkeiten