' Device declaration
DEVICE 16F877 ' Produce BCODE for a 16F877
XTAL = 20 ' Use a 20MHz crystal
ALL_DIGITAL = TRUE ' Set analog pins to digital
TRISA = %00011100 ' Set all of PORTA to outputs
OUTPUT PORTE
' Declaration for LCD
DECLARE LCD_DTPIN = PORTD.4 ' 4-line interface PORT
DECLARE LCD_ENPIN = PORTD.3 ' LCD EN pin
DECLARE LCD_RSPIN = PORTD.2 ' LCD RS pin
DECLARE LCD_INTERFACE = 4 ' 4 bit interface
DECLARE LCD_LINES = 4 ' 4-line LCD
DECLARE LCD_TYPE = 0 ' Alphanumeric LCD
' Alias pins
SYMBOL SCLK = PORTa.0
SYMBOL IO = PORTa.1
SYMBOL RST = PORTa.2
SYMBOL POL = PORTA.3
SYMBOL AMT = PORTA.4
SYMBOL DOR = PORTA.5
SYMBOL CRG = PORTE.0
' Allocate variables
Dim RTCYRS AS BYTE ' Year variable
Dim RTCDAY AS BYTE ' Day variable
Dim RTCMNT AS BYTE ' Month variable
Dim RTCDAT AS BYTE ' Date variable
Dim RTCHRS AS BYTE ' Hour variable
Dim RTCMIN AS BYTE ' Minute variable
Dim RTCSEC AS BYTE ' Second variable
Dim RTCCTRL AS BYTE ' Control byte
DIM AMOUNT AS BYTE ' Charging amount
DIM DAMOUNT AS BYTE ' Charging amount
DIM VARX AS BYTE ' General variable
DIM COMM AS BYTE ' Command Variable
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>
' Start of program
LOW RST ' Reset RTC
LOW SCLK
low porte
clear AMOUNT
CLEAR VARX
DELAYMS 100 ' Wait for LCD to startup
CLS
GOTO MAIN ' Skip subroutines
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>
' Subroutine to write time to RTC
SETTIME:
' Set initial time to 10:42:00AM 01/29/05
RTCYRS = $07
RTCDAY = $06
RTCMNT = $07
RTCDAT = $21
RTCHRS = $00
RTCMIN = $00
RTCSEC = $00
RST = 1 ' Ready for transfer
SHOUT IO,SCLK,LSBFIRST,[$8e,0] ' Enable write
RST = 0 ' Reset RTC
RST = 1 ' Ready for transfer
' Write all 8 RTC registers in burst mode
SHOUT IO,SCLK,LSBFIRST,[$be,RTCSEC,RTCMIN,RTCHRS,RTCDAT,RTCMNT,RTCDAY,RTCYRS,0]
RST = 0 ' Reset RTC
RETURN
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>
' Subroutine to read time from RTC
GETTIME:
RST = 1 ' Ready for transfer
SHOUT IO,SCLK,LSBFIRST,[$bf] ' Read all 8 RTC registers in burst mode
SHIN IO,SCLK,LSBPRE,[RTCSEC,RTCMIN,RTCHRS,RTCDAT,RTCMNT,RTCDAY,RTCYRS,RTCCTRL]
RST = 0 ' Reset RTC
RETURN
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>
' Main program loop - updates the LCD with the time
MAIN: IF AMT = 1 THEN
DELAYMS 500
AMOUNT = AMOUNT + 5
ENDIF
PRINT AT 1,5,"AMOUNT: ",DEC AMOUNT," MIN "
IF AMOUNT > 0 THEN
if dor = 1 then
SET CRG
GOSUB SETTIME
GOTO CHARGE ' Do it forever
endif
ENDIF
GOTO MAIN
CHARGE:
GOSUB GETTIME ' Read the time from the RTC
' Display time on LCD
PRINT AT 2,3," ",HEX2 RTCHRS,":",HEX2 RTCMIN,":",HEX2 RTCSEC
VARX = HEX2 RTCSEC
PRINT AT 3,10,DEC VARX
DAMOUNT = DEC AMOUNT
PRINT AT 4,10,DEC DAMOUNT
IF VARX = AMOUNT THEN
LOW CRG
PRINT AT 2,3, "CHARGING COMPLETE"
CLEAR AMOUNT
GOTO MAIN
ENDIF
GOTO CHARGE ' Do it forever
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>