📄 zbframe.asm
字号:
;------------------------------------------------------
;载波通信帧处理程序
;判断接收的表号是否是本采集器号,若不是,清FRM_PROCESS
;------------------------------------------------------
FRM_PROCESS_PROC:
MOV A,REC_ADDR ;接收到的地址低位
CJNE A,#LOW(TERMINAL_ID),FRM_PROCESS_1 ;判断是采集器地址否?
MOV A,REC_ADDR+1 ;接收到的地址高位
CJNE A,#HIGH(TERMINAL_ID),FRM_PROCESS_1 ;是采集器地址,要通过本采集器作为中继器抄表
MOV R7,#0 ;不含表通道号
LCALL REPEATER_FRM_PROCESS ;转中继抄表程序
RET
FRM_PROCESS_1:
MOV A,REC_ADDR ;接收到的地址低位
CJNE A,#LOW(TERMINAL_ID_1),FRM_PROCESS_2 ;判断是表1地址否?
MOV A,REC_ADDR+1 ;接收到的地址高位
CJNE A,#HIGH(TERMINAL_ID_1),FRM_PROCESS_2
MOV R7,#1
LJMP IS_THIS_ID
FRM_PROCESS_2: MOV A,REC_ADDR ;接收到的地址低位
CJNE A,#LOW(TERMINAL_ID_2),FRM_PROCESS_3 ;判断是表2地址否?
MOV A,REC_ADDR+1 ;接收到的地址高位
CJNE A,#HIGH(TERMINAL_ID_2),FRM_PROCESS_3
MOV R7,#2
LJMP IS_THIS_ID
FRM_PROCESS_3: MOV A,REC_ADDR ;接收到的地址低位
CJNE A,#LOW(TERMINAL_ID_3),FRM_PROCESS_4 ;判断是表3地址否?
MOV A,REC_ADDR+1 ;接收到的地址高位
CJNE A,#HIGH(TERMINAL_ID_3),FRM_PROCESS_4
MOV R7,#3
LJMP IS_THIS_ID
FRM_PROCESS_4: MOV A,REC_ADDR ;接收到的地址低位
CJNE A,#LOW(TERMINAL_ID_4),FRM_PROCESS_5 ;判断是表4地址否?
MOV A,REC_ADDR+1 ;接收到的地址高位
CJNE A,#HIGH(TERMINAL_ID_4),FRM_PROCESS_5
MOV R7,#4
LJMP IS_THIS_ID
FRM_PROCESS_5: MOV A,REC_ADDR ;接收到的地址低位
CJNE A,#LOW(TERMINAL_ID_5),FRM_PROCESS_6 ;判断是表5地址否?
MOV A,REC_ADDR+1 ;接收到的地址高位
CJNE A,#HIGH(TERMINAL_ID_5),FRM_PROCESS_6
MOV R7,#5
LJMP IS_THIS_ID
FRM_PROCESS_6: MOV A,REC_ADDR ;接收到的地址低位
CJNE A,#LOW(TERMINAL_ID_6),FRM_PROCESS_7 ;判断是表6地址否?
MOV A,REC_ADDR+1 ;接收到的地址高位
CJNE A,#HIGH(TERMINAL_ID_6),FRM_PROCESS_7
MOV R7,#6
LJMP IS_THIS_ID
FRM_PROCESS_7: MOV A,REC_ADDR ;接收到的地址低位
CJNE A,#LOW(TERMINAL_ID_7),FRM_PROCESS_8 ;判断是表7地址否?
MOV A,REC_ADDR+1 ;接收到的地址高位
CJNE A,#HIGH(TERMINAL_ID_7),FRM_PROCESS_8
MOV R7,#7
LJMP IS_THIS_ID
FRM_PROCESS_8: MOV A,REC_ADDR ;接收到的地址低位
CJNE A,#LOW(TERMINAL_ID_8),FRM_PROCESS_9 ;判断是表8地址否?
MOV A,REC_ADDR+1 ;接收到的地址高位
CJNE A,#HIGH(TERMINAL_ID_8),FRM_PROCESS_9
MOV R7,#8
LJMP IS_THIS_ID
FRM_PROCESS_9: MOV A,REC_ADDR ;接收到的地址低位
CJNE A,#LOW(TERMINAL_ID_9),FRM_PROCESS_10 ;判断是表9地址否?
MOV A,REC_ADDR+1 ;接收到的地址高位
CJNE A,#HIGH(TERMINAL_ID_9),FRM_PROCESS_10
MOV R7,#9
LJMP IS_THIS_ID
FRM_PROCESS_10: MOV A,REC_ADDR ;接收到的地址低位
CJNE A,#LOW(TERMINAL_ID_10),FRM_PROCESS_11 ;判断是表10地址否?
MOV A,REC_ADDR+1 ;接收到的地址高位
CJNE A,#HIGH(TERMINAL_ID_10),FRM_PROCESS_11
MOV R7,#10
LJMP IS_THIS_ID
FRM_PROCESS_11: MOV A,REC_ADDR ;接收到的地址低位
CJNE A,#LOW(TERMINAL_ID_11),FRM_PROCESS_12 ;判断是表11地址否?
MOV A,REC_ADDR+1 ;接收到的地址高位
CJNE A,#HIGH(TERMINAL_ID_11),FRM_PROCESS_12
MOV R7,#11
LJMP IS_THIS_ID
FRM_PROCESS_12: MOV A,REC_ADDR ;接收到的地址低位
CJNE A,#LOW(TERMINAL_ID_12),FRM_PROCESS_13 ;判断是表12地址否?
MOV A,REC_ADDR+1 ;接收到的地址高位
CJNE A,#HIGH(TERMINAL_ID_12),FRM_PROCESS_13
MOV R7,#12
LJMP IS_THIS_ID
FRM_PROCESS_13: MOV A,REC_ADDR ;接收到的地址低位
CJNE A,#LOW(TERMINAL_ID_13),FRM_PROCESS_14 ;判断是表13地址否?
MOV A,REC_ADDR+1 ;接收到的地址高位
CJNE A,#HIGH(TERMINAL_ID_13),FRM_PROCESS_14
MOV R7,#13
LJMP IS_THIS_ID
FRM_PROCESS_14: MOV A,REC_ADDR ;接收到的地址低位
CJNE A,#LOW(TERMINAL_ID_14),FRM_PROCESS_15 ;判断是表14地址否?
MOV A,REC_ADDR+1 ;接收到的地址高位
CJNE A,#HIGH(TERMINAL_ID_14),FRM_PROCESS_15
MOV R7,#14
LJMP IS_THIS_ID
FRM_PROCESS_15: MOV A,REC_ADDR ;接收到的地址低位
CJNE A,#LOW(TERMINAL_ID_15),FRM_PROCESS_16 ;判断是表15地址否?
MOV A,REC_ADDR+1 ;接收到的地址高位
CJNE A,#HIGH(TERMINAL_ID_15),FRM_PROCESS_16
MOV R7,#15
LJMP IS_THIS_ID
FRM_PROCESS_16: MOV A,REC_ADDR ;接收到的地址低位
CJNE A,#LOW(TERMINAL_ID_16),FRM_PROCESS_OVER ;判断是表16地址否?
MOV A,REC_ADDR+1 ;接收到的地址高位
CJNE A,#HIGH(TERMINAL_ID_16),FRM_PROCESS_OVER
MOV R7,#16
IS_THIS_ID: MOV A,REC_CTRL_CODE ;读入控制码
CJNE A,#01H,IS_RD_FRM ;是写请求帧?
LCALL WR_FRM_PROC ;写请求帧
SJMP FRM_PROCESS_OVER
IS_RD_FRM: CJNE A,#06H,FRM_PROCESS_OVER ;是读请求帧?
LCALL RD_FRM_PROC ;请求帧处理
FRM_PROCESS_OVER:
MOV REC_CUR_LEN,#00H ;当前帧长度清0
MOV R0,#REC_BUF ;清接收缓冲
MOV B,#REC_BUF_LEN
CLR_REC_FRM1: MOV @R0,#00H
INC R0
DJNZ B,CLR_REC_FRM1
SETB RX_TX ;ST7536接收状态
SETB RXD
CLR FRM_PROCESS
RET
;--------------------------------------
;读帧处理程序
;--------------------------------------
RD_FRM_PROC: MOV A,REC_DATA_ID
RD_ID_2: CJNE A,#02H,RD_ID_3 ;读电表常数
MOV SEND_DATA_FEILD_LEN,#5
MOV DPH,#C04_ADDR_H
MOV A,R7
DEC A
MOV B,#2
MUL AB
ADD A,#C04_CONSTANT_0
MOV DPL,A
LCALL RD_C04_1BYTE
MOV SEND_DATA_ITEM,B
MOV DPH,#C04_ADDR_H
INC DPL
LCALL RD_C04_1BYTE
MOV SEND_DATA_ITEM+1,B
AJMP RD_ID_EXIT
RD_ID_3: CJNE A,#03H,RD_ID_4 ;读电表底数
MOV SEND_DATA_FEILD_LEN,#7
MOV DPH,#C04_ADDR_H
MOV A,R7
DEC A
MOV B,#4 ;每表底数为4字节
MUL AB
ADD A,#C04_INIT_VAL_0
MOV DPL,A
LCALL RD_C04_1BYTE
MOV SEND_DATA_ITEM,B
MOV DPH,#C04_ADDR_H
INC DPL
LCALL RD_C04_1BYTE
MOV SEND_DATA_ITEM+1,B
MOV DPH,#C04_ADDR_H
INC DPL
LCALL RD_C04_1BYTE
MOV SEND_DATA_ITEM+2,B
MOV DPH,#C04_ADDR_H
INC DPL
LCALL RD_C04_1BYTE
MOV SEND_DATA_ITEM+3,B
AJMP RD_ID_EXIT
;2004-3-23,tjd修改内容:读当前电量改从FM24C04内读,节省出CPU内RAM
RD_ID_4: CJNE A,#04H,RD_ID_5 ;读本月电能
MOV SEND_DATA_FEILD_LEN,#7 ;数据域长度7字节
MOV A,R7
DEC A
ADD A,#RAM_COUNTER_DECIMAL_0 ;小数部分从CPU内寄存器读取
MOV R0,A
MOV SEND_DATA_ITEM,@R0
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 SEND_DATA_ITEM+1,B ;第一字节送发送缓冲区
MOV DPH,#C04_ADDR_L
INC DPL
LCALL RD_C04_1BYTE
MOV SEND_DATA_ITEM+2,B ;送第二字节
MOV DPH,#C04_ADDR_L
INC DPL
LCALL RD_C04_1BYTE
MOV SEND_DATA_ITEM+3,B ;送第三字节
AJMP RD_ID_EXIT
RD_ID_5: CJNE A,#07H,RD_FRM_OVER ;读继电器状态
MOV A,R7 ;当前表号
DEC A ;得出通道号
ADD A,#C04_RELAY_STATE_0 ;得出当前表的继电器状态字的地址
MOV DPL,A
MOV DPH,#C04_ADDR_H ;FM24C04高位控制字
LCALL RD_C04_1BYTE
MOV SEND_DATA_ITEM,B ;将当前表的继电器状态字送发送缓冲区
MOV SEND_DATA_FEILD_LEN,#4 ;数据域长度为4字节
RD_ID_EXIT: MOV SEND_CTRL_CODE,#07H
MOV SEND_DATA_METER,#00H
MOV SEND_DATA_METER+1,#00H
LCALL PRODUCE_SUM_END
SETB R_LEDC ;接收灯灭
CLR S_LEDC ;发送指示亮
LCALL SEND_FRM ;发送写应答帧
RD_FRM_OVER: RET
;--------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -