Code:
RTC = %11010000 ' RTC device address (byte addressing); should not be a constant
ScReg CON $00 ' seconds address (00 - 59) MSBit of SecReg must be set to a 0 to enable RTC
MnReg CON $01 ' minutes address (00 - 59)
HrReg CON $02 ' hours address (01 - 12) or (00 - 23)
DaReg CON $03 ' day address (1 - 7)
DtReg CON $04 ' date address (01 - 28/29, 30, 31)
MoReg CON $05 ' month address (01 - 12)
YrReg CON $06 ' year address (00 - 99)
ContReg CON $07 ' control register
RAMstart CON $08
RTCflag CON 0 ' RTC flag (location 0 of internal EEPROM)
ClockControlByte CON %00010000 ' sets the SQW/OUT to 1Hz pulse, logic level low
' Clock Variables
Sc VAR BYTE
Mn VAR BYTE
Hr VAR BYTE
Da VAR BYTE
Dt VAR BYTE
Mo vAR BYTE
YR var BYTE
;------------------------------------------------------------
DoClock:
HSEROUT [13,10,"To SET clock, enter 'S', to READ clock, enter 'R'",13,10]
HSERIN [Dummy]
IF Dummy = "S" OR Dummy = "s" THEN
HSEROUT ["Enter Time - all inputs require two digits, no editing is possible",13,10]
HSEROUT [13,10,"Hours "]
HSERIN [Dummy]
HSEROUT [Dummy]
TimBuff[1] = Dummy
HSERIN [Dummy]
HSEROUT [Dummy]
TimBuff[2] = Dummy
HSEROUT [13,10,"Minutes "]
HSERIN [Dummy]
HSEROUT [Dummy]
TimBuff[3] = Dummy
HSERIN [Dummy]
HSEROUT [Dummy]
TimBuff[4] = Dummy
HSEROUT [13,10,"Date "]
HSERIN [Dummy]
HSEROUT [Dummy]
TimBuff[9] = Dummy
HSERIN [Dummy]
HSEROUT [Dummy]
TimBuff[10] = Dummy
HSEROUT [13,10,"Month "]
HSERIN [Dummy]
HSEROUT [Dummy]
TimBuff[7] = Dummy
HSERIN [Dummy]
HSEROUT [Dummy]
TimBuff[8] = Dummy
HSEROUT [13,10,"Year "]
HSERIN [Dummy]
HSEROUT [Dummy]
TimBuff[11] = Dummy
HSERIN [Dummy]
HSEROUT [Dummy]
TimBuff[12] = Dummy
GOSUB SETTime
ENDIF
IF Dummy = "R" or Dummy = "r" THEN
GOSUB ShowTime
HSEROUT [TimBuff[1],TimBuff[2],":",TimBuff[3],TimBuff[4],":00,",TimBuff[7],TimBuff[8],"/",TimBuff[9],TimBuff[10],"/",TimBuff[11],TimBuff[12],13,10]
PAUSE 10000
ENDIF
RETURN
HexASCII2BCD:
BCD = (Number1 - 48)<<4 + (Number2 - 48)
RETURN
BCD2HexASCII:
Number1 = (BCD >> 4) + 48
Number2 = (BCD & %00001111) + 48
RETURN
SetTime:
Number1 = TimBuff[5]
Number2 = TimBuff[6]
Gosub HexAscii2BCD
Sc = BCD
Number1 = TimBuff[3]
Number2 = TimBuff[4]
Gosub HexAscii2BCD
Mn = BCD
Number1 = TimBuff[1]
Number2 = TimBuff[2]
Gosub HexAscii2BCD
Hr = BCD
Number1 = TimBuff[7]
Number2 = TimBuff[8]
Gosub HexAscii2BCD
Mo = BCD
Number1 = TimBuff[9]
Number2 = TimBuff[10]
Gosub HexAscii2BCD
Da = 0 ' We don't care what day of the week it is
Dt = BCD
Number1 = TimBuff[11]
Number2 = TimBuff[12]
Gosub HexAscii2BCD
YR = BCD
Cntrl = 0 ' Must be zero to make clk run - NOT same as control reg!
Gosub ClockWrite
GOSUB ClockControl
Spare1 = 55 ' Doesn't have to be BCD
GOSUB ClockRamWrite
RETURN
ShowTime:
Gosub ClockRead
BCD = sc
GOSUB BCD2HexAscii
TimBuff[5] = Number1
TimBuff[6] = Number2
BCD = mn
GOSUB BCD2HexAscii
TimBuff[3] = Number1
TimBuff[4] = Number2
BCD = hr
GOSUB BCD2HexAscii
TimBuff[1] = Number1
TimBuff[2] = Number2
BCD = mo
GOSUB BCD2HexAscii
TimBuff[7] = Number1
TimBuff[8] = Number2
BCD = dt
GOSUB BCD2HexAscii
TimBuff[9] = Number1
TimBuff[10] = Number2
BCD = yr
GOSUB BCD2HexAscii
TimBuff[11] = Number1
TimBuff[12] = Number2
RETURN
ClockWrite:
I2CWrite SDA1,SCL1,RTC,ScReg,[sc,mn,hr,da,dt,mo,yr,Cntrl]
Return
ClockControl:
I2CWRITE SDA1,SCL1,RTC,ContReg,[ClockControlByte]
RETURN
ClockRAMRead:
I2CRead SDA1,SCL1,RTC,RAMstart,[Spare1,Spare2,Spare3,Spare4,Spare5,Spare6]
RETURN
ClockRAMWrite:
I2CWRITE SDA1,SCL1,RTC,RAMstart,[Spare1,Spare2,Spare3,Spare4,Spare5,Spare6]
RETURN
ClockRead:
I2CRead SDA1,SCL1,RTC,ScReg,[sc,mn,hr,da,dt,mo,yr]
RETURN
Bookmarks