'------------------------------------------------------ $regfile = "m8def.dat" '$lib "mcsbyte.lbx" ' use the byte lib since we do not need longs '$crystal = 4000000 $crystal = 3579545 '$baud = 19200 'declare used subs Declare Sub Writebcdtime(byval S1 As Byte , Byval M1 As Byte , Byval H1 As Byte , Byval D1 As Byte , Byval Month1 As Byte) Declare Sub Writetime Declare Sub Gettime Declare Sub Normalzeitzeigen Declare Sub Stundensignal Declare Sub Zeitstellen Declare Sub Dezimalzeit Soundpin Alias Pinb.0 'Declare variables Dim Tm(5) As Byte At &H60 'These are pointers to tm() for simple handling. Dim S As Byte At &H60 Overlay Dim M As Byte At &H61 Overlay Dim H As Byte At &H62 Overlay Dim D As Byte At &H63 Overlay Dim Month As Byte At &H64 Overlay Dim I As Byte , Temp As Byte Dim Str_char As String * 2 Dim D_stunde As Byte Dim D_minute As Byte Dim D_sekunde As Byte Dim Sekunden As Long Dim Cache As Long Dim Bweekday As Byte , Strweekday As String * 2 Dim Strdate As String * 8 Config Date = Dmy , Separator = . ' ANSI-Format Config Clock = User ' we use I2C for the clock Timesetpin Alias Pinb.1 Config Timesetpin = Input 'configure LCD-Display Config Lcd = 24 * 2 Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.5 , Rs = Portc.4 'configure the used port pin for I2C Config I2cdelay = 5 ' default slow mode Config Scl = Portd.6 'Configure i2c SCL Config Sda = Portd.7 'Configure i2c SDA ' not needed since the pins are in the right state 'I2cinit 'Call Settime(ss , mm ,hh , DD , MM) 'set time Call Gettime If H = 0 Then If S = 0 Then Call Writebcdtime(50 , 01 , 23 , 17 , 12) 'set time End If End If Config Int1 = Rising Enable Interrupts Enable Int1 'enable the interrupt On Int1 Getclock Nosave 'jump to getclock on INT0 Cls 'clear screen Cursor Off Do ' endless loop Idle ' Energie sparen Loop End ' ______________________ Ende Hauptprogramm _________________________________ Getclock: Call Zeitstellen Call Gettime Call Normalzeitzeigen Call Stundensignal Call Dezimalzeit Return 'generates a RETI because it is the first RETURN Return 'generates a RET because it is the second RETURN Sub Dezimalzeit ' Vergangene Sekunden des Tages Str_char = Hex(s) Sekunden = Val(str_char) Str_char = Hex(m) Cache = Val(str_char) Cache = Cache * 60 Sekunden = Sekunden + Cache Str_char = Hex(h) Cache = Val(str_char) Cache = Cache * 3600 Sekunden = Sekunden + Cache ' Umrechnen ins Dezimalsystem Sekunden = Sekunden * 625 ' Dezimaltag hat 100*100*100 Sekunden 10000=2*2*2*2 *5*5*5*5 Sekunden = Sekunden / 54 ' ein Tag hat 86400 Sekunden 864=2*2*2*2*2*2*3*3*3 Cache = Sekunden / 10000 D_stunde = Cache If D_stunde < 10 Then Lcd " " End If Lcd D_stunde ; ":"; Cache = Cache * 10000 Sekunden = Sekunden - Cache Cache = Sekunden / 100 D_minute = Cache If D_minute < 10 Then Lcd "0" End If Lcd D_minute ; ":"; Cache = Cache * 100 D_sekunde = Sekunden - Cache If D_sekunde < 10 Then Lcd "0" End If Lcd D_sekunde ; " " End Sub Sub Zeitstellen If Timesetpin = 1 Then Sound Soundpin , 20 , 40 If S > 31 Then Incr M If M > 59 Then M = 0 Incr H End If End If S = 0 Call Writetime End If End Sub Sub Normalzeitzeigen() Locate 1 , 1 Lcd "Dezimaluhr " Strdate = Hex(d) + "." + Hex(month) + ".06" Bweekday = Dayofweek(strdate) Strweekday = Lookupstr(bweekday , Weekdays) Locate 2 , 1 Lcd Strweekday ; " " ; Strdate ; " " ; Hex(h) ; ":" ; Hex(m) ; ":" ; Hex(s) Locate 1 , 13 End Sub Sub Stundensignal If S = 0 Then If M = 0 Then Sound Soundpin , 20 , 40 End If End If End Sub Sub Gettime() 'there are 2 ways to get the time. With low level i2c calls or with a high level call 'first the high level call Tm(1) = 2 ' point to second register I2creceive &HA0 , Tm(1) , 1 , 5 ' write the second address and get 5 bytes back 'i2creceive will first write 1 byte from tm(1) which is 2, and then will read 5 bytes and store it onto tm(1)-tm(5) 'and optional with low level calls ' For I = 1 To 5 ' Temp = I + 1 ' I2cstart ' I2cwbyte &HA0 'write addres of PCF8583 ' I2cwbyte Temp 'select register ' I2cstart 'repeated start ' I2cwbyte &HA1 'write address for reading info ' I2crbyte Tm(i) , Nack 'read data ' Next ' I2cstop End Sub Sub Writebcdtime(s1 As Byte , M1 As Byte , H1 As Byte , D1 As Byte , Month1 As Byte) 'values are stored as BCD values so convert the values first Tm(1) = Makebcd(s1) 'seconds Tm(2) = Makebcd(m1) 'minutes Tm(3) = Makebcd(h1) 'hours Tm(4) = Makebcd(d1) 'days Tm(5) = Makebcd(month1) 'months Call Writetime End Sub Sub Writetime I2cstart 'generate start I2cwbyte &HA0 'write address I2cwbyte 0 'select control register I2cwbyte 8 'set year and day bit for masking I2cstart 'repeated start I2cwbyte &HA0 'write mode I2cwbyte 2 'select seconds Register For I = 1 To 5 I2cwbyte Tm(i) Next 'write seconds I2cstop End Sub Weekdays: Data "Mo" , "Di" , "Mi" , "Do" , "Fr" , "Sa" , "So"