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

📄 pgm.a51

📁 prepaid energy meter project
💻 A51
📖 第 1 页 / 共 3 页
字号:
INCLUDE REG_51.PDF
RB0     EQU     000H    ; Select Register Bank 0
RB1     EQU     008H    ; Select Register Bank 1  ...poke to PSW to use

;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;		PORT DECLERATION
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
SDA1 	EQU 	P2.1  	;SDA=PIN5
SCL1 	EQU 	P2.0		;SCL=PIN6

WTCMD EQU   10100110B       ;WRITE DATA COMMAND Note 3
RDCMD EQU   10100111B       ;READ DATA COMMAND Note 3  

WTCMD1 EQU   10100000B       ;WRITE DATA COMMAND Note 3
RDCMD1 EQU   10100001B       ;READ DATA COMMAND Note 3  

RELAY		EQU	P2.7
BUZZER	EQU	P2.4
; ***LCD CONTROL***
LCD_RS    EQU    P0.0     ;LCD REGISTER SELECT LINE
LCD_E     EQU    P0.1    ;LCD ENABLE LINE
LCD_DB4   EQU    P0.2     ;PORT 1 IS USED FOR DATA
LCD_DB5   EQU    P0.3     ;USED FOR DATA
LCD_DB6   EQU    P0.4    ;FOR DATA
LCD_DB7   EQU    P0.5     ;FOR DATA
; ***CURSOR CONTROL INSTRUCTIONS***

OFFCUR    EQU    0CH
BLINKCUR  EQU    0DH

; ***DISPLAY CONTROL INSTRUCTIONS***

CLRDSP    EQU    01H
ONDSP     EQU    0CH

; ***SYSTEM INSTRUCTIONS***

CONFIG    EQU    28H      ; 4-BIT DATA,2 LINES,5X7 MATRIX LCD
ENTRYMODE EQU    6        ; INCREMENT CURSOR DON'T SHIFT DISPLAY 

DSEG            ; This is internal data memory
ORG     20H     ; Bit adressable memory

FLAGS1:	DS		1
	BCDCARRY	BIT 	FLAGS1.0
	CARRY		BIT 	FLAGS1.1
	TBIT		BIT	FLAGS1.2
	TBIT1		BIT   FLAGS1.3
	
READING:	DS		2
AMOUNT:	DS		3
COUNTER:	DS		2
TEMP:		DS		1
PRICE:	DS		2
BALANCE:	DS		1
BUZZ_COUNT:	DS	1
READ_BYTE:	DS	3
F1:		DS		1
F2:		DS		1
F3:		DS		1

STACK:	DS	1
CSEG            ; Code begins here
         
;  ---------==========----------==========---------=========---------
;  Main routine. Program execution starts here.
;  ---------==========----------==========---------=========---------
		ORG     00H    ; Reset
		AJMP MAIN
		
		ORG 0003H
		PUSH PSW
		PUSH ACC
		MOV PSW,#RB1      	; Select register bank 0
		CALL INC_COUNTER
		POP ACC
		POP PSW
		RETI
;  ---------==========----------==========---------=========---------			
MAIN:	
         MOV SP,#50H
         MOV PSW,#RB0      	; Select register bank 0
         MOV IE,#10000001B
        	CALL RESETLCD4
        	CALL TITLE1
        	CLR BUZZER
        	SETB RELAY
        	CLR TBIT1
        	MOV BUZZ_COUNT,#00H
        	
			CALL READ_COUNTER
			MOV A,COUNTER
			CJNE A,#0FFH,BYPASS
			CALL RESET_READING
			CALL RESET_AMT
			CALL RESET_COUNTER
			CALL RESET_PRICE
			CALL RESET_BALANCE ;RELAY ON/OFF BYTE
			CALL SYSTEM_RESET
			CALL DELAYYS
BYPASS:

			CALL READ_COUNTER
			CALL READ_PRICE
			CALL READ_BALANCE
			
MAINS:	CALL TITLE1
			CALL DELAYY
				
			MOV A,BALANCE
			CJNE A,#00H,FG1
			CLR RELAY
			CALL RECHAGRE
			CALL DELAYY
			SETB BUZZER			
			AJMP MAINS
			
FG1:		SETB RELAY
			MOV A,BUZZ_COUNT			;CHK TO SWITCH OFF THE BUZZER
			CJNE A,#00H,AZX1
			CLR BUZZER
			AJMP AZX2
AZX1:		DEC BUZZ_COUNT			
AZX2:		
			MOV R1,#READING					;GET DATA IN BYTES(RAM)
			MOV R4,#05H						;DATA ADDRESS IN EEPROM
			MOV R6,#2						;NUMBER OF BYTES
			CALL READ_EEPROM			
			CALL DISP_READING
			MOV TEMP,READING
			CALL SEP_DISP
			MOV TEMP,READING+1
			CALL SEP_DISP
			
			CALL DELAYY	
			
			MOV R1,#AMOUNT					;GET DATA IN BYTES(RAM)
			MOV R4,#0AH						;DATA ADDRESS IN EEPROM
			MOV R6,#3						;NUMBER OF BYTES
			CALL READ_EEPROM
			CALL AMT_READING
			MOV TEMP,AMOUNT
			CALL SEP_DISP
			MOV TEMP,AMOUNT+1
			CALL SEP_DISP
			MOV R4,#'.'
         CALL WRLCDDATA
         CALL MDELAY
         MOV TEMP,AMOUNT+2
			CALL SEP_DISP
         
			
			CALL DELAYY		
			MOV R1,#COUNTER					;GET DATA IN BYTES(RAM)
			MOV R4,#0EH						;DATA ADDRESS IN EEPROM
			MOV R6,#2						;NUMBER OF BYTES
			CALL READ_EEPROM			
			CALL COUNT_READING
;			MOV TEMP,COUNTER
;			CALL SEP_DISP
			MOV TEMP,COUNTER+1
			CALL SEP_DISP
			
			CALL DELAYY		
			MOV R1,#PRICE					;GET DATA IN BYTES(RAM)
			MOV R4,#10H						;DATA ADDRESS IN EEPROM
			MOV R6,#2						;NUMBER OF BYTES
			CALL READ_EEPROM			
			
			        
			CALL READ_PRICE	
			CALL UNIT_PRICE
			MOV A,PRICE
			ADD A,#30h
			MOV R4,A
			CALL WRLCDDATA
         CALL MDELAY			
			MOV R4,#'.'
         CALL WRLCDDATA
         CALL MDELAY
			MOV TEMP,PRICE+1
			CALL SEP_DISP
			
			
			
			
			CALL DELAYY	
			AJMP MAINS
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5	
;			INCREMENT COUNTER BY 1
;			IF COUNT=3200 THEN INCREMENT READING
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5	
INC_COUNTER:
			MOV A,COUNTER+1
			ADD A,#01
			DA A
			MOV COUNTER+1,A
			CJNE A,#01H,REPPA1
			AJMP DCV2
REPPA1:	CJNE A,#02H,REPPA2
			AJMP DCV2
REPPA2:	CJNE A,#03H,REPPA3
			AJMP DCV2
REPPA3:	CJNE A,#04H,REPPA4
			AJMP DCV2
REPPA4:	CJNE A,#05H,REPPA
			AJMP DCV2
REPPA:	MOV COUNTER,#00H
		   MOV COUNTER+1,#01H
		   MOV R1,#COUNTER				;store COUNT
			MOV R4,#0EH					;Starting Address IN EEPROM
			MOV R6,#2					;STORE 2 BYTES
			CALL STORE_EEPROM
			CALL DELAY
			AJMP DVB1

DCV2:		MOV R1,#COUNTER				;store COUNT
			MOV R4,#0EH					;Starting Address IN EEPROM
			MOV R6,#2					;STORE 2 BYTES
			CALL STORE_EEPROM
			CALL DELAY
			RET	
							
DVB1:   MOV A,READING+1			;INCREMENT READING BY 1
			ADD A,#01
			DA A
			MOV READING+1,A
			JNC DCS1
			MOV A,READING
			ADD A,#01
			DA A
			MOV READING,A		
DCS1:		MOV R1,#READING			;store READING
			MOV R4,#05H					;Starting Address IN EEPROM
			MOV R6,#2					;STORE 2 BYTES
			CALL STORE_EEPROM
			CALL DELAY
			
			MOV A,AMOUNT+2					;SUBTRACT AMT0 FROM TOTAL0
			CLR C
			SUBB A,PRICE+1
			CALL BCD_CONV
			MOV AMOUNT+2,A
			MOV A,AMOUNT+1					;SUBTRACT AMT1 FROM TOTAL1
			SUBB A,PRICE
			CALL BCD_CONV
			MOV AMOUNT+1,A
			MOV A,AMOUNT					;SUBTRACT AMT2 FROM TOTAL2
			SUBB A,#00h
			CALL BCD_CONV
			MOV AMOUNT,A
						
			MOV R1,#AMOUNT				;store AMOUNT
			MOV R4,#0AH					;Starting Address IN EEPROM
			MOV R6,#3					;STORE 2 BYTES
			CALL STORE_EEPROM
			CALL DELAY		
			
			MOV A,AMOUNT+1
			CJNE A,#40H,FCX1
			MOV BUZZ_COUNT,#02H
			SETB BUZZER
FCX1:		CJNE A,#38H,FAX1
			MOV BUZZ_COUNT,#02H
			SETB BUZZER
FAX1:		CJNE A,#41H,FAAX1
			MOV BUZZ_COUNT,#02H
			SETB BUZZER
FAAX1:	CJNE A,#20H,FCX2
			MOV BUZZ_COUNT,#03H
			SETB BUZZER
FCX2:		CJNE A,#19H,FAX2
			MOV BUZZ_COUNT,#03H
			SETB BUZZER
FAX2:		CJNE A,#21H,FAAX2
			MOV BUZZ_COUNT,#03H
			SETB BUZZER
FAAX2:	CJNE A,#10H,FCX3
			MOV BUZZ_COUNT,#04H
			SETB BUZZER
FCX3:		CJNE A,#11H,FCX4
			MOV BUZZ_COUNT,#04H
			SETB BUZZER
FCX4:		CJNE A,#09H,FAX4
			MOV BUZZ_COUNT,#04H
			SETB BUZZER
FAX4:					
			
			MOV A,AMOUNT+2					;SUBTRACT AMT0 FROM TOTAL0
			CLR C
			SUBB A,PRICE+1
			CALL BCD_CONV
			MOV A,AMOUNT+1					;SUBTRACT AMT1 FROM TOTAL1
			SUBB A,PRICE
			MOV A,AMOUNT
			CLR TBIT
			JNC POP1
			
			SETB TBIT
POP1:		CJNE A,#00H,BACK
			JNB TBIT, BACK		
			MOV BALANCE,#00H
			MOV R1,#BALANCE				;store COUNT
			MOV R4,#15H					;Starting Address IN EEPROM
			MOV R6,#1					;STORE 2 BYTES
			CALL STORE_EEPROM
			CALL DELAY
			CLR RELAY
			SETB BUZZER
BACK:		RET
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
BCD_CONV:			
			CLR BCDCARRY
			CLR CARRY
			JNC LOP2
			SETB CARRY
LOP2:		JNB AC,LOP1
			SETB BCDCARRY
			CLR C
			SUBB A,#06H			
LOP1:		JNB CARRY,LOP3
			CLR C
			SUBB A,#60H
LOP3:		CLR C
			JNB CARRY,LOP4
			SETB C
LOP4:		RET
;#################################################
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5	
;			READ PULSE COUNTER FROM MEMORY
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5						
READ_BALANCE:
			MOV R1,#BALANCE					;GET DATA IN BYTES(RAM)
			MOV R4,#15H						;DATA ADDRESS IN EEPROM
			MOV R6,#1						;NUMBER OF BYTES
			CALL READ_EEPROM		
			RET
READ_COUNTER:
			MOV R1,#COUNTER					;GET DATA IN BYTES(RAM)
			MOV R4,#0EH						;DATA ADDRESS IN EEPROM
			MOV R6,#2						;NUMBER OF BYTES
			CALL READ_EEPROM		
			RET
READ_PRICE:
			MOV R1,#PRICE					;GET DATA IN BYTES(RAM)
			MOV R4,#10H						;DATA ADDRESS IN EEPROM
			MOV R6,#2						;NUMBER OF BYTES
			CALL READ_EEPROM		
			RET
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5		
SEP_DISP1:
			MOV A,AMOUNT
			ANL A,#0F0H
			SWAP A
			CJNE A,#00H,DAP1
			MOV A,AMOUNT
			ANL A,#0FH
			AJMP DAP3
			
DAP1:		ADD A,#30H			;BOTH NOT EQUAL TO ZERO
			MOV R4,A
         CALL WRLCDDATA
         CALL MDELAY
DAP2:		MOV A,AMOUNT
			ANL A,#0FH
			ADD A,#30H
			MOV R4,A
         CALL WRLCDDATA
         CALL MDELAY
DAP4:    MOV A,AMOUNT+1
			ANL A,#0F0H
			SWAP A
			ADD A,#30H
			MOV R4,A
         CALL WRLCDDATA
         CALL MDELAY
DAP5:    MOV A,AMOUNT+1

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -