PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kleines Problem mit der Uhrzeit-Anzeige



OEP
13.11.2005, 17:43
Hallo,
Ich habe mir aus verschiedenen Code-Schippseln eine kleines Uhren-Programm gebastelt.
$regfile = "m8def.dat"
$crystal = 16000000

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2

Config Timer1 = Timer , Prescale = 256
On Timer1 Timer1int

Dim Sekunde As Byte
Dim Minute As Byte
Dim Stunde As Byte

Enable Interrupts

Stunde = 18
Minute = 13

Enable Timer1

Main:

Initlcd
Cls
Cursor Off
Do

If Sekunde = 60 Then
Gosub Minute1

End If
Locate 1 , 1

If Stunde > 9 Then Lcd Stunde
If Stunde < 10 Then Lcd "0" ; Stunde
Lcd ":"
If Minute > 9 Then Lcd Minute
If Minute < 10 Then Lcd "0" ; Minute
Lcd ":"
If Sekunde > 9 Then Lcd Sekunde
If Sekunde < 10 Then Lcd "0" ; Sekunde

Loop

Goto Main

Timer1int:
Timer1 = 3037
Sekunde = Sekunde + 1
Return

Minute1:
Incr Minute
Sekunde = 0
If Minute = 60 Then
Gosub Stunde1
End If

Return

Stunde1:
Incr Stunde
Minute = 0
If Stunde = 24 Then
Stunde = 0
End If
Return
Nach anfänglichen Problemen funktioniert das Programm jetzt ganz gut aber, wenn es z.B. 18:14:10 Uhr wird erscheint plötzlich hinter der Sekunden anzeige eine zusätzliche Null (18:14:100Uhr). Was ist das Problem in dem Code? Desweiteren würde ich mich über konstruktive Kritik im Allgemeinen freuen.
Gruß André

Torsten_G
13.11.2005, 20:26
Hallo André,

versuch mal, zunächst die angezeigte Uhrzeit mittels

locate 1,1
lcd " " 'Entsprechende Anzahl Leerzeichen

zu löschen, bevor Du die neue Zeit anzeigst.

Außerdem, Du schreibst ja zyklisch alle Variablen der Uhrzeit auf´s Diplay - es ist normalerweise sinnvoller, nur die Variable zu schreiben, die sich geändert hat.

Dafür brauchst Du eine If-then-Abfrage bei der Ausgabe, z. B.:

if Stunde <> Stunde_alt then
Stunde_alt = Stunde
Locate 1,1
Lcd " " 'Zwei Leerzeichen
Locate 1,1
Lcd Stunde
End if

(Natürlich noch mit der Formatierung auf Einer und Zehner...)

Die Doppelpunkte und alle anderen unveränderlichen Texte brauchst Du auch nur 1x vor dem Einstieg in die Do-Loop aufs Display zu schreiben.

Viele Grüße

Torsten

hrei
13.11.2005, 20:42
Hallo,

oh weh... Bitte nicht von hinten durch die Brust ins Auge :-)

Diese Zeile:
If Sekunde < 10 Then Lcd "0" ; Sekunde
um ein angehängtes Leerzeichen ergänzen:
If Sekunde < 10 Then Lcd "0" ; Sekunde ; " "
und gut isses.

Viele Grüße
Henrik

OEP
14.11.2005, 17:37
Hallo,
danke für die Antworten. Durch das angehängte Leerzeichen funktionierts jetzt. Aber warum wird die Null ohne Leerzeichen überhaupt dargestellt? Wo kommt die her?
Gruß Andre

OEP
14.11.2005, 17:59
Hallo,
danke für die Antworten. Durch das angehängte Leerzeichen funktionierts jetzt. Aber warum wird die Null ohne Leerzeichen überhaupt dargestellt? Wo kommt die her?
Gruß Andre

hrei
14.11.2005, 18:15
Hallo,
danke für die Antworten. Durch das angehängte Leerzeichen funktionierts jetzt. Aber warum wird die Null ohne Leerzeichen überhaupt dargestellt? Wo kommt die her?


Bei solchen doppelten IF Abragen kann es vorkommen, daß gerade in dem Moment die Sekunde umspringt und beide Bedingungen erfüllt werde. Resultat: Eine Ziffer zuviel.

Daher statt:

If Sekunde > 9 Then Lcd Sekunde
If Sekunde < 10 Then Lcd "0" ; Sekunde

besser ein solches Konstrukt:

If sekunde >=10 Then
Lcd sekunde
else
Lcd "0"; sekunde
end if

Das sollte man dann für alle Abfagen so machen.

Es grüßt ein sehr zeitknapper
Henrik