Hallo matlen,

eine "Softuhr" für Bascom könnte z.B. so aussehen.
Hier zuerst der Programmcode (Ausschnitt mit den wesentlichen Definitionen!):

Code:
Config Date = Dmy , Separator = .                 'deutsches Datumsformat
Config Clock = User                               'Softclock aktivieren

Dim _dayofweek As Byte                            'Wochentag
Dim Sclkhsec As Byte                              'Hundertstel Sekunde

$lib "softclock.lib"                              'Softclock LIB
$external Softclock_1                             'Softclock für 1Hz
Declare Sub Softclock_1
$external Softclock_40                            'Softclock für 40Hz
Declare Sub Softclock_40
$external Softclock_100                           'Softclock für 100Hz
Declare Sub Softclock_100

Config Timer2 = Timer , Prescale = 1024           'Timer 40Hz
Const Startwert = 61                              'Für 8MHz
Timer2 = Startwert
On Timer2 Tim2_isr                                'Überlauf 40x/s
Enable Interrupts
Enable Timer2


'Hier weitere Definitionen!


'Hauptprogramm:
Cls
Cursor Off

Date$ = "01.01.00"
Time$ = "00:00:00"
_dayofweek = 6                                    'Samstag (der 1.1.00)

Sekunde = 0

'****************** HAUPTPROGRAMMSCHLEIFE **********************************

Do
  If Sekunde <> _sec Then
    Cls
    Call Showtime()
    Sekunde = _sec
  End If
Loop

End

'************* ENDE HAUPTPROGRAMM ******************************************

Sub Showtime()

  Locate 1 , 1                                    'Zeile 1:
  Lcd "    " ; Time$                              'Uhrzeit

  Locate 2 , 1                                    'Zeile 2:
  Lcd Lookupstr(_dayofweek , Wochentag) ; ". "    'Datum
  Lcd Date$

End Sub
'---------------------------------------------------------------------------

Getdatetime:                                      'Nicht genutzt!
Setdate:
Settime:
Return
'---------------------- Interrupt Routine ----------------------------------

Tim2_isr:
  Timer2 = Startwert
  Call Softclock_40                               'Softclock für 40Hz
Return

'---------------------- Daten für Wochentag --------------------------------
Wochentag:
Data "  " , "Mo" , "Di" , "Mi" , "Do" , "Fr" , "Sa" , "So"
... und hier die "softclock.lib":
Code:
copyright    = D. Ottensmeyer
comment      = Bascom Softclock
libversion   = 1.00
date         = 07.10.2006

[Softclock_1]
.def Temp1    = r16
.def Temp2    = r17
;BASCOM: Dim _dayofweek As Byte
;        Dim Sclkhsec As Byte

Softclock_1:                  ;Aufruf 1x pro Sekunde
  rjmp Soft15

[Softclock_40]
Softclock_40:                 ;Aufruf 40x pro Sekunde
$EXTERNAL Softclock_1

 *lds Temp1,{Sclkhsec}
  inc Temp1                   ;Hundertstel Sek erhöhen
  cpi Temp1,40                ;1000ms erreicht ?
  breq Soft10                 ;ja -> weiter
 *sts {Sclkhsec},Temp1
  ret                         ;sonst Ende

[Softclock_100]
Softclock_100:                ;Aufruf 100x pro Sekunde
$EXTERNAL Softclock_1

 *lds Temp1,{Sclkhsec}
  inc Temp1                   ;Hundertstel Sek erhöhen
  cpi Temp1,100               ;1000ms erreicht ?
  breq Soft10                 ;ja -> weiter
 *sts {Sclkhsec},Temp1
  ret                         ;sonst Ende

;-------------------------------------------------------------------------------
Soft10:
  clr Temp1                   ;Hundertstel Sek löschen
 *sts {Sclkhsec},Temp1
Soft15:
 *lds Temp1,{_sec}
  inc Temp1                   ;Sekunde erhöhen
  cpi Temp1,60                ;60 Sekunden erreicht ?
  breq Soft20                 ;ja -> weiter
 *sts {_sec},Temp1
  ret
Soft20:
  clr Temp1                   ;Sekunde löschen
 *sts {_sec},Temp1
 *lds Temp1,{_min}       
  inc Temp1                   ;Minute erhöhen
  cpi Temp1,60                ;60 Minuten erreicht ?
  breq Soft30                 ;ja -> weiter
 *sts {_min},Temp1
  ret
Soft30:
  clr Temp1                   ;Minute löschen
 *sts {_min},Temp1
 *lds Temp1,{_hour}
  inc Temp1                   ;Stunde erhöhen
  cpi Temp1,24                ;24 Stunden erreicht ?
  breq Soft40                 ;ja -> weiter
 *sts {_hour},Temp1  
  ret
Soft40:
  clr Temp1                   ;Stunde löschen
 *sts {_hour},Temp1
 *lds Temp1,{_dayofweek}
  inc Temp1                   ;Wochentag erhöhen
  cpi Temp1,8                 ;letzter Wochentag erreicht ?
  brne Soft50                 ;nein -> weiter
  ldi Temp1,1                 ;Wochentag auf "1" (Montag)
Soft50:
 *sts {_dayofweek},Temp1
 *lds Temp1,{_day}            ;Tag holen
 *lds Temp2,{_month}          ;Monat holen
  ldi zl,low(Tagdaten*2)
  ldi zh,high(Tagdaten*2)     ;Anzahl Tage pro Monat holen
  add zl,Temp2                ;Zeiger auf aktuellen Monat
  lpm                         ;Anzahl Tage holen
  cp Temp1,r0                 ;Monatsende erreicht ?
  brne Soft90                 ;nein -> weiter
  ldi Temp1,1                 ;Tag auf 1
  cpi Temp2,12                ;Jahresende erreicht ?
  brne Soft100                ;nein -> weiter
 *lds Temp2,{_year}           ;Jahr holen
  inc Temp2                   ;Jahr erhöhen
  cpi Temp2,100               ;Jahr 100 erreicht ?
  brne Soft80                 ;nein -> Ende
  clr Temp2                   ;Jahr 00 setzen
Soft80:
 *sts {_year},Temp2           ;speichern
  ldi Temp2,1                 ;Monat auf 1
  rjmp Soft110  
Soft90:
  inc Temp1                   ;Tag erhöhen
  rjmp Soft110                 
Soft100:
  inc Temp2                   ;Monat erhöhen
Soft110:
 *sts {_day},Temp1            ;Datum speichern
 *sts {_month},Temp2    
  ret

Tagdaten:
.db 00, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31  
[end]
Viel Spaß!

Dirk