📄 counter.asm
字号:
;--------------------------------------
;计度器增加程序
;--------------------------------------
METER_COUNTER_INC_1_16:
MOV R7,#1 ;
METER_COUNTER_INC:
CPL WATCH_DOG ;清看门狗
MOV A,#RAM_PULSE_COMPENSATE_0 ;R6脉冲补偿数地址
ADD A,R7
DEC A
MOV R6,A
MOV A,#RAM_TO_0DOT1_FLAG_0 ;R5满0.1度电标志地址
ADD A,R7
DEC A
MOV R5,A
MOV A,#RAM_PULSES1_0 ;R4脉冲存储地址
ADD A,R7
DEC A
MOV R4,A
MOV A,#RAM_RESOLUTION_0 ;R3分辨率地址
ADD A,R7
DEC A
MOV R3,A
MOV A,#RAM_COUNTER_DECIMAL_0 ;R2计度器小数部分地址
ADD A,R7
DEC A
MOV R2,A
MOV A,#RAM_0DOT01_COUNTER_0 ;R1计度器0.01计数器地址
ADD A,R7
DEC A
MOV R1,A
MOV R0,06H
MOV A,@R0
CJNE A,#00H,REPAR_PULSE ;补偿数不为0需要补偿
AJMP COUNT_ENERGY ;补偿数为0不需要补偿
REPAR_PULSE:
MOV R0,05H
MOV A,@R0
CJNE A,#55H,COUNT_ENERGY ;满0.1度电否?
MOV R0,04H
MOV A,@R0
CLR C
MOV R0,06H
MOV A,@R0
MOV B,A
MOV R0,04H
MOV A,@R0
SUBB A,B
JNC COMPENSATE_DEC_BEG
LJMP NO_COUNTER_INC
COMPENSATE_DEC_BEG:
MOV R0,06H
MOV B,@R0
COMPENSATE_DEC:
MOV R0,04H
DEC @R0
CPL WATCH_DOG ;清看门狗
DJNZ B,COMPENSATE_DEC ;--
MOV B,R7
PUSH 01H
MOV R1,#0
MOV R0,#0
SETB C
CTER_PUL_SET_CON:
MOV A,R0
RLC A
MOV R0,A
MOV A,R1
RLC A
MOV R1,A
DJNZ B,CTER_PUL_SET_CON
MOV A,R1
ORL RAM_TO_C04_AGA_8_15,A
MOV A,R0
ORL RAM_TO_C04_AGA_0_7,A
POP 01H
MOV R0,05H
MOV @R0,#00H
COUNT_ENERGY: ;--计算电量
CPL WATCH_DOG ;清看门狗
MOV R0,03H
MOV A,@R0
JNZ CMP_PULSE ;--分辩率不为0才能进行电量计算
CLR EA ;关中断
SJMP $ ;分辩率为0内部RAM已乱须重新复位
CMP_PULSE:
MOV R0,04H
MOV A,@R0
MOV R0,03H
MOV B,@R0
CJNE A,B,PULSE_NOT_EQUAL
SJMP DEC_RESOLUTION ;--RAM 中脉冲记数=分辩率
PULSE_NOT_EQUAL: ;--
JNC DEC_RESOLUTION ;--RAM 中脉冲记数<分辩率,电量不增加
LJMP NO_COUNTER_INC ;--RAM 中脉冲记数<分辩率,电量不增加
DEC_RESOLUTION: NOP ;--RAM 中脉冲记数>分辩率
NOP
PULSE_DEC:
MOV R0,04H
DEC @R0
DJNZ B,PULSE_DEC ;--
MOV R0,02H
INC @R0
INC @R1
MOV A,@R1
CLR C
SUBB A,#10
JC DECIMAL_COMPUTE ;--0.01度电计数器值<10转
MOV @R1,#00H
MOV R0,05H
MOV @R0,#55H
DECIMAL_COMPUTE:
MOV R0,02H
MOV A,@R0
CLR C
SUBB A,#100
JC NO_COUNTER_INC1 ;计度器整数部分+1 ?
MOV R0,02H
MOV @R0,#00H
LCALL COUNTER_INTEGER_INC ;计度器整数部分存入24C04
NO_COUNTER_INC1:
;//04-03-31 存储小数位
MOV DPH,#C04_ADDR_L
MOV A,R7
DEC A
ADD A,#C04_COUNTER_DECIMAL_0 ;当前电量小数存储器地址
MOV DPL,A
MOV R0,02H
MOV B,@R0
LCALL WR_C04_1BYTE
MOV DPH,#C04_ADDR_L
MOV A,R7
DEC A
ADD A,#C04_0DOT01_COUNTER_0 ;存0.01度电计数器
MOV DPL,A
MOV R0,01H
MOV B,@R0
LCALL WR_C04_1BYTE
MOV DPH,#C04_ADDR_L
MOV A,R7
DEC A
ADD A,#C04_TO_0DOT1_FLAG_0 ;存0.1度电到标志
MOV DPL,A
MOV R0,05H
MOV B,@R0
LCALL WR_C04_1BYTE
AJMP METER_COUNTER_INC
NO_COUNTER_INC:
MOV DPH,#C04_ADDR_L
MOV A,R7
DEC A
ADD A,#C04_PULSES1_0 ;存当前脉冲数
MOV DPL,A
MOV R0,04H
MOV B,@R0
LCALL WR_C04_1BYTE
SAVE_OVER:
CPL WATCH_DOG
INC R7
MOV A,R7
CJNE A,#17,TO_NEXT_COUNTER_INC
SJMP COUNTER_INC_EXIT
TO_NEXT_COUNTER_INC:
CLR C
SUBB A,#17
JNC COUNTER_INC_EXIT
TO_NEXT_COUNTER_INC1:
LJMP METER_COUNTER_INC
COUNTER_INC_EXIT:
MOV R7,#00H
RET
;--------------------------------------
;计度器整数部分+1
;入口:R7(通道数=1-16)
;占用:R0,A,R1,R2,DPTR,B
;--------------------------------------
COUNTER_INTEGER_INC:
MOV R0,#PUBLIC_COUNTER_INTEGER_0 ;当前电量整数位首地址
MOV A,R7
DEC A
MOV B,#3
MUL AB
ADD A,#C04_COUNTER_INTEGER_0 ;当前表当前电量的整数首字节
MOV DPL,A
MOV DPH,#C04_ADDR_L ;存储器低位
LCALL RD_C04_1BYTE
MOV @R0,B ;第一字节送发送缓冲区
INC R0
INC DPL ;下一字节
LCALL RD_C04_1BYTE
MOV @R0,B ;第二字节送发送缓冲区
INC R0
INC DPL ;下一字节
LCALL RD_C04_1BYTE
MOV @R0,B ;第三字节送发送缓冲区
;计算整数+1
; CLR C
MOV R0,#PUBLIC_COUNTER_INTEGER_0 ;当前电量整数位首地址
MOV A,@R0
ADD A,#01H ;整数加1
MOV @R0,A
INC R0
MOV A,@R0
ADDC A,#00H
MOV @R0,A
INC R0
MOV A,@R0
ADDC A,#00H
MOV @R0,A
;-------------------------------检测到满度否
MOV A,R7
CMP_CYCLE1:
CJNE A,#1,CMP_CYCLE2
PUSH 01H
PUSH 02H
MOV R2,#METER_CYCLE_1_2
MOV R1,#METER_CYCLE_1_1
MOV B,#METER_CYCLE_1_0
LCALL CMP_CYCLE
POP 02H
POP 01H
LJMP WRITE_COUNTER_INTEGER
CMP_CYCLE2: CJNE A,#2,CMP_CYCLE3
PUSH 01H
PUSH 02H
MOV R2,#METER_CYCLE_2_2
MOV R1,#METER_CYCLE_2_1
MOV B,#METER_CYCLE_2_0
LCALL CMP_CYCLE
POP 02H
POP 01H
LJMP WRITE_COUNTER_INTEGER
CMP_CYCLE3: CJNE A,#3,CMP_CYCLE4
PUSH 01H
PUSH 02H
MOV R2,#METER_CYCLE_3_2
MOV R1,#METER_CYCLE_3_1
MOV B,#METER_CYCLE_3_0
LCALL CMP_CYCLE
POP 02H
POP 01H
LJMP WRITE_COUNTER_INTEGER
CMP_CYCLE4: CJNE A,#4,CMP_CYCLE5
PUSH 01H
PUSH 02H
MOV R2,#METER_CYCLE_4_2
MOV R1,#METER_CYCLE_4_1
MOV B,#METER_CYCLE_4_0
LCALL CMP_CYCLE
POP 02H
POP 01H
LJMP WRITE_COUNTER_INTEGER
CMP_CYCLE5: CJNE A,#5,CMP_CYCLE6
PUSH 01H
PUSH 02H
MOV R2,#METER_CYCLE_5_2
MOV R1,#METER_CYCLE_5_1
MOV B,#METER_CYCLE_5_0
LCALL CMP_CYCLE
POP 02H
POP 01H
LJMP WRITE_COUNTER_INTEGER
CMP_CYCLE6: CJNE A,#6,CMP_CYCLE7
PUSH 01H
PUSH 02H
MOV R2,#METER_CYCLE_6_2
MOV R1,#METER_CYCLE_6_1
MOV B,#METER_CYCLE_6_0
LCALL CMP_CYCLE
POP 02H
POP 01H
LJMP WRITE_COUNTER_INTEGER
CMP_CYCLE7: CJNE A,#7,CMP_CYCLE8
PUSH 01H
PUSH 02H
MOV R2,#METER_CYCLE_7_2
MOV R1,#METER_CYCLE_7_1
MOV B,#METER_CYCLE_7_0
LCALL CMP_CYCLE
POP 02H
POP 01H
LJMP WRITE_COUNTER_INTEGER
CMP_CYCLE8: CJNE A,#8,CMP_CYCLE9
PUSH 01H
PUSH 02H
MOV R2,#METER_CYCLE_8_2
MOV R1,#METER_CYCLE_8_1
MOV B,#METER_CYCLE_8_0
LCALL CMP_CYCLE
POP 02H
POP 01H
LJMP WRITE_COUNTER_INTEGER
CMP_CYCLE9: CJNE A,#9,CMP_CYCLE10
PUSH 01H
PUSH 02H
MOV R2,#METER_CYCLE_9_2
MOV R1,#METER_CYCLE_9_1
MOV B,#METER_CYCLE_9_0
LCALL CMP_CYCLE
POP 02H
POP 01H
LJMP WRITE_COUNTER_INTEGER
CMP_CYCLE10: CJNE A,#10,CMP_CYCLE11
PUSH 01H
PUSH 02H
MOV R2,#METER_CYCLE_10_2
MOV R1,#METER_CYCLE_10_1
MOV B,#METER_CYCLE_10_0
LCALL CMP_CYCLE
POP 02H
POP 01H
LJMP WRITE_COUNTER_INTEGER
CMP_CYCLE11: CJNE A,#11,CMP_CYCLE12
PUSH 01H
PUSH 02H
MOV R2,#METER_CYCLE_11_2
MOV R1,#METER_CYCLE_11_1
MOV B,#METER_CYCLE_11_0
LCALL CMP_CYCLE
POP 02H
POP 01H
LJMP WRITE_COUNTER_INTEGER
CMP_CYCLE12: CJNE A,#12,CMP_CYCLE13
PUSH 01H
PUSH 02H
MOV R2,#METER_CYCLE_12_2
MOV R1,#METER_CYCLE_12_1
MOV B,#METER_CYCLE_12_0
LCALL CMP_CYCLE
POP 02H
POP 01H
LJMP WRITE_COUNTER_INTEGER
CMP_CYCLE13: CJNE A,#13,CMP_CYCLE14
PUSH 01H
PUSH 02H
MOV R2,#METER_CYCLE_13_2
MOV R1,#METER_CYCLE_13_1
MOV B,#METER_CYCLE_13_0
LCALL CMP_CYCLE
POP 02H
POP 01H
LJMP WRITE_COUNTER_INTEGER
CMP_CYCLE14: CJNE A,#14,CMP_CYCLE15
PUSH 01H
PUSH 02H
MOV R2,#METER_CYCLE_14_2
MOV R1,#METER_CYCLE_14_1
MOV B,#METER_CYCLE_14_0
LCALL CMP_CYCLE
POP 02H
POP 01H
LJMP WRITE_COUNTER_INTEGER
CMP_CYCLE15: CJNE A,#15,CMP_CYCLE16
PUSH 01H
PUSH 02H
MOV R2,#METER_CYCLE_15_2
MOV R1,#METER_CYCLE_15_1
MOV B,#METER_CYCLE_15_0
LCALL CMP_CYCLE
POP 02H
POP 01H
LJMP WRITE_COUNTER_INTEGER
CMP_CYCLE16: CJNE A,#16,CMP_CYCLE17
PUSH 01H
PUSH 02H
MOV R2,#METER_CYCLE_16_2
MOV R1,#METER_CYCLE_16_1
MOV B,#METER_CYCLE_16_0
LCALL CMP_CYCLE
POP 02H
POP 01H
LJMP WRITE_COUNTER_INTEGER
CMP_CYCLE17: RET
;///2004-03-26,存储当前电量整数
WRITE_COUNTER_INTEGER:
MOV R0,#PUBLIC_COUNTER_INTEGER_0 ;当前电量整数位首地址
MOV A,R7
DEC A
MOV B,#3
MUL AB
ADD A,#C04_COUNTER_INTEGER_0 ;当前表当前电量的整数首字节
MOV DPL,A
MOV DPH,#C04_ADDR_L ;存储器低位
MOV B,@R0
INC R0
LCALL WR_C04_1BYTE ;第1字节写入存储器
MOV B,@R0
INC R0
MOV DPH,#C04_ADDR_L ;存储器低位
INC DPL ;
LCALL WR_C04_1BYTE ;第2字节写入存储器
MOV B,@R0
INC DPL
MOV DPH,#C04_ADDR_L ;存储器低位
LCALL WR_C04_1BYTE ;第3字节写入存储器
RET
;-------------------------------------------------------------
;--计度器的满刻度比较程序
;----------------------------------
;--入口:R0(#RAM_COUNTER_INTEGER+2),R2(#METER_CYCLE_2),
;-- R1(#METER_CYCLE_1),B(#METER_CYCLE_0)
;--占用:A
;-------------------------------------------------------------
CMP_CYCLE:
MOV A,@R0
CJNE A,02H,CMP_100000_2
SJMP CMP_100000_1
CMP_100000_2: JC SAVE_INTEGER_210
CMP_100000_2_OUT:
CLR A
MOV @R0,A ;当前电量清0,与电表计度器示值一致
DEC R0
MOV @R0,A
DEC R0
MOV @R0,A
SJMP SAVE_INTEGER_210
CMP_100000_1:
DEC R0
MOV A,@R0
CJNE A,01H,CMP_100000_1_0
SJMP CMP_100000_0
CMP_100000_1_0: JC SAVE_INTEGER_210
CMP_100000_1_OUT:
INC R0
SJMP CMP_100000_2_OUT
CMP_100000_0:
DEC R0
MOV A,@R0
CJNE A,B,CMP_100000_0_0
INC R0
INC R0
SJMP CMP_100000_2_OUT
CMP_100000_0_0: JC SAVE_INTEGER_210
INC R0
INC R0
SJMP CMP_100000_2_OUT
SAVE_INTEGER_210:
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -