-         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 21

Thema: Uhrzeit h:m:s in BASCOM auf LCD darstellen?

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    101

    Uhrzeit h:m:s in BASCOM auf LCD darstellen?

    Anzeige

    Hallo!
    Ich versuche die Uhrzeit am LCD darzustellen. Aber bei den Sekunden
    bleibt beim umschalten z.B. von 23:59:59 auf 0:0:0 jedesmal die 59
    bei den sekunden stehen.
    Das schaut dann so aus: 0:0:0:59
    Sonst läufts aber.
    Was mach ich da falsch, weiß das jemand?

    Das ist der Code:
    Code:
    ' ATMEGA8- SelbstBauModul
    $regfile = "m8def.dat"
    $crystal = 14745600           'ext. Quarz
    ' /// UHR 
    Dim Sekunde As Word
    Dim Minute As Word
    Dim Stunde As Word
    
    '// Zum setzten von Stunde Minute Sekunde setzen
    Sekunde = 55
    Minute = 59
    Stunde = 23
    
    '/// LCD ///
    Config Lcd = 20 * 4
    Config Lcdbus = 4
    
    ' LCD im 4Bit I/O Mode
    Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4
    Config Lcdpin = Pin , Db7 = Portd.5 , E = Portd.7 , Rs = Portd.6
    Cls
    '/// TIMER ////
    
    Config Timer1 = Timer , Prescale = 256
    Const Startwert = 7936
    
    On Timer1 Ontimer1            'Interrupt-Routine für Timer1-Overflow
    Enable Timer1                 'Timer1-Overflow-Interrupt einschalten
    Enable Interrupts             'Interrupts global zulassen
    '-------------------------------------------------------------------------------
    Main:
    Do
    'Uhrzeit in Sekunde Minute Stunde
    If Sekunde = 60 Then
       Sekunde = 0
       Incr Minute
    End If
    
    If Minute = 60 Then
       Minute = 0
       Incr Stunde
    End If
    
    If Stunde = 24 Then
       Stunde = 0
    End If
    
    '/// LCD Anzeige Stunde Minute Sekunde 
    Cursor Off Noblink
     Home
     Lcd Stunde ; ":" ; Minute ; ":" ; Sekunde
     Waitms 100
    Loop
    Goto Main
    
    End
    '//////////////////
    Ontimer1:              
        Timer1 = Startwert
        Incr Sekunde
    Return

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    705
    Ist glaub´ ich ganz einfach:

    23:59:59 sind 8 Stellen, während 0:0:0 nur 5 Zeichen sind. Die letzten 3 werden folglich nicht überschrieben, wenn die Uhr auf 0 Uhr umspringt, und deshalb hängt noch der Rest ":59" hinten dran.

    (Das gleiche Problem nur mit weniger Zeichen müsste auftreten, wenn die Sekunden oder Minuten von 59 auf 0 umspringen - dann müssten hinten auch noch ein bis zwei überflüssige Zeichen rauslugen - stimmt´s?)

    Die einfachste Lösung wäre die, dass Du hinter die Sekunden noch 3 Leerzeichen hängst:

    Code:
    LCD Stunde; ":"; Minute; ":"; Sekunde; "   "
    Oder Du machst jedesmal ein "CLS", wenn eine der Variablen auf 0 gesetzt wird und der "Text" dadurch kürzer wird.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    101
    Hallo und Danke für die Info!
    Ja mit einem CLS bei den Sek,Min,H funktionierts!
    Danke
    Gruß
    Hans

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    705
    Super!

    Und als Code-Minimierer hab´ ich noch bemerkt, dass ein einziges CLS bei den Sekunden reichen müsste, denn einem Reset der Minuten und Stunden geht ja immer und zwingend ein Rücksetzen der Sekunden voraus.

    Aber der Ehrgeiz einen oder zwei Befehle einsparen zu können, kommt mit der Zeit ganz von selbst - Hauptsache, dass das Programm erstmal das macht, was Du möchtest

    Gruß,

    Daniel

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    101
    Hallo Daniel!
    Ja, mit einem cls gehts auch!
    Danke nochmal.

    Gruß
    Hans

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.08.2004
    Beiträge
    197
    Naja mit dem Locate-Befehl steht die Anzeige, auch mit Vornullen, immer richtig.
    Müste auch ähnlich mit Fusing oder Format gehen, dann muss vorher aber in Strings gewandelt werden.


    Code:
     $sim
    ' ATMEGA8- SelbstBauModul
    $regfile = "m8def.dat"
    $crystal = 14745600                                         'ext. Quarz
    ' /// UHR
    Dim Sekunde As Word
    Dim Minute As Word
    Dim Stunde As Word
    Dim H As String * 2
    Dim H1 As String * 2
    Dim M As String * 2
    Dim M1 As String * 2
    Dim S As String * 2
    Dim S1 As String * 2
    
    
    
    '// Zum setzten von Stunde Minute Sekunde setzen
    Sekunde = 55
    Minute = 59
    Stunde = 3
    
    '/// LCD ///
    Config Lcd = 20 * 4
    Config Lcdbus = 4
    
    ' LCD im 4Bit I/O Mode
    Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.5 , E = Portd.7 , Rs = Portd.6
    
    '/// TIMER ////
    
    Config Timer1 = Timer , Prescale = 256
    Const Startwert = 7936
    
    On Timer1 Ontimer1                                          'Interrupt-Routine für Timer1-Overflow
    Enable Timer1                                               'Timer1-Overflow-Interrupt einschalten
    Enable Interrupts                                           'Interrupts global zulassen
    Cursor Off Noblink
    Cls
    
    '-------------------------------------------------------------------------------
    
    Do
    'Uhrzeit in Sekunde Minute Stunde
    If Sekunde > 59 Then
       Sekunde = 0
       Incr Minute
    End If
    
    If Minute > 59 Then
       Minute = 0
       Incr Stunde
    End If
    
    If Stunde > 23 Then
       Stunde = 0
    End If
    
    '/// LCD Anzeige Stunde Minute Sekunde
    
    Home
     H = Str(stunde)
     H1 = Format(h , "00")
     M = Str(minute)
     M1 = Format(m , "00")
     S = Str(sekunde)
     S1 = Format(s , "00")
     Lcd H1 ; ":" ; M1 ; ":" ; S1
     'Waitms 100
    Loop
    
    
    End
    '//////////////////
    Ontimer1:
        Timer1 = Startwert
        Incr Sekunde
    Return
    Hier mal ein Beispiel das ich aus dem www habe:
    Code:
    $sim
    $regfile = "M128def.dat"
    $crystal = 16000000
    $hwstack = 128                                              ' default use 32 for the hardware stack
    $swstack = 128                                              'default use 10 for the SW stack
    $framesize = 128                                            'default use 40 for the frame space
    
    '$lib "lcd4busy.lbx"
    '$lib "lcd4.lbx"
    '$lib "i2c_twi.lbx"
    '$baud = 19200
    
    Config Portb = Input
    Config Portd = Input
    Portb = 255
    Config Portg = Input
    Portg.0 = 1
    Config Portc = Output
    'Config Portd = Output
    Ddra = 00000000
    Porta = 255
    
    Dim Count As Byte
    Dim Stunden As Byte
    Dim Temp As Byte
    Dim Tag As Byte
    Dim Tag_str As String * 2
    Dim Plus As Byte
    Dim Minus As Byte
    Dim Uhrzeit(10) As Byte                                     'enthält die uhrzeit und das datum vorteil kann leicht erweitert werden.
    Dim Uhr_help As Byte
    
    Dim Uhrzeit_std As String * 2
    Dim Uhrzeit_min As String * 2
    Dim Tag_datum As String * 2
    Dim Monat As String * 2
    Dim Jahr As String * 2
    
    
    Enable Interrupts
    
    Config Lcd = 20 * 4a , Chipset = Ks077
    Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.2 , Rs = Portc.1
    
    Initlcd
                                             'we run it in bus mode and I hooked up only db4-db7
    
                                          'tell about the bus mode
                                          '[now init the clock]
    
    Config Date = Dmy , Separator = /                           ' Deutsches-Format
    Config Clock = Soft                                         '
    
    'The format isTag/Monat/Jahr
    Date$ = "18/04/07"
    Time$ = "00:00:00"
    
    '---------------------------------------------------
    'clear the LCD display
    Cls
    Cursor Off Noblink
    Do
      Gosub Page
      Gosub Tastenabfrage                                       'Hauptprogramm
     Loop
    
    End
    
    Tag:
    Tag = Dayofweek()
    Select Case Tag
    Case 0 : Tag_str = "Mo"                                     'Die softclock liefert nur zahlen von
    Case 1 : Tag_str = "Di"                                     'zahlen von 0-6 dewswegen muss
    Case 2 : Tag_str = "Mi"                                     'die zahl in einem string gewandelt werden
    Case 3 : Tag_str = "Do"
    Case 4 : Tag_str = "Fr"
    Case 5 : Tag_str = "Sa"
    Case 6 : Tag_str = "So"
    End Select
    Return
    
    Tastenabfrage:
     Debounce Pina.1 , 0 , Taste_rechts , Sub
    
     Return
     '##########################################
     Uhrstellen:
     Debounce Pina.3 , 0 , Tasteplus , Sub
     Debounce Pina.4 , 0 , Tasteminus , Sub
     Debounce Pina.1 , 0 , Taste_rechts_uhr , Sub
     Debounce Pina.6 , 0 , Taste_links , Sub
     Debounce Pina.2 , 0 , Enter_raus , Sub
      Return
      '----------------------------------------
    Tasteplus:
    If Plus = 1 Then Incr Uhrzeit(1)
    If Plus = 2 Then Incr Uhrzeit(2)
    If Plus = 3 Then Incr Uhrzeit(3)
    If Plus = 4 Then Incr Uhrzeit(4)
    If Plus = 5 Then Incr Uhrzeit(5)
    If Plus = 6 Then Incr Uhrzeit(6)
    If Plus = 7 Then Incr Uhrzeit(7)
    If Plus = 8 Then Incr Uhrzeit(8)
    If Plus = 9 Then Incr Uhrzeit(9)
    If Plus = 10 Then Incr Uhrzeit(10)
    
    If Uhrzeit(1) > 2 Then Uhrzeit(1) = 0
    If Uhrzeit(2) > 9 Then Uhrzeit(2) = 0
    If Uhrzeit(3) > 5 Then Uhrzeit(3) = 0
    If Uhrzeit(4) > 9 Then Uhrzeit(4) = 0
    If Uhrzeit(5) > 3 Then Uhrzeit(5) = 0
    If Uhrzeit(6) > 9 Then Uhrzeit(6) = 0
    If Uhrzeit(7) > 1 Then Uhrzeit(7) = 0
    If Uhrzeit(8) > 9 Then Uhrzeit(8) = 0
    If Uhrzeit(9) > 9 Then Uhrzeit(9) = 0
    If Uhrzeit(10) > 9 Then Uhrzeit(10) = 0
    
    
    Return
    '-----------------------------
    Tasteminus:
    If Plus = 1 Then Decr Uhrzeit(1)
    If Plus = 2 Then Decr Uhrzeit(2)
    If Plus = 3 Then Decr Uhrzeit(3)
    If Plus = 4 Then Decr Uhrzeit(4)
    If Plus = 5 Then Decr Uhrzeit(5)
    If Plus = 6 Then Decr Uhrzeit(6)
    If Plus = 7 Then Decr Uhrzeit(7)
    If Plus = 8 Then Decr Uhrzeit(8)
    If Plus = 9 Then Decr Uhrzeit(9)
    If Plus = 10 Then Decr Uhrzeit(10)
    
    If Uhrzeit(1) > 2 Then Uhrzeit(1) = 2
    If Uhrzeit(2) > 9 Then Uhrzeit(2) = 9
    If Uhrzeit(3) > 5 Then Uhrzeit(3) = 5
    If Uhrzeit(4) > 9 Then Uhrzeit(4) = 9
    If Uhrzeit(5) > 3 Then Uhrzeit(5) = 3
    If Uhrzeit(6) > 9 Then Uhrzeit(6) = 9
    If Uhrzeit(7) > 1 Then Uhrzeit(7) = 0
    If Uhrzeit(8) > 9 Then Uhrzeit(8) = 0
    If Uhrzeit(9) > 9 Then Uhrzeit(9) = 0
    If Uhrzeit(10) > 9 Then Uhrzeit(10) = 0
    
    
    Return
    '-----------------
    Taste_rechts:
    Cursor On Noblink
    Cls
    Plus = 1
    Locate 1 , 8
    Lcd "--:--"
    Locate 2 , 8
    Lcd "00/00/07"
    Locate 1 , 8
    Do
    Gosub Uhrstellen
    Select Case Plus
    Case 1 : Locate 1 , 8
    Lcd Uhrzeit(1)
    Locate 1 , 8
    Case 2 : Locate 1 , 9
    Lcd Uhrzeit(2)
    Locate 1 , 9
    Case 3 : Locate 1 , 11
    Lcd Uhrzeit(3)
    Locate 1 , 11
    Case 4 : Locate 1 , 12
    Lcd Uhrzeit(4)
    Locate 1 , 12
    Case 5 : Locate 2 , 8
    Lcd Uhrzeit(5)
    Locate 2 , 8
    Case 6 : Locate 2 , 9
    Lcd Uhrzeit(6)
    Locate 2 , 9
    Case 7 : Locate 2 , 11
    Lcd Uhrzeit(7)
    Locate 2 , 11
    Case 8 : Locate 2 , 12
    Lcd Uhrzeit(8)
    Locate 2 , 12
    Case 9 : Locate 2 , 14
    Lcd Uhrzeit(9)
    Locate 2 , 14
    Case 10 : Locate 2 , 15
    Lcd Uhrzeit(10)
    Locate 2 , 15
    
    End Select
    
    Loop Until Pina.2 = 0
    Uhrzeit_std = Str(uhrzeit(1)) + Str(uhrzeit(2))             'wandelt  zahl in string um und packt 2 zahlen in eine speicherstelle
    Uhrzeit_min = Str(uhrzeit(3)) + Str(uhrzeit(4))             ' 00000001+ 00000010 = 0000000100000010 ---->   "12 "
    Tag_datum = Str(uhrzeit(5)) + Str(uhrzeit(6))
    Monat = Str(uhrzeit(7)) + Str(uhrzeit(8))
    Jahr = Str(uhrzeit(9)) + Str(uhrzeit(10))
    _hour = Val(uhrzeit_std )
    _min = Val(uhrzeit_min)                                     'umwanden vom string in eine zahle und übergabe an die uhr internen variablen.
    _day = Val(tag_datum)
    _month = Val(monat)
    _year = Val(jahr)
    _sec = 00
    Cls
    Return
    '-----------------------------
    Taste_links:
    Decr Plus
    If Plus > 10 Then Plus = 10
    
    Return
    '------------------------------
    Enter:
    
    Return
    '------------------------
    Enter_raus:
    
    Return
    Taste_rechts_uhr:
    Incr Plus
    If Plus > 10 Then Plus = 1
    
    Return
    
    '-----------------------
    Page:
    Gosub Tag
                                                           'cursor home
      Locate 1 , 7
     Lcd Date$
      Locate 2 , 7
      Lcd Time$
      Locate 3 , 10
                                                 'show the date and time
      Lcd Tag_str
      Locate 4 , 13
      Lcd "Press  >"
    Return

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    101
    Hallo Stromi!
    Das Programm mit der Umwandlung in String, hab ich geladen, es zeigt gar nix an. Irgendwas huscht aber über die Zeilen.
    Keine Ahnung wo der Fehler liegt.

    Gruß
    Hans

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    101
    Hallo Stromi!
    Ich hab den Fehler gefunden. Bei "... String * 2" muss statt der *1 die *2 stehen dann gehts.
    Die Anzeige ist allerdings auch nicht anders, nur dass man erst in String umwandelt und dann anzeigt.
    Hat das irgendeinen Vorteil?
    Gruß
    Hans

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.08.2004
    Beiträge
    197
    Die Anzeige ist, zumindest im Simulator, immer mit den Doppelpunkten nach links verrutscht. Und jetzt bleiben die Doppelpunkte wo sie sind. Zum Testen am Anfang des Codes $Sim schreiben kennst du, dann den Timerinterupt triggern und Spass haben....
    Teste mal deinen orginalen Code, dann den mit CLS und dann mit Strings und berichte. Scheinbar willst du noch mehr machen, du benutzt 4 Zeilendisplay und Main und goto Main, brauchst du so nicht, weißt du sicher.

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    101
    Hallo Stromi!
    Ich hatte das Problem bei meinem Code, dass durch das CLS natürlich immer die Anzeige kurz ausging. Das schaut bescheuert aus. Vor allem wenn auf dem Display noch andere Werte angezeigt werden.
    Ich habs nun so gelöst:
    Bei Zeitwerten <10 wird einfach an die richtige Stelle eine 0 hingestellt. Das schaut dann in der Anzeige so aus: 09:01 Uhr
    Sobald der Wert von 9 auf 10 springt bleibt alles an der richtigen Stelle, außerdem schauts besser aus, wenn ein Null davor steht. Es ruckt nichts hin und her. Das ganze nur durch ein paar Codezeilen mehr.
    Den Doppelpunkt ":" und die Anzeige "Uhr" lasse ich immer an der gleichen Stelle. Es funktioniert so wunderbar.
    Du hast natürlich recht, der Code ist noch nicht so optimal! Bevor ich weitermache muß ich erst noch ein wenig optimieren und einigen Unsinn rauswerfen. z.B. werde ich mehr in Unterprogramme reinpacken die ich dann nur aufrufe. Das mit dem Optimieren ergibt sich vermutlich automatisch je mehr Ahnung ich von der Programmierung habe.
    Noch bin ich ein Anfänger.
    Meine Schaltung und der Controller machen aber inzwischen das, was ich wollte. => Zeigt Strom (0....100A) und Spannung (0...20V) und die Uhrzeit auf dem Display an. Außerdem bekomme ich eine SMS geschickt, wenn die Batteriespannung unter die Entladeschlußspannung fällt.
    Was noch fehlt ist eine Temperaturanzeige, das will ich mit einem DS1620 machen oder wie der heißt, muß mich erst noch informieren.
    Wie gesagt, es ist noch nicht optimal aber es fällt mir jeden Tag was neues ein was man mit den freien Ein/Ausgängen noch so alles machen könnte.

    Danke nochmal für die Hilfe!
    Gruß
    Hans

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •