' {$STAMP BS2} ' {$PBASIC 2.5} ' {$PORT COM1} ' MAX7219 interface LedClockPin PIN 0 LedDataPin PIN 1 ' shift data to MAX7219 LedLoadPin PIN 2 ' LCD_CMD_DECODE CON $09 LCD_CMD_INTENSITY CON $0A LCD_CMD_SCAN CON $0B LCD_CMD_SHUTDOWN CON $0C LCD_CMD_TEST CON $0F ' PocketWatch B interface ClockIoPin PIN 14 CLOCK_CMD_PREFIX CON $55 CLOCK_SET_TIME CON $00 CLOCK_READ_TIME CON $02 ' Buttons Button1Pin PIN 6 Button2Pin PIN 7 Button1Work VAR Byte Button1Pressed VAR Bit Button2Work VAR Byte Button2Pressed VAR Bit ' Settings State SETTING_NONE CON 0 SETTING_MONTHS CON 1 SETTING_DAYS CON 2 SETTING_HOURS CON 3 SETTING_MINUTES CON 4 SETTING_SECONDS CON 5 settingState VAR Nib ' Current Time yearsLow VAR Byte months VAR Byte days VAR Byte hours VAR Byte minutes VAR Byte seconds VAR Byte ' Timeout setting TIMEOUT_COUNT CON 200 timeoutCounter VAR Word ' Intialize Initialize: OUTPUT LedClockPin OUTPUT LedDataPin OUTPUT LedLoadPin GOSUB showTime SHIFTOUT LedDataPin, LedClockPin, MSBFIRST, [LCD_CMD_SCAN, 4] PULSOUT LedLoadPin, 3 SHIFTOUT LedDataPin, LedClockPin, MSBFIRST, [LCD_CMD_INTENSITY, 7] PULSOUT LedLoadPin, 3 SHIFTOUT LedDataPin, LedClockPin, MSBFIRST, [LCD_CMD_SHUTDOWN, 1] PULSOUT LedLoadPin, 3 settingState = SETTING_NONE ' Main loop Main: DO Button1Pressed = 0 BUTTON Button1Pin, 1, 255, 0, Button1Work, 0, Btn1NotPressed Button1Pressed = 1 Btn1NotPressed: Button2Pressed = 0 BUTTON Button2Pin, 1, 5, 1, Button2Work, 0, Btn2NotPressed Button2Pressed = 1 Btn2NotPressed: IF Button1Pressed = 1 THEN timeoutCounter = 0 settingState = settingState + 1 IF settingState > SETTING_SECONDS THEN settingState = 0 SEROUT ClockIoPin,84,[CLOCK_CMD_PREFIX, CLOCK_SET_TIME, seconds,minutes,hours,days,months,yearsLow] ENDIF ENDIF IF Button2Pressed = 1 THEN timeoutCounter = 0 ON settingState GOSUB incrMonths, incrMonths, incrDays, incrHours, incrMinutes, incrSeconds ENDIF IF settingState = SETTING_NONE THEN SEROUT ClockIoPin,84,[CLOCK_CMD_PREFIX, CLOCK_READ_TIME] SERIN ClockIoPin, 84, 5000, Main, [seconds,minutes,hours,days,months,yearsLow] ELSEIF timeoutCounter > TIMEOUT_COUNT THEN settingState = SETTING_NONE ELSE SHIFTOUT LedDataPin, LedClockPin, MSBFIRST, [settingState, 1] PULSOUT LedLoadPin, 3 ENDIF GOSUB showTime NAP 2 timeoutCounter = timeoutCounter + 1 LOOP END ' Subroutine ShowTime ShowTime: SHIFTOUT LedDataPin, LedClockPin, MSBFIRST, [5, seconds REV 7] PULSOUT LedLoadPin, 3 SHIFTOUT LedDataPin, LedClockPin, MSBFIRST, [4, minutes REV 7] PULSOUT LedLoadPin, 3 SHIFTOUT LedDataPin, LedClockPin, MSBFIRST, [3, hours REV 7] PULSOUT LedLoadPin, 3 SHIFTOUT LedDataPin, LedClockPin, MSBFIRST, [2, days REV 7] PULSOUT LedLoadPin, 3 SHIFTOUT LedDataPin, LedClockPin, MSBFIRST, [1, months REV 7] PULSOUT LedLoadPin, 3 RETURN ' Subroutine incrMonths incrMonths: months = months + 1 IF months > 12 THEN months = 1 ENDIF RETURN ' Subroutine incrDays incrDays: days = days + 1 IF days > 31 THEN days = 1 ENDIF RETURN ' Subroutine incrHours incrHours: hours = hours + 1 IF hours > 23 THEN hours = 0 ENDIF RETURN ' Subroutine incrMinutes incrMinutes: minutes = minutes + 1 IF minutes > 59 THEN minutes = 0 ENDIF RETURN ' Subroutine incrSeconds incrSeconds: seconds = 0 RETURN