' {$STAMP BS2} ' {$PBASIC 2.5} hourcounter VAR Byte mincounter VAR Byte eggcounter VAR Byte gomin VAR Byte gonow VAR Byte goeggs VAR Byte counter VAR Byte htest VAR Byte mtest VAR Byte TxPin CON 2 Baud19200 CON 32 HIGH TxPin ' Set pin high to be a serial port PAUSE 100 ' Pause for Serial LCD to initialize LcdRt CON $09 LcdOn1 CON $16 LcdBkSpc CON $08 LcdLine1 CON $80 LcdLine2 CON $94 mindisplay VAR Byte eggdisplay VAR Byte hourcounter=0 mincounter=0 eggcounter=0 gomin=0 mindisplay=0 eggdisplay=0 DO IF (IN1=1) AND (IN0=1) THEN goeggs=2 SEROUT TxPin, Baud19200, [LcdOn1,LcdLine1,LcdRt,LcdRt,LcdRt,LcdRt,LcdRt,LcdRt,LcdRt,LcdRt,LcdRt,LcdRt,LcdRt,"GOOO"] GOSUB timekeep ENDIF IF (IN1=1) AND gomin=1 THEN goeggs=1 ENDIF IF (IN1=1) THEN gomin=1 ENDIF IF gomin=0 THEN IF (IN0=0) THEN ELSEIF (IN0=1) THEN hourcounter=hourcounter+1 IF hourcounter=0 THEN ELSEIF hourcounter=1 THEN SEROUT TxPin, Baud19200, [LcdOn1,LcdLine1,"Time:01:00 Hours"] ELSEIF hourcounter=2 THEN SEROUT TxPin, Baud19200, [LcdLine1,LcdRt,LcdRt,LcdRt,LcdRt,LcdRt,LcdRt,"2"] ELSEIF hourcounter=3 THEN SEROUT TxPin, Baud19200, [LcdBkSpc,"3"] ELSEIF hourcounter=4 THEN SEROUT TxPin, Baud19200, [LcdBkSpc,"4"] ELSEIF hourcounter=5 THEN SEROUT TxPin, Baud19200, [LcdBkSpc,"5"] ELSEIF hourcounter=6 THEN SEROUT TxPin, Baud19200, [LcdBkSpc,"6"] ELSEIF hourcounter=7 THEN SEROUT TxPin, Baud19200, [LcdBkSpc,"7"] ELSEIF hourcounter=8 THEN SEROUT TxPin, Baud19200, [LcdBkSpc,"8"] ELSEIF hourcounter=9 THEN SEROUT TxPin, Baud19200, [LcdBkSpc,"9"] ELSEIF hourcounter=10 THEN SEROUT TxPin, Baud19200, [LcdBkSpc,LcdBkSpc,"10"] ELSEIF hourcounter=11 THEN SEROUT TxPin, Baud19200, [LcdBkSpc,"1"] ELSEIF hourcounter=12 THEN SEROUT TxPin, Baud19200, [LcdBkSpc,"2"] ELSEIF hourcounter=13 THEN SEROUT TxPin, Baud19200, [LcdBkSpc,"3"] ELSEIF hourcounter=14 THEN SEROUT TxPin, Baud19200, [LcdBkSpc,"4"] ELSEIF hourcounter=15 THEN SEROUT TxPin, Baud19200, [LcdBkSpc,"5"] ELSEIF hourcounter=16 THEN SEROUT TxPin, Baud19200, [LcdBkSpc,"6"] ENDIF IF hourcounter=0 THEN ELSEIF hourcounter=17 THEN SEROUT TxPin, Baud19200, [LcdBkSpc,"7"] ELSEIF hourcounter=18 THEN SEROUT TxPin, Baud19200, [LcdBkSpc,"8"] ELSEIF hourcounter=19 THEN SEROUT TxPin, Baud19200, [LcdBkSpc,"9"] ELSEIF hourcounter=20 THEN SEROUT TxPin, Baud19200, [LcdBkSpc,LcdBkSpc,"20"] ELSEIF hourcounter=21 THEN SEROUT TxPin, Baud19200, [LcdBkSpc,"1"] ELSEIF hourcounter=22 THEN SEROUT TxPin, Baud19200, [LcdBkSpc,"2"] ELSEIF hourcounter=23 THEN SEROUT TxPin, Baud19200, [LcdBkSpc,"3"] ELSEIF hourcounter=24 THEN SEROUT TxPin, Baud19200, [LcdBkSpc,"4"] ELSEIF hourcounter=25 THEN hourcounter = hourcounter-25 ENDIF ENDIF ENDIF IF gomin=1 AND goeggs=0 THEN IF mindisplay = 0 THEN SEROUT TxPin, Baud19200, [LcdRt,LcdRt,LcdRt,LcdRt,"Mins ",LcdBkSpc,LcdBkSpc,LcdBkSpc,LcdBkSpc,LcdBkSpc,LcdBkSpc,LcdBkSpc] mindisplay=1 ENDIF IF (IN0=0) THEN ELSEIF (IN0=1) THEN mincounter=mincounter+1 IF mincounter =0 THEN ELSEIF mincounter=1 THEN SEROUT TxPin, Baud19200, [LcdLine1,LcdRt,LcdRt,LcdRt,LcdRt,LcdRt,LcdRt,LcdRt,LcdRt,"1"] ELSEIF mincounter=2 THEN SEROUT TxPin, Baud19200, [LcdBkSpc,"2"] ELSEIF mincounter=3 THEN SEROUT TxPin, Baud19200, [LcdBkSpc,"3"] ELSEIF mincounter=4 THEN SEROUT TxPin, Baud19200, [LcdBkSpc,"4"] ELSEIF mincounter=5 THEN SEROUT TxPin, Baud19200, [LcdBkSpc,"5"] ELSEIF mincounter=6 THEN mincounter=mincounter-6 ENDIF ENDIF ENDIF IF goeggs=1 THEN IF eggdisplay = 0 THEN SEROUT TxPin, Baud19200, [LcdRt,LcdRt,"Eggs "] eggdisplay=1 ENDIF IF (IN0=0) THEN ELSEIF (IN0=1) THEN eggcounter=eggcounter+1 IF eggcounter=0 THEN ELSEIF eggcounter=1 THEN SEROUT TxPin, Baud19200, [LcdLine2,"Eggs: 1"] ELSEIF eggcounter=2 THEN SEROUT TxPin, Baud19200, [LcdBkSpc,"2"] ELSEIF eggcounter=3 THEN SEROUT TxPin, Baud19200, [LcdBkSpc,"3"] ELSEIF eggcounter=4 THEN eggcounter=0 ENDIF ENDIF ENDIF PAUSE 500 LOOP 'Define I/O pins and RTC variables timekeep: mincounter=mincounter*10 HIGH TxPin ' Set pin high to be a serial port PAUSE 100 ' Pause for Serial LCD to initialize Clk CON 5 Dta CON 4 RTCCS CON 3 RTCCmd VAR Byte Value VAR Byte Seconds VAR Byte Minutes VAR Byte Hours VAR Byte Date VAR Byte Month VAR Byte Day VAR Byte Year VAR Byte Idx VAR Byte 'Define RTC Command Constants SecReg CON %00000 MinReg CON %00001 HrsReg CON %00010 DateReg CON %00011 MonReg CON %00100 DayReg CON %00101 YrReg CON %00110 CtrlReg CON %00111 TChgReg CON %01000 BrstReg CON %11111 'Define Days-Of-Week, Months and AM/PM text. 'All text is stored in EEPROM with a binary 0 as the end-of-text character Sun DATA "Sun",0 Mon DATA "Mon",0 Tue DATA "Tues",0 Wed DATA "Wednes",0 Thu DATA "Thurs",0 Fri DATA "Fri",0 Sat DATA "Satur",0 Jan DATA "January",0 Feb DATA "February",0 Mar DATA "March",0 Apr DATA "April",0 May DATA "May",0 Jun DATA "June",0 Jul DATA "July",0 Aug DATA "August",0 Sep DATA "September",0 Oct DATA "October",0 Nov DATA "November",0 Dcm DATA "December",0 AM DATA " AM",0 PM DATA " PM",0 'Set I/O pin states and directions OUTS = %0000000000000000 'All logic low DIRS = %0000000000000111 'I/O 0,1 and 2 are output, rest are input Initialize: 'Set Time and Date to 05/20/07 - 10:15 AM 'NOTE: Date must be set only once for every power-up of DS1302 chip. Day = $02 'Monday Month = $05 'May Date = $20 '20th Year = $07 '2007 Hours = $10 '10 a.m. (in 24-hour mode) Minutes = $19 Seconds = $45 GOSUB SetTimeAndDate LOOPY: 'Read out all date and time values and display them in two formats on 'the debug screen. IF hourcounter=Hours THEN IF mincounter=Minutes THEN GOSUB crack ENDIF ENDIF SEROUT TxPin, Baud19200, [LcdOn1,LcdLine2,LcdRt,LcdRt,LcdRt,LcdRt,LcdRt,LcdRt,LcdRt," ",HEX2 Hours,":",HEX2 Minutes,":",HEX2 Seconds] GOSUB ReadRTCBurst GOTO LOOPY GOSUB crack '==================== DS1302 Real-Time Clock Subroutines =================== PrintIt: 'Prints zero (0) terminated text from EEPROM READ Idx,Value 'Get next character IF Value = 0 THEN Finished 'Make sure it's not a binary 0 DEBUG Value 'Display it on screen Idx = Idx + 1 GOTO PrintIt Finished: RETURN WriteRTCRAM: 'Write to DS1302 RAM Register HIGH RTCCS SHIFTOUT Dta, Clk, LSBFIRST, [%0\1,RTCCmd\5,%11\2,Value] LOW RTCCS RETURN WriteRTC: 'Write to DS1302 HIGH RTCCS SHIFTOUT Dta, Clk, LSBFIRST, [%0\1,RTCCmd\5,%10\2,Value] LOW RTCCS RETURN ReadRTCBurst: 'Read all time-keeping registers in one burst HIGH RTCCS SHIFTOUT DTA, Clk, LSBFIRST, [%1\1,BrstReg\5,%10\2] SHIFTIN DTA, Clk, LSBPRE, [Seconds,Minutes,Hours,Date,Month,Day,Year] LOW RTCCS RETURN ReadRTCRAM: 'Read DS1302 RAM Register HIGH RTCCS SHIFTOUT DTA, Clk, LSBFIRST, [%1\1,RTCCmd\5,%11\2] SHIFTIN DTA, Clk, LSBPRE, [Value] LOW RTCCS RETURN SetTimeAndDate: 'Write time values into all time-keeping registers, being sure to clear 'the write-protect bit in CtrlReg before the write, and set the 'write-protect bit after the write FOR Idx = 0 TO 8 LOOKUP Idx,[0,Seconds,Minutes,Hours,Date,Month,Day,Year,128],Value LOOKUP Idx,[CtrlReg, SecReg, MinReg, HrsReg, DateReg, MonReg, DayReg, YrReg, CtrlReg],RTCCmd GOSUB WriteRTC NEXT RETURN crack: SEROUT TxPin, Baud19200, [LcdOn1,LcdLine1,LcdRt,LcdRt,LcdRt,LcdRt,LcdRt,LcdRt,LcdRt,LcdRt,LcdRt,LcdRt,LcdRt,"CRAK"] RETURN