You are on page 1of 5

; ENERGY METER with unit and amount

;1/1/2009
;************************************************************************
; P2.0 = ENTER BUTTON
; P2.7 = METER SENSOR
;-----------------------------------------------------------------------------
;PROGRAM STARTS HERE:
;---------------------
ORG 0000H ;START

MOV 60H,#04H ;COST PER UNIT


MOV 61H,#00H ;TOTAL COST MSB
MOV 62H,#00H ;TOTAL COST LSB
MOV DPTR,#COMM1 ;LCD INITILISATION
UP1: CLR A
MOVC A,@A+DPTR
INC DPTR
CJNE A,#'$',COMMAND11
UP772: ACALL METERDISPLAY
JB P2.0,UP772
WAIT_RE1: JB P2.0,SOLARMETER ;START THE PREPAID METER
SJMP WAIT_RE1
;-----------------------------------------------------------------------------
COMMAND11: LCALL COMMAND ; CALL COMMAND REGISTER OF LCD
AJMP UP1
COMM1: DB 3CH,0EH,06H,01H,'$'
;-----------------------------------------------------------------------------
METERDISPLAY:
MOV A,#01H ;CLEAR LCD DISPLAY
ACALL COMMAND
MOV A,#80H ; STARTING ADDRESS OF LINE 1 OF LCD
RAM
ACALL COMMAND
MOV R0,#08H
P225: ACALL DELAY ;DELAY
DJNZ R0,P225
MOV DPTR,#LINE72 ;DISPLAY DATA ON LINE1.
LCALL DISPLAYLINE
MOV A,#0C0H ; STARTING ADDRESS OF LINE 2 OF LCD
RAM
ACALL COMMAND
MOV DPTR,#LINE73 ;DISPLAY DATA ON LINE1.
LCALL DISPLAYLINE
MOV R0,#08H
UP525: ACALL DELAY ;DELAY
DJNZ R0,UP525
RET
LINE72: DB ' WIRE-LESS $'
LINE73: DB ' ENERGY METER $'
;*******************************************************************************

; 50H = UNIT LSB


; 51H = UNIT LSB
; 52H = UNIT LSB
SOLARMETER:
MOV 50H,#00H
MOV 51H,#00H
MOV 52H,#00H
GOAHEAD:
LCALL UNITDISPLY
GOAHEAD1:JB P2.7,GOAHEAD12
CHECKIT: JB P2.7,INCPULSE
SJMP CHECKIT
GOAHEAD12:JB P2.0,GOAHEAD1
LCALL DELAY1
INCPULSE:
MOV A,50H
ADD A,#01H
DA A
MOV 50H,A
CJNE A,#00H,D151
MOV A,51H
ADD A,#01H
DA A
MOV 51H,A
MOV A,62H
MOV R1,60H
ADD A,R1
DA A
MOV 62H,A
JNC D15
MOV A,61H
ADD A,#01H
DA A
MOV 61H,A
D15: MOV A,51H
CJNE A,#00H,D151
MOV A,52H
ADD A,#01H
DA A
MOV 52H,A
D151:
LJMP GOAHEAD

;--------------------------------------------------------------
UNITDISPLY:
MOV A,#01H ;CLEAR LCD DISPLAY
ACALL COMMAND
MOV A,#80H ; STARTING ADDRESS OF LINE 1 OF LCD RAM
ACALL COMMAND
MOV DPTR,#LINE737 ;DISPLAY DATA ON LINE1.
LCALL DISPLAYLINE
MOV A,52H
ACALL BCD2ASCII
MOV A,R3
ACALL DISPLAY
MOV A,R4
ACALL DISPLAY
MOV A,51H
ACALL BCD2ASCII
MOV A,R3
ACALL DISPLAY
MOV A,R4
ACALL DISPLAY
MOV A,#'.'
ACALL DISPLAY
MOV A,50H
ACALL BCD2ASCII
MOV A,R3
ACALL DISPLAY
MOV A,R4
ACALL DISPLAY
MOV A,#0C0H ; STARTING ADDRESS OF LINE 2 OF LCD RAM
ACALL COMMAND
MOV DPTR,#LINE724 ;DISPLAY DATA ON LINE1.
LCALL DISPLAYLINE
MOV A,61H
ACALL BCD2ASCII
MOV A,R3
ACALL DISPLAY
MOV A,R4
ACALL DISPLAY
MOV A,62H
ACALL BCD2ASCII
MOV A,R3
ACALL DISPLAY
MOV A,R4
ACALL DISPLAY
MOV A,#'.'
ACALL DISPLAY
MOV A,#'0'
ACALL DISPLAY
MOV A,#'0'
ACALL DISPLAY
RET
LINE737: DB 'UNIT = $'
LINE724: DB 'BILL =Rs.$'
;------------------------------------------------------------------------------
;BCD TO ASCII CONVERTER USED TO CONVERT 1 BCD NO IN 2 ASCII CODES:
;----------------------------------------------------------------
BCD2ASCII: MOV R4,A ;BCD TO ASCII CODE CONVERSION
ANL A,#0F0H ;MASK LSB
SWAP A ;SWAP NIBBLES
ORL A,#30H ;CONVERT IT TO ASCII
MOV R3,A ;SAVE THE MSB i.e. ASCII CHARACTER A
T R3
MOV A,R4 ;TAKE THE ORIGINAL DATA
ANL A,#0FH ;MASK UPPER NIBBLE
ORL A,#30H ;CONVERT IT TO ASCII
MOV R4,A ;SAVE THE LSB i.e. ASCII CHARACTER A
T R3
RET
;--------------------------------------------------------------
;--------------------------------------------------------------------------
;VERY IMP SUBROUTINE
DISPLAYLINE:
CLR A
MOVC A,@A+DPTR
INC DPTR
CJNE A,#'$',DISPLAY072
RET
DISPLAY072: ACALL DISPLAY ; CALL DATA REGISTER OF LCD FOR DISPLA
Y
AJMP DISPLAYLINE
;-----------------------------------------------------------------------------
;DELAY SUBROUTINE USED TO GENERATE DELAY OF 1 SECONDS:
;------------------------------------------------------
DELAY: MOV R7,#0FFH ;DELAY OF 1 SECOND
LOOP1: MOV R5,#0FFH
LOOP: DJNZ R5,LOOP
DJNZ R7,LOOP1
RET
DELAY1: MOV R7,#40H ;DELAY OF 1 SECOND
LOOP12: MOV R5,#0FFH
LOOP2: DJNZ R5,LOOP2
DJNZ R7,LOOP12
RET
;-----------------------------------------------------------------------------
;COMMAND SUBROUTINE USED TO INITILISE LCD DISPLAY:
;-------------------------------------------------
COMMAND: ACALL READY ;Write when display is not busy
MOV P1,A ;Command Character in Port P1
CLR P3.2 ;Command resister chosen
CLR P3.3 ; write enable
SETB P3.4 ; Strobe Character to display
CLR P3.4
RET ;Return
;-----------------------------------------------------------------------------
;DISPLAY SUBROUTINE USED TO DISPLAY DATA ON LCD DISPLAY:
DISPLAY: ACALL READY
MOV P1,A ;take data to be displayed
SETB P3.2 ;RS=P3.2= 1 to select data register
CLR P3.3 ;write enable
SETB P3.4 ;strobe character to be displayed
CLR P3.4
RET ; Return
;-----------------------------------------------------------------------------
;READY SUBROUTINE USED TO CHECK THE LCD STATUS i.e. BUSY OR NOT
;---------------------------------------------------------------
READY: CLR P3.4 ;strobe display
MOV P1,#0FFH ;configure P1 for input
CLR P3.2 ;Select command register
SETB P3.3 ;read enabled
WAIT: CLR P3.4 ;strobe display
SETB P3.4
JB P1.7,WAIT ;Read busy status (BF=0)
CLR P3.4 ;end display strobe.
RET ;Return
;-----------------------------------------------------------------------------

You might also like