Hallo matlen,
eine "Softuhr" für Bascom könnte z.B. so aussehen.
Hier zuerst der Programmcode (Ausschnitt mit den wesentlichen Definitionen!):
... und hier die "softclock.lib":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"
Viel Spaß!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]
Dirk







Zitieren

Lesezeichen