📄 hwframe.asm
字号:
;------------------------------------------------------
;红外通信帧处理程序
;判断接收的表号是否是本采集器号,若不是,清HW_FRM_PROCESS
;采集器地址:R4R5R6(高--低),R7(表通道号1--16)
;------------------------------------------------------
HWFRM_PROCESS_PROC:
LCALL JUDGE_REC_TERMINAL_ID ;采集器地址判断是否合法
JB HW_FRM_PROCESS,ADDR_IS_RIGHT ;地址合法,进行帧处理
LJMP HW_FRM_PROCESS_OVER ;不合法,不进行帧处理,清
ADDR_IS_RIGHT:
MOV A,R6 ;接收到的地址低位
CJNE A,#LOW(TERMINAL_ID_1),HW_FRM_PROCESS_2 ;表1地址低位
MOV A,R5 ;接收到的地址高位
CJNE A,#HIGH(TERMINAL_ID_1),HW_FRM_PROCESS_2 ;表1地址高位
MOV R7,#1 ;表通道号
LJMP HW_IS_THIS_ID
HW_FRM_PROCESS_2:
MOV A,R6 ;接收到的地址低位
CJNE A,#LOW(TERMINAL_ID_2),HW_FRM_PROCESS_3 ;表2地址低位
MOV A,R5 ;接收到的地址高位
CJNE A,#HIGH(TERMINAL_ID_2),HW_FRM_PROCESS_3 ;表2地址高位
MOV R7,#2
LJMP HW_IS_THIS_ID
HW_FRM_PROCESS_3:
MOV A,R6 ;接收到的地址低位
CJNE A,#LOW(TERMINAL_ID_3),HW_FRM_PROCESS_4 ;表3地址低位
MOV A,R5 ;接收到的地址高位
CJNE A,#HIGH(TERMINAL_ID_3),HW_FRM_PROCESS_4 ;表3地址高位
MOV R7,#3
LJMP HW_IS_THIS_ID
HW_FRM_PROCESS_4:
MOV A,R6 ;接收到的地址低位
CJNE A,#LOW(TERMINAL_ID_4),HW_FRM_PROCESS_5 ;表4地址低位
MOV A,R5 ;接收到的地址高位
CJNE A,#HIGH(TERMINAL_ID_4),HW_FRM_PROCESS_5 ;表4地址高位
MOV R7,#4
LJMP HW_IS_THIS_ID
HW_FRM_PROCESS_5:
MOV A,R6 ;接收到的地址低位
CJNE A,#LOW(TERMINAL_ID_5),HW_FRM_PROCESS_6 ;表5地址低位
MOV A,R5 ;接收到的地址高位
CJNE A,#HIGH(TERMINAL_ID_5),HW_FRM_PROCESS_6 ;表5地址高位
MOV R7,#5
LJMP HW_IS_THIS_ID
HW_FRM_PROCESS_6:
MOV A,R6 ;接收到的地址低位
CJNE A,#LOW(TERMINAL_ID_6),HW_FRM_PROCESS_7 ;表6地址低位
MOV A,R5 ;接收到的地址高位
CJNE A,#HIGH(TERMINAL_ID_6),HW_FRM_PROCESS_7 ;表6地址高位
MOV R7,#6
LJMP HW_IS_THIS_ID
HW_FRM_PROCESS_7:
MOV A,R6 ;接收到的地址低位
CJNE A,#LOW(TERMINAL_ID_7),HW_FRM_PROCESS_8 ;表7地址低位
MOV A,R5 ;接收到的地址高位
CJNE A,#HIGH(TERMINAL_ID_7),HW_FRM_PROCESS_8 ;表7地址高位
MOV R7,#7
LJMP HW_IS_THIS_ID
HW_FRM_PROCESS_8:
MOV A,R6 ;接收到的地址低位
CJNE A,#LOW(TERMINAL_ID_8),HW_FRM_PROCESS_9 ;表8地址低位
MOV A,R5 ;接收到的地址高位
CJNE A,#HIGH(TERMINAL_ID_8),HW_FRM_PROCESS_9;表8地址高位
MOV R7,#8
LJMP HW_IS_THIS_ID
HW_FRM_PROCESS_9:
MOV A,R6 ;接收到的地址低位
CJNE A,#LOW(TERMINAL_ID_9),HW_FRM_PROCESS_10 ;表9地址低位
MOV A,R5 ;接收到的地址高位
CJNE A,#HIGH(TERMINAL_ID_9),HW_FRM_PROCESS_10;表9地址高位
MOV R7,#9
LJMP HW_IS_THIS_ID
HW_FRM_PROCESS_10:
MOV A,R6 ;接收到的地址低位
CJNE A,#LOW(TERMINAL_ID_10),HW_FRM_PROCESS_11 ;表10地址低位
MOV A,R5 ;接收到的地址高位
CJNE A,#HIGH(TERMINAL_ID_10),HW_FRM_PROCESS_11;表10地址高位
MOV R7,#10
LJMP HW_IS_THIS_ID
HW_FRM_PROCESS_11:
MOV A,R6 ;接收到的地址低位
CJNE A,#LOW(TERMINAL_ID_11),HW_FRM_PROCESS_12 ;表11地址低位
MOV A,R5 ;接收到的地址高位
CJNE A,#HIGH(TERMINAL_ID_11),HW_FRM_PROCESS_12;表11地址高位
MOV R7,#11
LJMP HW_IS_THIS_ID
HW_FRM_PROCESS_12:
MOV A,R6 ;接收到的地址低位
CJNE A,#LOW(TERMINAL_ID_12),HW_FRM_PROCESS_13 ;表12地址低位
MOV A,R5 ;接收到的地址高位
CJNE A,#HIGH(TERMINAL_ID_12),HW_FRM_PROCESS_13;表12地址高位
MOV R7,#12
LJMP HW_IS_THIS_ID
HW_FRM_PROCESS_13:
MOV A,R6 ;接收到的地址低位
CJNE A,#LOW(TERMINAL_ID_13),HW_FRM_PROCESS_14 ;表13地址低位
MOV A,R5 ;接收到的地址高位
CJNE A,#HIGH(TERMINAL_ID_13),HW_FRM_PROCESS_14;表13地址高位
MOV R7,#13
LJMP HW_IS_THIS_ID
HW_FRM_PROCESS_14:
MOV A,R6 ;接收到的地址低位
CJNE A,#LOW(TERMINAL_ID_14),HW_FRM_PROCESS_15 ;表14地址低位
MOV A,R5 ;接收到的地址高位
CJNE A,#HIGH(TERMINAL_ID_14),HW_FRM_PROCESS_15;表14地址高位
MOV R7,#14
LJMP HW_IS_THIS_ID
HW_FRM_PROCESS_15:
MOV A,R6 ;接收到的地址低位
CJNE A,#LOW(TERMINAL_ID_15),HW_FRM_PROCESS_16 ;表15地址低位
MOV A,R5 ;接收到的地址高位
CJNE A,#HIGH(TERMINAL_ID_15),HW_FRM_PROCESS_16;表15地址高位
MOV R7,#15
LJMP HW_IS_THIS_ID
HW_FRM_PROCESS_16:
MOV A,R6 ;接收到的地址低位
CJNE A,#LOW(TERMINAL_ID_16),HW_FRM_PROCESS_OVER ;表16地址低位
MOV A,R5 ;接收到的地址高位
CJNE A,#HIGH(TERMINAL_ID_16),HW_FRM_PROCESS_OVER;表16地址高位
MOV R7,#16
;---------------------------------------------------
;地址正确,进行控制码判断
HW_IS_THIS_ID:
LCALL DATA_SUBB_33H ;接收缓冲区数据域数据减33H子程序
MOV R0,#HW_REC_CTRL_CODE ;读入控制码
CJNE @R0,#01H,HW_IS_WR_FRM ;是读请求帧?
LCALL HW_RD_FRM_PROC ;读请求帧
LJMP HW_FRM_PROCESS_OVER
HW_IS_WR_FRM:
CJNE @R0,#04H,HW_FRM_PROCESS_OVER ;是写请求帧?
LCALL HW_WR_FRM_PROC ;写请求帧处理
HW_FRM_PROCESS_OVER:
MOV HW_REC_CUR_LEN,#00H ;当前帧长度清0
MOV R0,#HW_REC_BUF ;清接收缓冲
MOV B,#HW_REC_BUF_LEN
HW_CLR_REC_FRM1:
MOV @R0,#00H
INC R0
DJNZ B,HW_CLR_REC_FRM1
CLR HW_CONTRA ;红外接收状态
CLR HW_FRM_PROCESS
SETB S_LEDR ;红外接收灯灭
SETB R_LEDR ;红外发送灯灭
RET
;-----------------------------------------------
;读请求帧处理
;-----------------------------------------------
HW_RD_FRM_PROC:
;读当前电量,走标准规约标识#90H#10H或数据块#0FFH#0E3H
MOV R0,#HW_REC_DATA_ID2 ;数据标识2
CJNE @R0,#90H,OTHER_DATA_CAD ;#94H,#10H判断是读当前电量否?
MOV R0,#HW_REC_DATA_ID1 ;数据标识1
CJNE @R0,#10H,READ_FRAME_ERR ;判断是读正向有功电量否?
AJMP READ_OUT_DQDL
OTHER_DATA_CAD:
CJNE @R0,#0E3H,HW_READ_LAST_MONTH ;#0E3H,#0FFH判断是读当前电量块否?
MOV R0,#HW_REC_DATA_ID1 ;数据标识1
CJNE @R0,#0FFH,READ_FRAME_ERR ;判断是读正向有功电量否?
READ_OUT_DQDL:
LCALL READ_FRAME_DL ;读取当前电量
MOV R5,#81H ;读正常回应标志
MOV R6,#06H ;数据域长度
LCALL FORM_SEND_READ_FRAMES ;发送回应帧
RET
HW_READ_LAST_MONTH:
CJNE @R0,#0E2H,HW_READ_LAST_LAST_MONTH ;#94H,#10H判断是读上月电量否?
MOV R0,#HW_REC_DATA_ID1 ;数据标识1
CJNE @R0,#0FFH,READ_FRAME_ERR ;判断是读正向有功电量否?
LCALL READ_LAST_MONTH_DL ;读取上月电量
MOV R5,#81H ;读正常回应标志
MOV R6,#06H ;数据域长度
LCALL FORM_SEND_READ_FRAMES ;发送回应帧
RET
HW_READ_LAST_LAST_MONTH:
CJNE @R0,#98H,HW_READ_RESOLUTION ;判断是读上上月电量否?
MOV R0,#HW_REC_DATA_ID1 ;数据标识1
CJNE @R0,#10H,READ_FRAME_ERR ;判断是读正向有功电量否?
LCALL READ_LAST_LAST_MONTH_DL ;读取上上月电量
MOV R5,#81H ;读正常回应标志
MOV R6,#06H ;数据域长度
LCALL FORM_SEND_READ_FRAMES ;发送回应帧
RET
HW_READ_RESOLUTION:
CJNE @R0,#0C0H,HW_READ_BOTTOM ;判断是电表常数否?
MOV R0,#HW_REC_DATA_ID1 ;数据标识1
CJNE @R0,#30H,READ_FRAME_ERR ;判断是读电表常数否?
LCALL READ_METER_RESOLUTION ;读电表常数
MOV R5,#81H ;读正常回应标志
MOV R6,#05H ;数据域长度
LCALL FORM_SEND_READ_FRAMES ;发送回应帧
RET
HW_READ_BOTTOM:
CJNE @R0,#0C1H,HW_READ_JDQ_STATE ;判断是电表底数否?
MOV R0,#HW_REC_DATA_ID1 ;数据标识1
CJNE @R0,#19H,READ_FRAME_ERR ;判断是读电表底数否?
LCALL READ_METER_BOTTOM ;读电表底数
MOV R5,#81H ;读正常回应标志
MOV R6,#06H ;数据域长度
LCALL FORM_SEND_READ_FRAMES ;发送回应帧
RET
HW_READ_JDQ_STATE:
CJNE @R0,#0E7H,READ_FRAME_ERR ;判断是读继电器状态字否?
MOV R0,#HW_REC_DATA_ID1 ;数据标识1
CJNE @R0,#01H,READ_FRAME_ERR ;判断是读继电器状态字否?
LCALL HW_READ_JDQ_BYTE ;读继电器状态字
MOV R5,#81H ;读正常回应标志
MOV R6,#03H ;数据域长度
LCALL FORM_SEND_READ_FRAMES ;发送回应帧
RET
READ_FRAME_ERR:
LJMP READ_FRAMES_ERR_ACK
;--------------------------------------------------
;读取当前电量
READ_FRAME_DL:
MOV A,R7
DEC A
ADD A,#RAM_COUNTER_DECIMAL_0 ;小数部分从CPU内寄存器读取
MOV R0,A ;当前表小数位地址
MOV A,@R0 ;取出小数值
LCALL HEX_BCD_1BYTE ;小数由16进制数转换为十进制
ADD A,#33H ;加33H
MOV R0,#HW_SEND_DATA_ITEM
MOV @R0,A ;送发送缓冲区数据域
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
PUSH B ;第一字节送堆栈区
MOV DPH,#C04_ADDR_L
INC DPL
LCALL RD_C04_1BYTE
PUSH B ;送第二字节
MOV DPH,#C04_ADDR_L
INC DPL
LCALL RD_C04_1BYTE
MOV R4,B ;高位送R4
POP B
MOV R5,B
POP B
MOV R6,B
LCALL HEX_BCD_3BYTES ;整数位由16进制转换为十进制数
MOV R0,#HW_SEND_DATA_ITEM+1 ;发送缓冲区数据第2字节
MOV A,R3
ADD A,#33H
MOV @R0,A
INC R0
MOV A,R2
ADD A,#33H
MOV @R0,A
INC R0
MOV A,R1
ADD A,#33H
MOV @R0,A
RET
;---------------------------
;读取上月电量
READ_LAST_MONTH_DL:
RET
;---------------------------
;读取上上月电量
READ_LAST_LAST_MONTH_DL:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -