Wen es interessiert - hier habe ich mal den Code einer per zwei Taster stellbaren Softclock.

Benutzt wird ein Mega8/16 (SnugBoard, intern mit 1MHz getaktet), Fusebits auf Auslieferungszustand, LCD an PortB, Taster1 zum Stellen an PD.0, Taster2 zum Hochzählen an PD.3., zwischen XTAL ist ein 32.786 kHz Uhrenquarz

Es wird zum Stellen Alles nacheinander eingestellt (Stunde, Minute, Tag, Monat, Jahr)

Code:
'************************************************************
'
'Atmega Softclock -> genau Uhrzeit ohne RTC (Real-Time-Clock)
'
'Benutzt wird ein Mega8/8, Fusebits auf Auslieferungszustand,
'Lcd An Portb , Taster Zum Stellen An Pd.0
'zum Hochzählen An Pd.3.
'zwischen XTAL ist ein 32.xxx Uhrenquarz
'14.08.2006, Andree-HB, www.pixelklecks.de
'************************************************************



$regfile = "m8def.dat"


Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.1 , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5
Config Lcd = 24 * 2
Initlcd
Cursor Off
Cls

Enable Interrupts

Config Date = Mdy , Separator = /
Config Clock = Soft
Config Portd = Input


Portd.0 = 1                                                 'Taster1, Zeit/Datum stellen, PullUp ein, schaltet gegen Minus
Portd.3 = 1                                                 'Taster2,  Zahl hochzählen, PullUp ein, schaltet gegen Minus


Time$ = "00:00:00"                                          'Setzen auf Startwert
Date$ = "00/00/00"                                          'Setzen auf Startwert

Do
   Locate 1 , 1
   Lcd Time$                                                'Zeige Zeit in Zeile1
   Locate 2 , 1
   Lcd _day ; "/" ; _month ; "/0" ; _year                   'Zeige Datum in Form DD/MM/YYin Zeile2
'lcd Date$                                                     'zeige Datum in Form MM/DD/YY

   If Pind.0 = 0 Then Gosub Time                            'wiederhole Anzeige bis Taster 1 zum Stellen gedrückt, springe nach Sub "Time"
Loop
End


'Stunde
Time:
Waitms 200
Cls                                                         'lösche Zeilen
Do
Locate 1 , 1
Lcd "Set Hour:"                                             'Stunden setzen
Locate 2 , 1
Lcd _hour
         If Pind.3 = 0 Then                                 'Mit Taster 2
           Incr _hour                                          'hochzählen
           Locate 2 , 1
           Lcd _hour
         End If
If _hour > 23 Then                                          'Zählt bis Max, danach wieder ab 0
Cls
_hour = 00
End If                                                      'solange, bis Taster 1 gedrückt
Loop Until Pind.0 = 0
Waitms 200



'Minute
Cls
Do
Locate 1 , 1
Lcd "Set Minute:"
Locate 2 , 1
Lcd _min
         If Pind.3 = 0 Then
           Incr _min
           Locate 2 , 1
           Lcd _min
         End If
If _min > 59 Then
Cls
_min = 00
End If
Loop Until Pind.0 = 0
Waitms 200
Cls



'Tag
Cls
Do
Locate 1 , 1
Lcd "Set Day :"
Locate 2 , 1
Lcd _day
         If Pind.3 = 0 Then
           Incr _day
           Locate 2 , 1
           Lcd _day
         End If
If _day > 31 Then
Cls
_day = 01
End If
Loop Until Pind.0 = 0
Waitms 200
Cls



'Monat
Cls
Do
Locate 1 , 1
Lcd "Set Month :"
Locate 2 , 1
Lcd _month
         If Pind.3 = 0 Then
           Incr _month
           Locate 2 , 1
           Lcd _month
         End If
If _month > 12 Then
Cls
_month = 01
End If
Loop Until Pind.0 = 0
Waitms 200
Cls



'Jahr
Cls
Do
Locate 1 , 1
Lcd "Set Year :"
Locate 2 , 1
Lcd _year
         If Pind.3 = 0 Then
           Incr _year
           Locate 2 , 1
           Lcd _year
         End If
If _year > 10 Then
Cls
_year = 00
End If
Loop Until Pind.0 = 0
Waitms 200
Cls


_sec = 00                                                   'Springe Nach Setzen Von Zeit / Datum Wieder Zurueck
Return

Bild hier