📄 jdq.bak
字号:
MOV JDQ_9_12_STATE,#00H ;置9-12路继电器状态字为0
MOV JDQ_13_16_STATE,#00H ;置13-16路继电器状态字为0
LJMP JUDGE_END ;转发送
JUDGE_OPEN_METER9:
CJNE A,#9,JUDGE_OPEN_METER10 ;判断是9号表否
MOV JDQ_9_12_STATE,#02H ;置9-12路继电器状态字为02H
LJMP SETB_9_12_CHANNEL2 ;转清其它通道值并发送
JUDGE_OPEN_METER10:
CJNE A,#10,JUDGE_OPEN_METER11 ;判断是10号表否
MOV JDQ_9_12_STATE,#08H ;置9-12路继电器状态字为08H
AJMP SETB_9_12_CHANNEL2 ;转清其它通道值并发送
JUDGE_OPEN_METER11:
CJNE A,#11,JUDGE_OPEN_METER12 ;判断是11号表否
MOV JDQ_9_12_STATE,#20H ;置9-12路继电器状态字为20H
AJMP SETB_9_12_CHANNEL2 ;转清其它通道值并发送
JUDGE_OPEN_METER12:
CJNE A,#12,JUDGE_OPEN_METER13 ;判断是12号表否
MOV JDQ_9_12_STATE,#80H ;置9-12路继电器状态字为80H
SETB_9_12_CHANNEL2:
MOV JDQ_1_4_STATE,#00H ;置1-4路继电器状态字为0
MOV JDQ_5_8_STATE,#00H ;置5-8路继电器状态字为0
MOV JDQ_13_16_STATE,#00H ;置13-16路继电器状态字为0
LJMP JUDGE_END ;转发送
JUDGE_OPEN_METER13:
CJNE A,#13,JUDGE_OPEN_METER14 ;判断是13号表否
MOV JDQ_13_16_STATE,#02H ;置13-16路继电器状态字为02H
LJMP SETB_13_16_CHANNEL2 ;转清其它通道值并发送
JUDGE_OPEN_METER14:
CJNE A,#14,JUDGE_OPEN_METER15 ;判断是14号表否
MOV JDQ_13_16_STATE,#08H ;置13-16路继电器状态字为08H
LJMP SETB_13_16_CHANNEL2 ;转清其它通道值并发送
JUDGE_OPEN_METER15:
CJNE A,#15,JUDGE_OPEN_METER16 ;判断是15号表否
MOV JDQ_13_16_STATE,#20H ;置13-16路继电器状态字为20H
LJMP SETB_13_16_CHANNEL2 ;转清其它通道值并发送
JUDGE_OPEN_METER16:
CJNE A,#16,WR_JDQ_STATE_END ;判断是16号表否
MOV JDQ_13_16_STATE,#80H ;置13-16路继电器状态字为80H
SETB_13_16_CHANNEL2:
MOV JDQ_1_4_STATE,#00H ;置1-4路继电器状态字为0
MOV JDQ_5_8_STATE,#00H ;置5-8路继电器状态字为0
MOV JDQ_9_12_STATE,#00H ;置9-12路继电器状态字为0
;发送当前所有继电器状态字
JUDGE_END:
LCALL SEND_JDQ_STATE ;发送3次当前所有继电器状态字
LCALL KEEP_JDQ_HIGH
LCALL SEND_JDQ_STATE
LCALL KEEP_JDQ_HIGH
LCALL SEND_JDQ_STATE
LCALL KEEP_JDQ_HIGH ;使继电器处于高阻状态
WR_JDQ_STATE_END:
RET
;--------------------------------------------------
;16路继电器状态输出控制子程序
;--------------------------------------------------
;读继电器状态字子程序
READ_JDQ_STATE:
CPL WATCH_DOG ;清看门狗
MOV A,R7 ;得出通道号
ADD A,#C04_RELAY_STATE_0 ;得出当前表的继电器状态字的地址
MOV DPL,A
MOV DPH,#C04_ADDR_H ;FM24C04高位控制字
LCALL RD_C04_1BYTE
MOV A,B ;当前表的继电器状态值
INC R7 ;下一通道
RET
;------------------------------------------------
;继电器动作后使1-16路继电器处于高阻状态减少功耗
;------------------------------------------------
KEEP_JDQ_HIGH:
ACALL WAIT_5ms
MOV JDQ_1_4_STATE,#00H ;置1-4路继电器状态字为0
MOV JDQ_5_8_STATE,#00H ;置5-8路继电器状态字为0
MOV JDQ_9_12_STATE,#00H ;置9-12路继电器状态字为0
MOV JDQ_13_16_STATE,#00H ;置13-16路继电器状态字为0
ACALL SEND_JDQ_STATE ;使所有继电器处于高阻状态减少功耗
RET
;--------------------------------------------
;16路继电器状态输出控制子程序//04-03-24
SEND_JDQ_STATE:
MOV R0,#JDQ_1_4_STATE ;4片74hc595寄存器状态值:
CLR C
SEND_TIMES:
MOV R1,#08h ;每字节移位8次
MOV A,@r0
SEND_ONE_OUT:
RRC A
MOV SER,C ;发送当前位到数据线
NOP
NOP
CLR SRCLK
NOP
NOP
SETB SRCLK
NOP
NOP
DJNZ R1,SEND_ONE_OUT
INC R0
CJNE R0,#35H,SEND_TIMES ;到最后一字节否?
NOP
NOP
SETB SER ;发送完毕置数据线状态为高
SETB SRCLK ;时钟线置高禁止发
SEND_ALL_OUT:
SETB RCLK ;同时输出继电器状态
ACALL WAIT_5ms
SETB RCLK
ACALL WAIT_5ms
CLR RCLK ;禁止状态输出变化
CLR RCLK
ACALL WAIT_100ms ;脉冲保持100毫秒
RET
;存储等待延时5ms子程序--------------------------
WAIT_100ms: MOV R4,#20 ;20次5ms延时
WAIT_NEXT:
ACALL WAIT_5ms
DJNZ R4,WAIT_NEXT
RET
WAIT_5ms: MOV R5,#10 ;5ms延时
AJMP WAIT0
WAIT_FOR_1ms:
MOV R5,#1 ;1ms延时
WAIT0: MOV R6,#10
WAIT1: NOP
NOP
DJNZ R6,WAIT1
CPL WATCH_DOG
DJNZ R5,WAIT0
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -