⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pgm.a51

📁 prepaid energy meter project
💻 A51
📖 第 1 页 / 共 3 页
字号:
			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 + -