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
Lesezeichen