📄 constant.asm
字号:
;--------------------------------------
;计算并写入表的分辨率
;入口:DPH(通道号1-16)
;;--------------------------------------
COMPUTE_RESOLUTION:
DIV_100: MOV R2,#00
MOV R3,#00
MOV 06H,#00
MOV 07H,#100
DIV_FOR_RESOLUTION:
LCALL NDIV
MOV R6,03H ;余数送R6
MOV A,DPH
DEC A
ADD A,#RAM_RESOLUTION_0
MOV R0,A
MOV @R0,05H ;电表0.01度分辨率写C04
MOV B,R5
MOV R7,DPH
MOV DPH,#C04_ADDR_L
MOV A,R7
DEC A
ADD A,#C04_RESOLUTION_0
MOV DPL,A
LCALL WR_C04_1BYTE
MOV DPH,R7
COMPUTE_COMPENSATE:
MOV A,06H
MOV B,#10 ;余数除以10得到0.1度电的脉冲补偿数
DIV AB
MOV B,A
MOV A,DPH
DEC A
ADD A,#RAM_PULSE_COMPENSATE_0
MOV R0,A
MOV @R0,B
MOV R7,DPH
MOV DPH,#C04_ADDR_L
MOV A,R7
DEC A
ADD A,#C04_PULSE_COMPENSATE_0
MOV DPL,A
LCALL WR_C04_1BYTE
WRITE_METER_TYPE:
MOV A,R5 ;电表分辨率送A寄存器
MOV B,#08H ;8送B寄存器
DIV AB ;分辨率除以8,能整除的为电子表,不能整除的为机械表
MOV A,B ;余数送A
CJNE A,#00H,IS_DS_METER ;余数不为0是机械表
IS_DDS_METER:
MOV B,#01H ;为0,是电子表,写电子表类型标记
AJMP WRITE_METER_TYPE_TO_C04
IS_DS_METER:
MOV B,#00H ;为1,是机械表,写机械表类型标记
WRITE_METER_TYPE_TO_C04:
MOV DPH,#C04_ADDR_H
MOV A,R7
DEC A
ADD A,#DDS_MAK1 ;标记首地址
MOV DPL,A
LCALL WR_C04_1BYTE
RET
;--------------------------------------
;整数除法(R2R3R4R5)/(R6R7)=(R4R5),余数为(R2R3)
;;--------------------------------------
NDIV: MOV A,R3
CLR A
SUBB A,R7
MOV A,R2
SUBB A,R6
JNC NDVE1
MOV B,#16
NDVL1: CLR C
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
XCH A,R2
RLC A
XCH A,R2
MOV F0,C
CLR C
SUBB A,R7
MOV R1,A
MOV A,R2
SUBB A,R6
JB F0,NDVM1
JC NDVD1
NDVM1: MOV R2,A
MOV A,R1
MOV R3,A
INC R5
NDVD1: DJNZ B,NDVL1
CLR F0
RET
NDVE1: SETB F0
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -