Simple code for use with DS1307 and 18F8722

-------------- RTC -----------------

RTC CON %11010000 ' RTC device address (byte addressing)
ScReg CON $00 ' seconds address (00 - 59) MSBit of SecReg must be set to a 0 to enable RTC
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


'---------------- END RTC assingment ---------------


Set up Seconds in TimBuff[5], TimBuff[6]
Minutes in TimBuff[3], TimBuff[4]
Hours in TimBuff[1],TimBuff[2]


Etc... ONE digit in each buffer element

Then GOSUB SetTime


To READ:

Gosub ShowTime
Current time is shown in the TimBuff[X] registers.







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


HexASCII2BCD:
BCD = (Number1 - 48)<<4 + (Number2 - 48)
RETURN

BCD2HexASCII:
Number1 = (BCD >> 4) + 48
Number2 = (BCD & %00001111) + 48
RETURN





ClockWrite:
I2CWrite SDA,SCL,RTC,ScReg,[sc,mn,hr,da,dt,mo,yr,Cntrl]
Return

ClockControl:
I2CWRITE SDA,SCL,RTC,ContReg,[ClockControlByte]
RETURN

ClockRAMRead:
I2CRead SDA,SCL,RTC,RAMstart,[Spare1,Spare2,Spare3,Spare4,Spare5,Spare6]
RETURN
ClockRAMWrite:
I2CWRITE SDA,SCL,RTC,RAMstart,[Spare1,Spare2,Spare3,Spare4,Spare5,Spare6]
RETURN

ClockRead:
I2CRead SDA,SCL,RTC,ScReg,[sc,mn,hr,da,dt,mo,yr]
RETURN