⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hldmsapp.asm

📁 645规约集中抄表源代码
💻 ASM
📖 第 1 页 / 共 5 页
字号:
               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 + -