📄 pgm.a51
字号:
ANL A,#0FH
ADD A,#30H
MOV R4,A
CALL WRLCDDATA
CALL MDELAY
MOV R4,#'.'
CALL WRLCDDATA
CALL MDELAY
MOV A,AMOUNT+2
ANL A,#0F0H
SWAP A
ADD A,#30H
MOV R4,A
CALL WRLCDDATA
CALL MDELAY
MOV A,AMOUNT+2
ANL A,#0FH
ADD A,#30H
MOV R4,A
CALL WRLCDDATA
CALL MDELAY
RET
DAP3: CJNE A,#00H,DAP2 ;CHK 2 DIGIT
MOV A,AMOUNT+1
ANL A,#0F0H
SWAP A
CJNE A,#00H,DAP4 ;CHK 3 DIGIT
AJMP DAP5
SEP_DISP:
MOV A,TEMP
ANL A,#0F0H
SWAP A
ADD A,#30H
MOV R4,A
CALL WRLCDDATA
CALL MDELAY
MOV A,TEMP
ANL A,#0FH
ADD A,#30H
MOV R4,A
CALL WRLCDDATA
CALL MDELAY
RET
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5
AMT_RECHARGE:
MOV READ_BYTE,#01H
MOV READ_BYTE+1,#00H
MOV READ_BYTE+2,#10H
MOV R1,#READ_BYTE ;store COUNT
MOV R6,#3 ;STORE 2 BYTES
MOV A,#WTCMD1 ;LOAD WRITE COMMAND
CALL OUTS ;SEND IT
MOV A,#20H ;GET LOW BYTE ADDRESS
CALL OUT ;SEND IT
BXLP: MOV A,@R1 ;GET DATA
CALL OUT ;SEND IT
INC R1 ;INCREMENT DATA POINTER
DJNZ R6,BXLP ;LOOP TILL DONE
CALL STOP ;SEND STOP CONDITION
CALL DELAY
RET
STORE_UNIT_PRICE:
MOV READ_BYTE,#00H
MOV READ_BYTE+1,#01H
MOV READ_BYTE+2,#00H
MOV R1,#READ_BYTE ;store COUNT
MOV R6,#3 ;STORE 2 BYTES
MOV A,#WTCMD1 ;LOAD WRITE COMMAND
CALL OUTS ;SEND IT
MOV A,#20H ;GET LOW BYTE ADDRESS
CALL OUT ;SEND IT
BALP: MOV A,@R1 ;GET DATA
CALL OUT ;SEND IT
INC R1 ;INCREMENT DATA POINTER
DJNZ R6,BALP ;LOOP TILL DONE
CALL STOP ;SEND STOP CONDITION
CALL DELAY
RET
RESET_BALANCE:
MOV BALANCE,#0FFH
MOV R1,#BALANCE ;store COUNT
MOV R4,#15H ;Starting Address IN EEPROM
MOV R6,#1 ;STORE 2 BYTES
CALL STORE_EEPROM
CALL DELAY
RET
RESET_PRICE:
MOV PRICE,#01H
MOV PRICE+1,#80H
MOV R1,#PRICE ;store COUNT
MOV R4,#10H ;Starting Address IN EEPROM
MOV R6,#2 ;STORE 2 BYTES
CALL STORE_EEPROM
CALL DELAY
RET
RESET_COUNTER:
MOV COUNTER,#00H
MOV COUNTER+1,#03H
MOV R1,#COUNTER ;store COUNT
MOV R4,#0EH ;Starting Address IN EEPROM
MOV R6,#2 ;STORE 2 BYTES
CALL STORE_EEPROM
CALL DELAY
RET
RESET_AMT:
MOV AMOUNT,#00H ;
MOV AMOUNT+1,#05H
MOV AMOUNT+2,#00H
MOV R1,#AMOUNT ;store READING
MOV R4,#0AH ;Starting Address IN EEPROM
MOV R6,#3 ;STORE 2 BYTES
CALL STORE_EEPROM
CALL DELAY
RET
RESET_READING:
MOV READING,#00H
MOV READING+1,#13H
MOV R1,#READING ;store READING
MOV R4,#05H ;Starting Address IN EEPROM
MOV R6,#2 ;STORE 2 BYTES
CALL STORE_EEPROM
CALL DELAY
RET
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DELAYY:
MOV F1,#0FH
SEP3: MOV F2,#0fFH
SEP2: MOV F3,#0FFH
SEP1: DJNZ F3,SEP1
DJNZ F2,SEP2
CALL CARD_READ
MOV A,READ_BYTE
CJNE A,#0FFH,DSP1
CLR TBIT1
DSP3A:DJNZ F1,SEP3
RET
DSP1: JB TBIT1,DSP3A
CALL TITLE3
CALL DELAYS
CALL DELAYS
CALL CARD_READ
MOV A,READ_BYTE
CJNE A,#00H,DSP2
CALL TITLE4 ; NEW UNIT PRICE
MOV PRICE,READ_BYTE+1
MOV PRICE+1,READ_BYTE+2
MOV R1,#PRICE ;store COUNT
MOV R4,#10H ;Starting Address IN EEPROM
MOV R6,#2 ;STORE 2 BYTES
CALL STORE_EEPROM
CALL DELAYS
SETB TBIT1
AJMP RESETX_CHIP
DSP2: CJNE A,#01H,DSP3
CALL TITLE5 ; NEW RECHARGE
; MOV R1,#AMOUNT ;GET DATA IN BYTES(RAM)
; MOV R4,#0AH ;DATA ADDRESS IN EEPROM
; MOV R6,#03h ;NUMBER OF BYTES
; CALL READ_EEPROM
MOV A,AMOUNT
ADD A,READ_BYTE+1
DA A
MOV AMOUNT,A
MOV A,AMOUNT+1
ADDC A,READ_BYTE+2
DA A
MOV AMOUNT+1,A
MOV R1,#AMOUNT ;store READING
MOV R4,#0AH ;Starting Address IN EEPROM
MOV R6,#03h ;STORE 2 BYTES
CALL STORE_EEPROM
CALL DELAYS
SETB TBIT1
CALL RESET_BALANCE
RESETX_CHIP:
MOV READ_BYTE,#0AAH ;ERASE AMOUNT
MOV READ_BYTE+1,#0FFH
MOV READ_BYTE+2,#0FFH
MOV R1,#READ_BYTE ;store COUNT
MOV R6,#3 ;STORE 2 BYTES
MOV A,#WTCMD1 ;LOAD WRITE COMMAND
CALL OUTS ;SEND IT
MOV A,#20H ;GET LOW BYTE ADDRESS
CALL OUT ;SEND IT
BBLP: MOV A,@R1 ;GET DATA
CALL OUT ;SEND IT
INC R1 ;INCREMENT DATA POINTER
DJNZ R6,BBLP ;LOOP TILL DONE
CALL STOP ;SEND STOP CONDITION
CALL DELAY
RET
DSP3: CJNE A,#0AAH,DSP4
CALL TITLE6 ; NEW RECHARGE
CALL DELAYS
SETB TBIT1
DSP4: RET
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DELAY:
MOV R6,#0FFH
RE1: MOV R7,#0FFH
RE: NOP
DJNZ R7,RE
DJNZ R6,RE1
RET
;**********************************************************
CARD_READ:
MOV R1,#READ_BYTE ;GET DATA IN BYTES(RAM)
MOV R6,#3 ;NUMBER OF BYTES
MOV A,#WTCMD1 ;LOAD WRITE COMMAND TO SEND ADDRESS
CALL OUTS ;SEND IT
MOV A,#20H ;GET LOW BYTE ADDRESS
CALL OUT ;SEND IT
MOV A,#RDCMD1 ;LOAD READ COMMAND
CALL OUTS ;SEND IT
BXDLP: CALL IN ;READ DATA
MOV @R1,a ;STORE DATA
INC R1 ;INCREMENT DATA POINTER
DJNZ R6,AXLP ;DECREMENT LOOP COUNTER
CALL STOP ;IF DONE, ISSUE STOP CONDITION
RET ;DONE, EXIT ROUTINE
AXLP: CLR SDA1 ;NOT DONE, ISSUE ACK
SETB SCL1
NOP ;NOTE 1
NOP
NOP
NOP ;NOTE 2
NOP
CLR SCL1
JMP BXDLP ;CONTINUE WITH READS
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
; READ DATA FROM EEPROM
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
READ_EEPROM:
MOV A,#WTCMD ;LOAD WRITE COMMAND TO SEND ADDRESS
CALL OUTS ;SEND IT
MOV A,R4 ;GET LOW BYTE ADDRESS
CALL OUT ;SEND IT
MOV A,#RDCMD ;LOAD READ COMMAND
CALL OUTS ;SEND IT
BRDLP: CALL IN ;READ DATA
MOV @R1,a ;STORE DATA
INC R1 ;INCREMENT DATA POINTER
DJNZ R6,AKLP ;DECREMENT LOOP COUNTER
CALL STOP ;IF DONE, ISSUE STOP CONDITION
RET ;DONE, EXIT ROUTINE
AKLP: CLR SDA1 ;NOT DONE, ISSUE ACK
SETB SCL1
NOP ;NOTE 1
NOP
NOP
NOP ;NOTE 2
NOP
CLR SCL1
JMP BRDLP ;CONTINUE WITH READS
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
; STORE DATA IN EEPROM
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
STORE_EEPROM:
MOV A,#WTCMD ;LOAD WRITE COMMAND
CALL OUTS ;SEND IT
MOV A,R4 ;GET LOW BYTE ADDRESS
CALL OUT ;SEND IT
BTLP: MOV A,@R1 ;GET DATA
CALL OUT ;SEND IT
INC R1 ;INCREMENT DATA POINTER
DJNZ R6,BTLP ;LOOP TILL DONE
CALL STOP ;SEND STOP CONDITION
RET
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;##########################################################
; DISPLAY ROUTINES
;##########################################################
TITLE1:
MOV DPTR,#MSAG1
CALL LCD_MSG
RET
MSAG1:
DB 1H,84H,'PREPAID',0C2H,'ENERGY METER',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DISP_READING:
MOV DPTR,#MSAG2
CALL LCD_MSG
RET
MSAG2:
DB 1H,82H,'METER READING',0C6H,00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
AMT_READING:
MOV DPTR,#MSAG3
CALL LCD_MSG
RET
MSAG3:
DB 1H,81H,'BALANCE AMOUNT',0C3H,'Rs.',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
COUNT_READING:
MOV DPTR,#MSAG4
CALL LCD_MSG
RET
MSAG4:
DB 1H,82H,'PULSE COUNT',0C6H,00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
UNIT_PRICE:
MOV DPTR,#MSAG14
CALL LCD_MSG
RET
MSAG14:
DB 1H,83H,'UNIT PRICE',0C4H,'Rs ',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
RECHAGRE:
MOV DPTR,#MSAG5
CALL LCD_MSG
RET
MSAG5:
DB 1H,80H,'Please Recharge',0C2H,'your Account',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TITLE3:
MOV DPTR,#MSAG6
CALL LCD_MSG
RET
MSAG6:
DB 1H,84H,'New Card',0C1H,'** DETECTED **',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TITLE4:
MOV DPTR,#MSAG7
CALL LCD_MSG
RET
MSAG7:
DB 1H,81H,'NEW UNIT PRICE',0C1H,'** STORED **',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TITLE5:
MOV DPTR,#MSAG8
CALL LCD_MSG
RET
MSAG8:
DB 1H,83H,'NEW AMOUNT',0C1H,'** RECHARGED **',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TITLE6:
MOV DPTR,#MSAG9
CALL LCD_MSG
RET
MSAG9:
DB 1H,82H,'INVALID CARD',0C0H,'****************',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SYSTEM_RESET:
MOV DPTR,#MSAG91
CALL LCD_MSG
RET
MSAG91:
DB 1H,80H,'System Restored',0C0H,'****************',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;**********************************************************
; INITIALIZE THE LCD 4-BIT MODE
;**********************************************************
INITLCD4:
CLR LCD_RS ; LCD REGISTER SELECT LINE
CLR LCD_E ; ENABLE LINE
MOV R4, #CONFIG; FUNCTION SET - DATA BITS,
; LINES, FONTS
CALL WRLCDCOM4
MOV R4, #ONDSP ; DISPLAY ON
CALL WRLCDCOM4
MOV R4, #ENTRYMODE ; SET ENTRY MODE
CALL WRLCDCOM4 ; INCREMENT CURSOR RIGHT, NO SHIFT
MOV R4, #CLRDSP; CLEAR DISPLAY, HOME CURSOR
CALL WRLCDCOM4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -