Code:
$regfile = "m8515.dat"
$framesize = 50
$swstack = 50
$hwstack = 50
$crystal = 8000000
$baud = 9600
'config LCD
'LCD konfiguriert (optional)
Config Pina.0 = Input
Porta.0 = 1
Setztaster Alias Pina.0
Config Pina.1 = Input
Porta.1 = 1
Auftaster Alias Pina.1
Config Porta.2 = Input
Porta.2 = 1
Abtaster Alias Pina.2
'eingänge für die Taster zum stellen konfiguriert
Declare Sub Einstellen(tag As Byte , Monat As Byte , Jahr As Word , Monatstage As Byte , Hjahr As Byte , Htagname As Integer )
Declare Sub Uhrzeiteinstellen(sekunde As Integer , Minute As Integer , Stunde As Integer )
Dim Sekunde As Integer
Dim Minute As Integer
Dim Stunde As Integer
Dim Tag As Byte
Dim Monat As Byte
Dim Jahr As Word
Dim Tagname As String * 2 'Hauptvariablen deklariert
Dim Monatstage As Byte 'zur ermittlung der Tage des Monats (30.2.2008 wäre schlecht)
Dim Hjahr As Byte 'zum zählen der Jahre um schaltjahre zu erkennen (das 2400 das Schaltjahr ausfällt, interessiert mich herzlich wenig)
Dim Htagname As Integer 'zum durchzaehlen der Wochentage
'Hilfsvariablen deklariert
Sekunde = 0
Minute = 0
Stunde = 0
Tag = 1
Monat = 1
Jahr = 2007 '1.1.2007
Hjahr = 3 '2008 kommt wieder ein Schaltjahr
Htagname = 1 'der 1.1.2007 war ein montag
'damit die Variablen schon zu anfang Werte haben
Wait 1 'wegen entprellter Taster mittels Kondensator zu GND
Do
Incr Sekunde 'Damit wird eine Sekunde weiter gezaehlt
If Sekunde = 60 Then
Sekunde = 0 '...nach 60 Sekunden ist ne minute rum..
Incr Minute
End If
If Minute = 60 Then '...nach 60 Minuten ne Stunde...
Minute = 0
Incr Stunde
End If
If Stunde = 24 Then '...und nach 24 Stunden ein Tag...
Stunde = 0
Incr Tag
Incr Htagname '...der natuerlich dann nicht mehr dersselbe Wochentag ist
End If
Select Case Monat ' erstmal muss ich wissen, wieviele Tage der Monat hat..
Case 1 :
Monatstage = 31
Case 2 :
If Hjahr = 4 Then
Monatstage = 29 ' (beim Schaltjahr)
Else
Monatstage = 28 ' (sonst)
End If
Case 3 :
Monatstage = 31
Case 4 :
Monatstage = 30
Case 5 :
Monatstage = 31
Case 6 :
Monatstage = 30
Case 7 :
Monatstage = 31
Case 8 :
Monatstage = 31
Case 9 :
Monatstage = 30
Case 10 :
Monatstage = 31
Case 11 :
Monatstage = 30
Case 12 :
Monatstage = 31
End Select
If Tag > Monatstage Then '...dann kann ich auch sagen, wann der Monat vorbei ist
Incr Monat
Tag = 1
End If
If Monat = 13 Then 'und nach 12 Monaten ist ein Jahr rum
Monat = 1
Incr Jahr
End If
Select Case Htagname 'dann guck ich noch, was fuern Wochentag ich hab...
Case 1 : Tagname = "Mo"
Case 2 : Tagname = "Di"
Case 3 : Tagname = "Mi"
Case 4 : Tagname = "Do"
Case 5 : Tagname = "Fr"
Case 6 : Tagname = "Sa"
Case 7 : Tagname = "So"
End Select
If Htagname = 8 Then 'mehr als 7 verschiedene Wochentage gib es aber nicht
Htagname = 1
End If
If Setztaster = 0 Then 'und wenn der Taster gedrueckt ist, will ich was einstellen
Call Einstellen(tag , Monat , Jahr , Monatstage , Hjahr , Htagname ) 'darum gehts jetzt in die Subs
Call Uhrzeiteinstellen(sekunde , Minute , Stunde ) 'ich hab zwei Subs weil ich sonst nen Rueffel vom Compiler bekomm, und ich besser Fehler finden kann
End If
Waitms 983 'n grober Schätzwert, dass ich die Loop-Schleife in einer Sekunde durchlaufe (dann kommt ja wieder "Incr Sekunde". Da kommt noch was genaueres hin. Irgendwann, vielleicht, unter Umstaenden
Print Tagname ; " " ; Tag ; ". " ; Monat ; ". " ; Jahr ; " " ; Stunde ; ":" ; Minute ; ":" ; Sekunde 'Und hier geb ich dann Wochentag, Datum und Uhrzeit aus
Loop 'der Loop zur ganzen Geschichte
Sub Einstellen(tag As Byte , Monat As Byte , Jahr As Word , Tagname As String * 2 , Monatstage As Byte , Hjahr As Byte , Htagname As Integer ) 'die Sub zum Einstellen des Datums (da noch Sekunde, Minute und Stunde dazu = Horror fuer den Compiler)
Wait 1
While Setztaster = 1 'soll laufen bis der Setztaster erneut betaetigt wird (ginge auch mit Do - Loop until)
If Auftaster = 0 Then 'wenn man incrementieren will, dann..
Incr Jahr '...ein Jahr weiterzaehlen...
Incr Hjahr '...den Zaehler fuer Schaltjahre mit weiterzaehlen
If Hjahr > 4 Then
Hjahr = 0 ' (n Schaltjahr kommt eben alle 4 Jahre vor)
End If
If Hjahr = 4 Then
Htagname = Htagname + 2 ' (faengt ein Jahr mit "Mo" an, und das naechste ist ein Schaltjahr, so faengt dieses mit "Mi" an)
Else
Incr Htagname ' (faengt ein Jahr mit nem "Mo" an, so faengt das naechste mit nem "Di" an)
End If
End If
If Abtaster = 0 Then 'the same procedure as beim indrementieren, nur diesmal decrementieren
Decr Jahr
Decr Hjahr
If Hjahr = 0 Then
Htagname = Htagname - 2
Else
Incr Htagname
End If
If Hjahr < 1 Then
Hjahr = 4
End If
End If
If Htagname < 1 Then 'Htagname kann negativ werden ("mo" entspricht 1, -2 wird daraus -1. es ist aber 6, naemlich "Sa"
Htagname = Htagname + 7
Elseif Htagname > 7 Then
Htagname = Htagname - 7 'selbiges kann bei + passieren
End If
Print "Jahr: " ; Jahr 'und AUSGABE! (den Rest mit auszugeben wird zu problematisch)
Waitms 200 'Warten, damit nicht zu schnell weiter-/zurueckgezaehlt wird (Reaktionstests und Geschicklichkeitsuebungen sind hier NICHT vorgesehen)
Wend
Wait 1
While Setztaster = 1
If Auftaster = 0 Then ' und das ganze fuern Monat
If Monat = 12 Then 'nicht weiterzaehlen, ist sonst zu schwer
Else 'sonst...
Incr Monat
Select Case Monat 'Jeh nach Monat beginnt der naeechste mit nem anderen Wochentag (pfffft, codecodecode)
Case 1 :
Htagname = Htagname + 3
Case 2 :
If Hjahr = 4 Then
Htagname = Htagname + 1
Else
End If
Case 3 :
Htagname = Htagname + 3
Case 4 :
Htagname = Htagname + 2
Case 5 :
Htagname = Htagname + 3
Case 6 :
Htagname = Htagname + 2
Case 7 :
Htagname = Htagname + 3
Case 8 :
Htagname = Htagname + 3
Case 9 :
Htagname = Htagname + 2
Case 10 :
Htagname = Htagname + 3
Case 11 :
Htagname = Htagname + 2
Case 12 :
Htagname = Htagname + 3
End Select
Waitms 200 'Wieder warten, damit wir nicht zu schnell sind
End If
End If
If Abtaster = 0 Then
If Monat = 1 Then 'nicht weiterzaehlen, sonst zu schwer
Else 'ansonsten...
Decr Monat
Select Case Monat
Case 1 :
Htagname = Htagname - 3
Case 2 :
If Hjahr = 4 Then
Htagname = Htagname - 1
Else
End If
Case 3 :
Htagname = Htagname - 3
Case 4 :
Htagname = Htagname - 2
Case 5 :
Htagname = Htagname - 3
Case 6 :
Htagname = Htagname - 2
Case 7 :
Htagname = Htagname - 3
Case 8 :
Htagname = Htagname - 3
Case 9 :
Htagname = Htagname - 2
Case 10 :
Htagname = Htagname - 3
Case 11 :
Htagname = Htagname - 2
Case 12 :
Htagname = Htagname - 3
End Select
End If
End If
If Htagname < 1 Then
Htagname = Htagname + 7
Elseif Htagname > 7 Then
Htagname = Htagname - 7
End If
If Monat = 0 Then
Monat = 12
Elseif Monat = 13 Then
Monat = 1
End If
Print "Monat: " ; Monat 'Ausgeben
Waitms 200
Wend
Wait 1
While Setztaster = 1 'Nun gehts noch an den Tag
Select Case Monat 'brauch ich gleich
Case 1 :
Monatstage = 31
Case 2 :
If Hjahr = 4 Then
Monatstage = 29
Else
Monatstage = 28
End If
Case 3 :
Monatstage = 31
Case 4 :
Monatstage = 30
Case 5 :
Monatstage = 31
Case 6 :
Monatstage = 30
Case 7 :
Monatstage = 31
Case 8 :
Monatstage = 31
Case 9 :
Monatstage = 30
Case 10 :
Monatstage = 31
Case 11 :
Monatstage = 30
Case 12 :
Monatstage = 31
End Select
If Auftaster = 0 Then
If Tag = Monatstage Then 'nicht weiterzaehlen
Else 'ansonsten..
Incr Tag
Incr Htagname 'der naechste Tag ist wohl auch der naechste Wochentag....
End If
End If
If Abtaster = 0 Then
If Tag = 1 Then 'nicht weiterzaehlen
Else 'ansonsten
Decr Tag
Decr Htagname
End If
End If
While Htagname < 1 'beidesmal While , wegen Dem "Htagname = Htagname + Monatstage" und dem "Htagname = Htagname - Monatstage"
Htagname = Htagname + 7
Wend
While Htagname > 7
Htagname = Htagname - 7
Wend
Print "Tag: " ; Tag 'und ausgeben
Waitms 200
Wend
End Sub
Sub Uhrzeiteinstellen(sekunde As Integer , Minute As Integer , Stunde As Integer ) 'Die Sub fuer die Uhrzeit
Wait 1
While Setztaster = 1
If Auftaster = 0 Then
Incr Sekunde
End If
If Abtaster = 0 Then
Decr Sekunde
End If
If Sekunde = 60 Then
Sekunde = 0
Elseif Sekunde < 0 Then
Sekunde = 59
End If
Print Stunde ; ":" ; Minute ; ":" ; Sekunde
Waitms 200
Wend
Wait 1
While Setztaster = 1
If Auftaster = 0 Then
Incr Minute
End If
If Abtaster = 0 Then
Decr Minute
End If
If Minute = 60 Then
Minute = 0
Elseif Minute < 0 Then
Minute = 59
End If
Print Stunde ; ":" ; Minute ; ":" ; Sekunde
Waitms 200
Wend
Wait 1
While Setztaster = 1
If Auftaster = 0 Then
Incr Stunde
End If
If Abtaster = 0 Then
Decr Stunde
End If
If Stunde = 24 Then
Stunde = 0
Elseif Stunde < 0 Then
Stunde = 23
End If
Print Stunde ; ":" ; Minute ; ":" ; Sekunde
Waitms 200
Wend
End Sub
evtuelle bugs sind nicht ausgeschlossen...
Lesezeichen