📄 hldmsapp.asm
字号:
CLR HWR1_FRAM_ALL
AJMP WR_COM
ON_CHECK1: AJMP ON_CHECK
DELSNO:
MOV 69H, ADDR_DATARE
MOV B,#1 ;; 需读数量标识
MOV R2,#ADDR_SNONUMXX ;; 读24C02 的地址
MOV R0,#ADDR_DATARE ;; 读出数据保存的地址
MOV R1,#RD1_COM ;; 读命令字 RD1_COM
LCALL RD_X
mov A,@R0
CJNE A, #'K', N_OK111
MOV ADDR_DATARE,69H
AJMP YES_OKK
N_OK111: MOV B,#1 ;; 需读数量标识
MOV R2,ADDR_SNONUMYY ;; 读24C02 的地址
MOV R0, #ADDR_DATARE ;; 读出数据保存的地址
MOV R1,#RD1_COM ;; 读命令字 RD1_COM
LCALL RD_X
mov A,@R0
CJNE A, #'K', WRBS_ERROR1C ;; N_OK222
MOV ADDR_DATARE,69H
YES_OKK: MOV R0,#ADDR_DATARE+15
MOV R2,#6
DELLOP: MOV A, @R0 ; 删除表号
CLR C
SUBB A, #33H ; 做减 33H 的处理
MOV @R0, A
INC R0
DJNZ R2, DELLOP
MOV R2,#6
MOV R0,#ADDR_DATARE+15
CMP1X: MOV A,@R0
INC R0
CJNE A,#99H,CMPDEL ; 不允许全 9
DJNZ R2,CMP1X
AJMP WRBS_ERROR
CMPDEL: MOV R0,#ADDR_DATARE+15 ;删除表号
MOV B,#6
DELSNO1: MOV A,@R0
JZ DELSNO1A
AJMP REPSNO ;; 有一位不为0 跳转 进行替换
WRBS_ERROR: MOV ADDR_DATATRB,#0C4H
WRBS_ERRORA: MOV ADDR_DATATRB+2,#34H
WRBS_ERROR1A: MOV ADDR_DATATRB+1,#01H
MOV 1FH,#3
MOV R1,#ADDR_DATARE
MOV R0,#ADDR_DATARE-6
MOV B,#6
ACALL RDNOW_COM
LCALL SENDDATA1
ret
WRBS_ERROR1C: MOV ADDR_DATATRB+2,#34H
MOV ADDR_DATATRB,#0C4H
AJMP WRBS_ERROR1A
;WDATASTDD: AJMP WDATAST
DELSNO1A: INC R0
DJNZ B,DELSNO1
SETB P3.3 ;; 设置键重恢复
MOV C,P3.3 ; 检查是否允许删除
JNC WDATASTCC
AJMP WDATASTDD
WDATASTCC: CLR WDI
NOP
NOP
SETB WDI
MOV R0,#24H ; // 6位全为 0 进行删除
MOV B,#1
MOV R1,#RD1_COM
MOV R2,#ADDR_SNONUM
LCALL RD_X
MOV A,24H
anl a,#1fh
MOV 6CH,A
JZ WRBS_ERROR1C ; 表号已为0,不再删除,返回表号为0错误帧
MOV B,SNO_NUM ;SNO_NUM(7FH)为收到的表号在2402中排列的序号
INC b
mov a,b ; 4
mov a,#16
clr c
subb a,sno_num
jz cont1
DELSNO2: mov a,6ch
dec a
mov b,#16
mul ab
add a,#addr1_sno ; 24C02中 表号 1 的地址 00
MOV R2,a
MOV B,#6
MOV R0,#60H
MOV R1,#RD1_COM ;RD1_COM 为24c02 读命令字 A1
LCALL RD_X
MOV A,SNO_NUM
MOV B,#16
MUL AB
MOV 7DH,A
ADD A,#ADDR1_SNO
MOV R2,A
MOV B,#6
MOV R0,#60H
MOV R1,#WR1_COM
; nop
; nop
; nop
; nop
CLR WDI
; NOP
NOP
SETB WDI
jNb hwr1_FRAM_ALL,RET2
CLR ROM_WP
LCALL WR_CMP
CONT1: MOV R0, #ADDR_DATARE+15 ;; 删除旧表号
MOV R2, #6
N_OK_LPD: MOV @R0, #0
INC R0
DJNZ R2, N_OK_LPD ;; 清0
MOV ADDR_DATARE+7, #04H ;; 写允许
mov a,6ch
DEC A
mov b,#16
mul ab
N_OK_LP1D: MOV R2, A ; 要清表号的地址
MOV R0, #ADDR_DATARE+15 ; 要写0的存储地址
MOV B, #6 ; 要写的个数
MOV R1,#WR1_COM ; 写命令字 WR_COM
setb wr_bit
CLR ROM_WP
LCALL WR_CMP
DEC 6CH ;; 表号数量减1
MOV R0,#6CH
MOV R2,#ADDR_SNONUM
MOV R1,#WR1_COM
MOV B,#1
nop
; nop
; nop
nop
jNb hwr1_FRAM_ALL,RET2
CLR ROM_WP
LCALL WR_CMP
mov addr_datare+7,#0
CLR HWR1_FRAM_ALL
WR_COM: MOV R1,#ADDR_DATARE
MOV R0,#ADDR_DATARE-6
MOV B,#6
ACALL RDNOW_COM
WR_COM1: MOV 1FH,#02
MOV ADDR_DATATRB+1,#00
MOV ADDR_DATATRB,#84H
LCALL SENDDATA1
NOP
NOP
RET
CONT: MOV A,6FH
ADD A,#16
AJMP DELSNO2
ret2: NOP
nop
RET
SETB WDI
clr ea
ajmp $
TJLOP4X: AJMP WRBS_ERROR
REPSNO: MOV R0, #ADDR_DATARE+15
MOV R2, #6H
REPLOP: MOV A, @R0
CLR C
CJNE A, #99H, TJLOP2X
AJMP TJLOP3X
TJLOP2X: JNC TJLOP4X
TJLOP3X: ANL A, #0FH
CLR C
CJNE A, #9H, TJLOP5X
AJMP TJLOP6X
TJLOP5X: JNC TJLOP2X
TJLOP6X: DJNZ R2, REPLOP
COMPENDa: MOV ADDR_DATARE, ADDR_DATARE+15
MOV ADDR_DATARE+1, ADDR_DATARE+16
MOV ADDR_DATARE+2, ADDR_DATARE+17
MOV ADDR_DATARE+3, ADDR_DATARE+18
MOV ADDR_DATARE+4, ADDR_DATARE+19
MOV ADDR_DATARE+5, ADDR_DATARE+20
LCALL ADDR_CMP ;;/ 比较是否有相同的表号
MOV ADDR_DATARE, DPL
MOV ADDR_DATARE+1, DPH
MOV ADDR_DATARE+2, 23H
MOV ADDR_DATARE+3, ADDR_DATARE-3
MOV ADDR_DATARE+4, ADDR_DATARE-2
MOV ADDR_DATARE+5, ADDR_DATARE-1
JC TADD1
AJMP WRBS_ERRORZ
WDATASTEE: ;JNC WDSTR
LJMP WDATASTDD
TADD1: CLR WDI
SETB WDI
SETB P3.3 ;; 设置键重恢复
MOV C,P3.3 ; 检查是否允许删除
JC WDATASTEE
MOV A,SNO_NUM ;替换表号
MOV B,#16
MUL AB
ADD A,#ADDR1_SNO
MOV R2,A ; R2 存数据在24C02 中的存储地址
MOV R0,#ADDR_DATARE+15 ; 要写数据在RAM中的地址 ********????TTTTTT
MOV B,#6
MOV R1,#WR1_COM
; nop
; nop
nop
nop
jNb hwr1_FRAM_ALL,RET2
; CLR P3.3 ;; 设置写允许键
CLR ROM_WP
LCALL WR_CMP
; SETB P3.3 ;; 设置键重恢复
mov addr_datare+7,#0
CLR HWR1_FRAM_ALL
AJMP WR_COM
AJMP WR_COM
ON_CHECK: CJNE A,#6AH,WR_PA1
AJMP ON_CHECK3
WR_PA1: AJMP WR_PA
ON_CHECK3: ANL DPL,#1FH
MOV ADDR_DATARE,DPL
MOV R2,#ADDR_SNONUM
MOV B,#1
MOV R0,#ADDR_DATARE
MOV R1,#WR1_COM
setb wr_bit
jNb hwr1_FRAM_ALL,RET3
CLR ROM_WP
LCALL WR_CMP
mov addr_datare+7,#0
CLR HWR1_fram_all
CLR P1.0
CLR P1.1
MOV TH0,#00
MOV TL0,#00
ret
ret3: NOP
NOP
SETB WDI
clr ea
ajmp $
WRBS_ERROR2: AJMP WRBS_ERROR
WR_PA: CJNE A,#6BH,DO_RELAY
MOV R2,#ADDR1_SNO+8
MOV R0,#ADDR_DATARE+11
MOV B,#3
MOV R1,#WR1_COM
nop
nop
nop
jNb hwr1_FRAM_ALL,RET3
CLR ROM_WP
LCALL WR_CMP
mov addr_datare+7,#0
clr hwr1_fram_all
LJMP WR_COM
WRBS_ERROR1B: MOV ADDR_DATATRB+2,#08H
MOV ADDR_DATATRB,#0C4H
AJMP WRBS_ERROR
DO_RELAY: CJNE A,#68H,WRBS_ERROR2
MOV A, ADDR_DATARE+11
MOV A,ADDR_DATARE+2
JB F0,WRBS_ERROR1B
LJMP WR_COM
//....................>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
/////////////////////<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;载波处理模块
ZB_SEND_DOWNA: MOV R0, #ADDR_DATARE
MOV R1, #ADDR_DATARE+7
MOV R2, ADDR_DATARE+8
INC R2
INC R2
WNALOP: MOV A, @R1
MOV @R0,A
INC R0
INC R1
DJNZ R2, WNALOP
MOV A, ADDR_DATARE
LJMP ZB_SEND_DOWN
ZB_SEND_UPA: MOV R0, #ADDR_DATARE
MOV R1, #ADDR_DATARE+7
MOV R2, ADDR_DATARE+8
INC R2
INC R2
UPALOP: MOV A, @R1
MOV @R0,A
INC R0
INC R1
DJNZ R2, UPALOP
MOV A, ADDR_DATARE
LJMP ZB_SEND_UP
ZB_DEAL: CLR ZBR_FRAM_ALL
MOV R2,#3
MOV R0,#ADDR_DATARE-6
ZB_CMP1: MOV A,@R0 ; 载波地址为广播地址吗?为真,跳到广播校时;为假判断是否为本抄表器
; 所管理的表号
INC R0
CJNE A,#99H,ZB_CMP
DJNZ R2,ZB_CMP1
MOV A, ADDR_DATARE+7
CJNE a,#08h,ret5
LJMP ZB_T_CHE_ALL
ZB_CMP: MOV DPL,ADDR_DATARE-6 ;保存表号
MOV DPH,ADDR_DATARE-5
MOV 23H,ADDR_DATARE-4
LCALL ADDR_CMPB
JNC ZB_DEALA
ret5: AJMP MAIN_LOOP
ZB_DEALA: MOV A,ADDR_DATARE+7
JB ACC.7,ZB_SEND_UPA ;向上转发应答帧
JB ACC.6,ZB_SEND_DOWNA ;向下转发命
MOV 11H,ADDR_DATARE+11 ;保存集中器的地址 BB BB BB
MOV 13H,ADDR_DATARE+12
MOV 14H,ADDR_DATARE+13
MOV 24H,ADDR_DATARE+9 ;保存标识符
MOV 7EH,ADDR_DATARE+10
AJMP ZB_RD
ZB_RDBS_ERROR1A: MOV A,#80H
ZB_WR_ERROR1aa: MOV ADDR_DATATR+3,#0c1H
ZB_RDBS_ERROR1D:MOV A,#01H
LJMP ZB_ERROR1AXX
ZB_RD: MOV A,ADDR_DATARE+7
CJNE A,#01H,ZBYYY ;; 控制码 C =01 读数据
AJMP ZXXX
ZBYYY:
ZXXX: MOV A,ADDR_DATARE+8 ;; C=01 时
; 载波接收串首字节+1 为 L 存储地址
CJNE A,#05H,ZB_RDBS_ERROR1D ;; L !=5 做错误处理
MOV ADDR_DATARE, DPL ; 移动 A0
MOV ADDR_DATARE+1,DPH ; 移动 A1
MOV ADDR_DATARE+2,23H ; 移动 A2
MOV ADDR_DATARE+3, 73H ; #30H ;; 表号高3位
MOV ADDR_DATARE+4, 74H ; #02H
MOV ADDR_DATARE+5, 75H ; #0
MOV ADDR_DATARE+6, #68H
MOV A,ADDR_DATARE+8 ; 转换 L
CLR C
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -