📄 pgm.a51
字号:
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 + -