' ========================================================================= ' ' File....... DS1307.BPX ' Purpose.... DS1307 demo for BS2p-family modules ' Author..... Jon Williams, Parallax ' E-mail..... jwilliams@parallax.com ' Started.... ' Updated.... 31 AUG 2005 ' ' {$STAMP BS2px} ' {$PBASIC 2.5} ' ' ========================================================================= ' -----[ Program Description ]--------------------------------------------- ' -----[ Revision History ]------------------------------------------------ ' -----[ I/O Definitions ]------------------------------------------------- SDA PIN 0 ' I2C serial data line SCL PIN 1 ' I2C serial clock line HrsIn PIN 2 ' adjust minutes button MnsIn PIN 3 ' adjust hours button ' -----[ Constants ]------------------------------------------------------- Ack CON 0 ' acknowledge bit Nak CON 1 ' no ack bit DS1307 CON %1101 << 4 ' -----[ Variables ]------------------------------------------------------- idx VAR Nib secs VAR Byte ' DS1307 time registers mins VAR Byte hrs VAR Byte day VAR Byte ' weekday date VAR Byte ' day in month, 1 - 31 month VAR Byte year VAR Byte control VAR Byte ' SQWV I/O control buttons VAR Nib ' debounced button inputs btnHr VAR buttons.BIT1 ' advance hours btnMn VAR buttons.BIT0 ' advance minutes ' -----[ EEPROM Data ]----------------------------------------------------- ' -----[ Initialization ]-------------------------------------------------- Check_Stamp: #IF ($STAMP < BS2P) #THEN #ERROR "Requires BS2p-family module." #ENDIF Setup: DEBUG CLS, "DS1307 Demo", CR, "-----------" Reset_Clock: idx = HrsIn + MnsIn IF (idx = %00) THEN ' if both pressed, reset secs = $00 mins = $00 hrs = $06 ' 6:00 AM day = 5 ' Thur date = $01 ' 1st month = $01 ' January year = $04 ' 2004 control = 0 ' disable SQW output GOSUB Set_Clock ' block write clock regs ENDIF ' -----[ Program Code ]---------------------------------------------------- Main: DO GOSUB Get_Clock hrs = hrs & $3F DEBUG CRSRXY, 0, 2, HEX2 hrs, ":", HEX2 mins, ":", HEX2 secs PAUSE 100 GOSUB Get_Buttons IF (buttons > %00) THEN hrs = hrs.NIB1 * 10 + hrs.NIB0 ' BCD to decimal hrs = hrs + btnHr // 24 ' update hrs = (hrs / 10 << 4) + (hrs // 10) ' decimal to BCD mins = mins.NIB1 * 10 + mins.NIB0 mins = mins + btnMn // 60 mins = (mins / 10 << 4) + (mins // 10) secs = 0 ' reset GOSUB Set_Clock ENDIF LOOP END ' -----[ Subroutines ]----------------------------------------------------- Get_Buttons: buttons = %0011 ' assume pressed FOR idx = 1 TO 5 btnHr = btnHr & ~HrsIn ' validate inputs btnMn = btnMn & ~MnsIn PAUSE 5 NEXT RETURN ' Do a block write to clock registers Set_Clock: I2COUT SDA, DS1307, 0, [STR secs\8] RETURN ' Do a block read from clock registers Get_Clock: I2CIN SDA, DS1307, 0, [STR secs\8] RETURN