Code:
'*******************************************************************************
' http://www.black-strom.de.vu/
'
'
' Feature:
' - mit Interner Zeitbasis (Timer1)
' - Multiplexausgabe auf Siebensegmentanzeige (Timer0)
' - Uhr ist über zwei Taster einstellbar.
'
' To Do:
' -
'
' Feature for the future:
' - anderer µC evnt. ATMega8, da der 902312 für den rest nicht reichen wird
' - Uhr stellen über RC5, braucht Timer0
' - Wecker
' - DCF77 empfang
' - Datum zusätzliche über Alphanumerische anzeigen
'
'
' History:
' - V2.3.3 wird ein taster zum uhr stellen länger betätigt> schnellvorlauf
' - V2.3.2 beim uhr stellen die sekunden auf null setzen
' - V2.3.1 Uhren Code aus dem Inetrupt Label ind die Hauptschleife verschoben.
' - V2.3 Uhren Code umgeschrieben; jede Ziffer wir jetzt einzelnt gezählt,
' Function Bcdzahl und Label Multiplex wir überflüssig.
' Die Uhr ist jetzt einstellbar.
' - V2.2 Bugy <ö#+Q@
' - V2.1 Uhr geeicht auf 4MHz > Load_timer1 = 62755
' - V2.0 erster Hardware test
' - V1.0 nur am PC getestet
'
' HW Stack: 40 ; SW Stack 20 ; Framesize: 16
'
'*******************************************************************************
' µC Deklarationen
$regfile = "2313def.dat" 'AT90S2313-Deklarationen
$crystal = 4000000
' Variablen
Dim Temp_ziffer As Byte 'welche ziffer soll bearbeitet werden
Dim Bcd_aus As Byte 'enthält den Wert der dez zahl die ausgegeben werden soll
Dim Ausgang As Byte 'Segmentfolge die Ausgegeben wird aus Segmentcode - Tabelle
Dim Sek_blink As Bit 'Blinkt im Sekunden Takt
Dim Zl_sekunde As Byte 'Zeit Variablen
Dim Zl_minute As Byte 'enthalten die Uhrzeit
Dim Zl_stunde As Byte 'Zl-... => Low Wert der Zeit
Dim Zh_sekunde As Byte 'Zh-... => High Wert der Zeit
Dim Zh_minute As Byte
Dim Zh_stunde As Byte
'Dim A As Byte
'Dim B As Byte
'Dim B1 As Byte
'A = 1
' Ein-/Ausgänge
Config Portb = Output
Portb = Ausgang 'Port B als Ausgang
Ddrd = &B1111111
Config Portd = Input
Ddrd = &B11111000 '1 Ausgang, 0 Eingang
Portd = &B0000111 'pull up w.
'Eingänge:
T_min_stellen Alias Pind.0
T_h_stellen Alias Pind.1
Licht Alias Pind.2
' Sonstiges
Const Load_timer1 = 62755 'Konstande auf die der Timer1 geladen wird
'4MHz = 62755 | 62760 etwas zu langsam <> 62750 etwas zu schnell
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' Timer0 für Multiplexausgabe
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'On Timer0 7segment 'Interrupt-Routine für Timer0-Overflow
'Config Timer0 = Timer , Prescale = 1 'Takt: Quarz/Prescale (möglich: 1, 8, 64, 256, 1024)
'Enable Timer0 'Timer0-Overflow-Interrupt einschalten
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' Timer 1 als Zeitbasis
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
On Timer1 Sekunde_plus 'Interrupt-Routine für Timer1-Overflow
Config Timer1 = Timer , Prescale = 64 'Takt: Quarz/Prescale (möglich: 1, 8, 64, 256, 1024)
Enable Timer1 'Timer0-Overflow-Interrupt einschalten
Enable Interrupts 'Interrupts global zulassen
Load Timer1 , Load_timer1 'Lädt den Timer auf einen wert vor
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' Hauptprogramm
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Do 'Start Hauptschleife
' ### Uhren Code ###
' Es wird für jede Ziffer einzelnd gezählt, das ermöglicht eine einfacher ausgabe
' auf den 7segmentanzeigen. Der Zählvorgang funktioniert ím prinzip wie z.B.
' bei einem normalen Logik Zähler-IC
If Zl_sekunde = 10 Then 'Wenn der Sekunden Low Wert = 10
Zl_sekunde = 0 'wird er auf 0 gesetzt
Incr Zh_sekunde 'und der High Wert um eins erhöht
If Zh_sekunde = 6 Then 'Ist der High Wert 6 (entspricht 60 Sekunden)
Zh_sekunde = 0 'wird er auf 0 gesetzt
Incr Zl_minute 'und der Minuten Low Wert um eins erhöht
End If
End If
If Zl_minute = 10 Then
Zl_minute = 0
Incr Zh_minute
End If
If Zh_minute = 6 Then
Zh_minute = 0
Incr Zl_stunde
End If
If Zl_stunde = 10 Then
Zl_stunde = 0
Incr Zh_stunde
End If
If Zh_stunde = 2 And Zl_stunde = 4 Then
Zl_stunde = 0
Zh_stunde = 0
End If
' ### Uhr stellen ###
' Wird der Taster "T_min_stellen" betätigt werden die Minuten um eins erhöht.
' Wird der Taster "T_h_stellen" betätigt werden die Stunden um eins erhöht.
' Werden beide gleichzeitig betätigt werden Stunden und Minuten auf Null gesetzt.
' Wird einer der Taster länger betätigt (> 150ms) gibt es einen schnellvorlauf
If T_min_stellen = 0 Then 'Wird "T_min_stellen" betätigt
Waitms 1 'Entprellen
If T_min_stellen = 0 Then 'Ist der Taster immer noch betätigt
Incr Zl_minute 'wird Minute um eins erhöht
Zl_sekunde = 0 'Sekunden auf Null setzen
Zh_sekunde = 0
End If
End If
If T_h_stellen = 0 Then
Waitms 1
If T_h_stellen = 0 Then
Incr Zl_stunde
Zl_sekunde = 0
Zh_sekunde = 0
End If
End If
If T_min_stellen = 0 And T_h_stellen = 0 Then 'Wenn "T_Min_stellen" und "T_H_stellen" gleichzeitig betätigt
Zl_minute = 0 'dann werden Minuten und Stunden auf 0 gestzt
Zh_minute = 0
Zl_stunde = 0
Zh_stunde = 0
End If
'Loop 'Ende Hauptschleife
'End 'Programm Ende
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' Bei jedem Aufruf wir nur eine Ziffer ausgegeben, d.h nur eine Anzeige wird
' angesteuert. Die anderen bleiben dunkel. Bei jedem Aufruf wird eine Anzeige
' weitergeschaltet.
'
' Anzeigen anordnung
'
' 1111 2222 3333 4444
' 1 1 2 2 3 3 4 4
' 1111 2222 3333 4444
' 1 1 2 2 3 3 4 4
' 1111o 2222o 3333o 4444o
'
' ^-- Dezimalpunkt
' ^---- 4. Ziffer | Minute Low Wert | Variable Zl_minute
' ^---------- 3. Ziffer | Minute High Wert | Variable Zh_minute
' ^----------------- 2. Ziffer | Stunde Low Wert | Variable Zl_stunde
' ^----------------------- 1. Ziffer | Stunde High Wert | Variable Zh_stunde
'7segment:
If Licht = 0 Then
If Temp_ziffer = 4 Then Temp_ziffer = 0 'bestimmt die auszugebende Ziffer (1 bis 4)
Incr Temp_ziffer 'bei jedem aufruf des Lable wir eine andere Ziffer ausgegeben
Select Case Temp_ziffer 'welche Ziffer soll angesteuert werden
Case 1 : Bcd_aus = Zh_stunde
Case 2 : Bcd_aus = Zl_stunde
Case 3 : Bcd_aus = Zh_minute
Case 4 : Bcd_aus = Zl_minute
End Select
Select Case Bcd_aus
Case 1 : Ausgang = Lookup(1 , Segmentfolge)
Case 2 : Ausgang = Lookup(2 , Segmentfolge)
Case 3 : Ausgang = Lookup(3 , Segmentfolge)
Case 4 : Ausgang = Lookup(4 , Segmentfolge)
Case 5 : Ausgang = Lookup(5 , Segmentfolge)
Case 6 : Ausgang = Lookup(6 , Segmentfolge)
Case 7 : Ausgang = Lookup(7 , Segmentfolge)
Case 8 : Ausgang = Lookup(8 , Segmentfolge)
Case 9 : Ausgang = Lookup(9 , Segmentfolge)
Case 0 And Temp_ziffer = 1 : Ausgang = Lookup(10 , Segmentfolge) 'Nullstellenunterdrückung bei der ersten Ziffer
Case 0 And Temp_ziffer > 1 : Ausgang = Lookup(0 , Segmentfolge) 'wenn nicht erste Ziffer Null anzeigen
End Select
Portb = Ausgang
'Ausgabe des 7 Segmentcodes (Invertierend [Not] bei Anz. mit gem. Anode)
End If
Portb = 0
Loop
'Return
End
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' Interrupt-Routine für Timer1 / Zeitbasis
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Sekunde_plus:
Load Timer1 , Load_timer1 'Lädt den Timer auf einen wert vor
Incr Zl_sekunde 'Erhöht den Low Wert der Sekunde um eins
Toggle Sek_blink 'Ändert sich jede Sek., 1sec an 1sec aus
Return
' * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
' * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
' * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Segmentfolge: 'GFEDCBA / "1" Segment AN
Data 126 , 131 , 133 , 137 , 145 , 161 , 193 , 126 '0
Data 0 , 1 , 33 , 97 , 255 , 1 , 1 , 0 '1
Data 33 , 67 , 133 , 137 , 145 , 161 , 65 , 1 '2
Data 130 , 129 , 129 , 145 , 145 , 145 , 145 , 110 '3
Data 4 , 12 , 20 , 36 , 68 , 132 , 255 , 4 '4
Data 226 , 145 , 145 , 145 , 145 , 145 , 145 , 142 '5
Data 62 , 81 , 145 , 145 , 145 , 145 , 145 , 142 '6
Data 128 , 128 , 128 , 128 , 143 , 144 , 160 , 192 '7
Data 110 , 145 , 145 , 145 , 145 , 145 , 145 , 110 '8
Data 112 , 145 , 145 , 145 , 145 , 145 , 145 , 126 '9
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 'Leerzeichen
Lesezeichen