Prepaid energy meter
RB0 EQU 000H RB1 EQU 008H SDA1 EQU P2.1 SCL1 EQU P2.0 WTCMD EQU 10100110B RDCMD EQU 10100111B WTCMD1 EQU 10100000B RDCMD1 EQU 10100001B RELAY EQU P2.7 BUZZER EQU P2.4 LCD_RS EQU P0.0 LCD_E EQU P0.1 LCD_DB4 EQU P0.2 LCD_DB5 EQU P0.3 LCD_DB6 EQU P0.4 LCD_DB7 EQU P0.5 OFFCUR EQU 0CH BLINKCUR EQU 0DH CLRDSP EQU 01H ONDSP EQU 0CH CONFIG EQU 28H ENTRYMODE EQU 6 DSEG ORG 0020H 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 ORG 00H AJMP MAIN ORG 0003H PUSH PSW PUSH ACC MOV PSW,#RB1 CALL INC_COUNTER POP ACC POP PSW RETI MAIN: MOV SP,#50H MOV PSW,#RB0 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 CALL SYSTEM_RESET CALL DELAYS
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 RECHARGE CALL DELAYY SETB BUZZER AJMP MAINS FG1: SETB RELAY MOV A,BUZZ_COUNT CJNE A,#00H,AZX1 CLR BUZZER AJMP AZX2 AZX1: DEC BUZZ_COUNT AZX2: MOV R1,#READING BYTESRAM: MOV R4,#05H EEPROM: MOV R6,#2 CALL READ_EEPROM CALL DISP_READING MOV TEMP,READING CALL SEP_DISP MOV TEMP,READING+1 CALL SEP_DISP CALL DELAYY MOV R1,#AMOUNT
MOV R4,#0AH
MOV R6,#3 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
MOV R4,#0EH
MOV R6,#2 CALL READ_EEPROM CALL COUNT_READING ; MOV TEMP,COUNTER ; CALL SEP_DISP MOV TEMP,COUNTER+1 CALL SEP_DISP CALL DELAYY MOV R1,#PRICE
MOV R4,#10H
MOV R6,#2 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 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 MOV R4,#0EH MOV R6,#2 CALL STORE_EEPROM CALL DELAY AJMP DVB1 DCV2: MOV R1,#COUNTER MOV R4,#0EH MOV R6,#2 CALL STORE_EEPROM CALL DELAY RET DVB1: MOV A,READING+1 ADD A,#01H DA A MOV READING+1,A JNC DCS1 MOV A,READING ADD A,#01 DA A MOV READING,A DCS1: MOV R1,#READING MOV R4,#05H MOV R6,#2 CALL STORE_EEPROM CALL DELAY MOV A,AMOUNT+2 TOTAL0: CLR C SUBB A,PRICE+1 CALL BCD_CONV MOV AMOUNT+2,A MOV A,AMOUNT+1 TOTAL1: SUBB A,PRICE CALL BCD_CONV MOV AMOUNT+1,A MOV A,AMOUNT TOTAL2: SUBB A,#00H CALL BCD_CONV MOV AMOUNT,A MOV R1,#AMOUNT MOV R4,#0AH MOV R6,#3 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
CLR C SUBB A,PRICE+1 CALL BCD_CONV MOV A,AMOUNT+1
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 MOV R4,#15H MOV R6,#1 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 READ_BALANCE: MOV R1,#BALANCE
MOV R4,#15H
MOV R6,#1 CALL READ_EEPROM RET READ_COUNTER: MOV R1,#COUNTER
MOV R6,#2 CALL READ_EEPROM RET READ_PRICE: MOV R1,#PRICE
MOV R6,#2 CALL READ_EEPROM RET SET_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 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