ORG 1000H
GOTO MAIN
ORG 1080H
MAIN:
CALL INITE ;初始化串口,用户定时器,初始化使用到得R寄存器
CALL T300MS ;300ms定时器标志
LDBR R0,0X10,1
LDBR R1,0X00,1 ;确定页码地址,页码寄存器
MOVXR R10,1,1
IJNE R11,0X01,READ_I
CALL READ_Q00
CALL WRITE_Q00
READ_I:
IJNE R11,0X02,READ_M
CALL READ_I00
READ_M:
IJNE R11,0X03,MAIN_END
CALL READ_M00
CALL WRITE_M00
MAIN_END:
GOTO MAIN
;***************
;上电初始化
INITE:
IJNE R255,0,INIRET
LDBR R255,1,1
COMSET 40H,136 ;设置串口4,波特率115200,上电执行一次
CONFIG 1,2,1 ;用户定时器初始化
INIRET:
RET
;******************
;******************
;300MS定时,每300ms读一次
T300MS:
LDBR R30,0X01,1
LDBR R31,0XF4,1
MOVDR 37,R20,2
JU R20,R30,T300_END
LDBR R90,1,1
LDWR R20,0
MOVRD R20,37,2
LDBR R250,0,3
T300_END:
RET
;******************
;******************
;读线圈Q0.0
READ_Q00:
IJNE R90,1,READ_Q_END ;发送一次读DM区指令后,等待响应
LDBR R90,0,1 ;清除300ms标志位
LDBR R100,0X01,2 ;R100从站设备号01,R101功能码01
LDBR R102,0X00,2 ;读取得线圈地址:Q0.0
LDBR R104,0X00,1
LDBR R105,0X01,1 ;读取得字节长度01
LDBR R10,6,1 ;R100-R105
CRCA R100,R106,R10 ;6字节做ANSI CRC计算,放入到R106,R107中
LDBR R9,8,1 ;发送到串口4得字节长度
COMTXD 4,R100,R9 ;数据发送到串口4
RECIVE_Q:
RDXLEN 4,R50 ;串口得数据长度放到R50中;
IJNE R50,0,RECIVE_Q_handle ;串口接收数据长度不为0,则跳转到RECIVE_handle
GOTO RECIVE_Q ;接收数据长度为0,在此处死循环等待响应
RECIVE_Q_handle:
MOVDR 17,R20,1 ;若接收到数据,读取通讯超时标志位,通讯超时,说明结束数据完成
IJNE R20,0,RECIVE_Q ;等于0,则通讯超时,向下继续执行,不等于,循环(跳转到RECIVE_handle)读取通讯超时标志,直到等于0
RDXDAT 4,R200,R50 ;读取接收得数据到R200
LDBR R50,0X00,1 ;清除数据长度缓冲区
LDBR R0,0X11,1
LDBR R1,0X00,1 ;触摸屏对应地址0x1100
LDBR R202,0X00,1 ;将R202清零
MOVXR R202,0,1 ;将数据R202,R203写入到0x1100
READ_Q_END:
RET
;******************
;******************
;写线圈Q0.0
WRITE_Q00:
LDBR R0,0X11,1
LDBR R1,0X01,1 ;触摸屏对应地址0x1100
MOVXR R10,1,1
IJNE R10,0X5A,WRITE_Q_END
IJNE R11,0X5A,WRITE_Q_END ;判断是否有按键按下
LDBR R10,0X00,2 ;清按键值
MOVXR R10,0,1
LDBR R100,0X01,1 ;从站地址01
LDBR R101,0X05,1 ;功能码05
LDBR R102,0X00,1
LDBR R103,0X00,1 ;写入地址
IJNE R203,0X00,WRITE_0_Q ;原值为0,则写1
LDBR R104,0XFF,1
LDBR R105,0X00,1
GOTO WRITE_Q_SEND
WRITE_0_Q: ;原值为1则写0
LDBR R104,0X00,1
LDBR R105,0X00,1
WRITE_Q_SEND:
LDBR R10,6,1 ;R100-R105
CRCA R100,R106,R10 ;6字节做ANSI CRC计算,放入到R106,R107中
LDBR R9,8,1 ;发送到串口4得字节长度
COMTXD 4,R100,R9 ;数据发送到串口4
WRITE_Q_RESP:
RDXLEN 4,R50 ;串口得数据长度放到R50中;
IJNE R50,0,WRITE_Q_RESP_OK ;串口接收数据长度不为0,则跳转到RECIVE_handle
GOTO WRITE_Q_RESP ;接收数据长度为0,在此处死循环等待响应
WRITE_Q_RESP_OK:
MOVDR 17,R20,1 ;若接收到数据,读取通讯超时标志位,通讯超时,说明结束数据完成
IJNE R20,0,WRITE_M_RESP
RDXDAT 4,R150,R50 ;读取接收得数据到R200
LDBR R50,0X00,1 ;清除数据长度缓冲区
WRITE_Q_END:
RET
;******************
;******************
;读输入I0.0
READ_I00:
IJNE R90,1,READ_I_END ;发送一次读DM区指令后,等待响应
LDBR R90,0,1 ;清除300ms标志位
LDBR R100,0X01,1 ;R100从站设备号01
LDBR R101,0X02,1 ;R101功能码02
LDBR R102,0X00,2 ;读取得地址:I0.0
LDBR R104,0X00,1
LDBR R105,0X01,1 ;读取得字节长度01
LDBR R10,6,1 ;R100-R105
CRCA R100,R106,R10 ;6字节做ANSI CRC计算,放入到R106,R107中
LDBR R9,8,1 ;发送到串口4得字节长度
COMTXD 4,R100,R9 ;数据发送到串口4
RECIVE_I:
RDXLEN 4,R50 ;串口得数据长度放到R50中;
IJNE R50,0,RECIVE_I_handle ;串口接收数据长度不为0,则跳转到RECIVE_handle
GOTO RECIVE_I ;接收数据长度为0,在此处死循环等待响应
RECIVE_I_handle:
MOVDR 17,R20,1 ;若接收到数据,读取通讯超时标志位,通讯超时,说明结束数据完成
IJNE R20,0,RECIVE_I ;等于0,则通讯超时,向下继续执行,不等于,循环(跳转到RECIVE_handle)读取通讯超时标志,直到等于0
RDXDAT 4,R200,R50 ;读取接收得数据到R200
LDBR R50,0X00,1 ;清除数据长度缓冲区
LDBR R0,0X12,1
LDBR R1,0X00,1 ;触摸屏对应地址0x1100
LDBR R202,0X00,1 ;将R202清零
MOVXR R202,0,1 ;将数据R202,R203写入到0x1100
READ_I_END:
RET
;******************
;******************
;读输入M0.0
READ_M00:
IJNE R90,1,READ_M_END ;发送一次读DM区指令后,等待响应
LDBR R90,0,1 ;清除300ms标志位
LDBR R100,0X01,1 ;R100从站设备号01
LDBR R101,0X03,1 ;R101功能码02
LDBR R102,0X00,1
LDBR R103,0X65,1 ;读取得地址:M0.0
LDBR R104,0X00,1
LDBR R105,0X01,1 ;读取得字节长度01
LDBR R10,6,1 ;R100-R105
CRCA R100,R106,R10 ;6字节做ANSI CRC计算,放入到R106,R107中
LDBR R9,8,1 ;发送到串口4得字节长度
COMTXD 4,R100,R9 ;数据发送到串口4
RECIVE_M:
RDXLEN 4,R50 ;串口得数据长度放到R50中;
IJNE R50,0,RECIVE_M_handle ;串口接收数据长度不为0,则跳转到RECIVE_handle
GOTO RECIVE_M ;接收数据长度为0,在此处死循环等待响应
RECIVE_M_handle:
MOVDR 17,R20,1 ;若接收到数据,读取通讯超时标志位,通讯超时,说明结束数据完成
IJNE R20,0,RECIVE_M ;等于0,则通讯超时,向下继续执行,不等于,循环(跳转到RECIVE_handle)读取通讯超时标志,直到等于0
RDXDAT 4,R200,R50 ;读取接收得数据到R200
LDBR R50,0X00,1 ;清除数据长度缓冲区
LDBR R0,0X13,1
LDBR R1,0X01,1 ;触摸屏对应地址0x1300
LDBR R202,0X00,1 ;将R202清零
MOVXR R202,0,1 ;将数据R202,R203写入到0x1300
LDBR R0,0X13,1
LDBR R1,0X00,1 ;触摸屏对应地址0x1300
LDBR R203,0X00,1 ;将R202清零
MOVXR R203,0,1 ;将数据R203,R204写入到0x1300
READ_M_END:
RET
;******************
;******************
;写线圈Q0.0
WRITE_M00:
LDBR R0,0X13,1
LDBR R1,0X02,1 ;触摸屏对应地址
MOVXR R10,1,1
IJNE R10,0X5A,WRITE_M_END
IJNE R11,0X5A,WRITE_M_END
LDBR R10,0X00,2 ;清按键值
MOVXR R10,0,1
LDBR R100,0X01,1 ;从站地址01
LDBR R101,0X06,1 ;功能码05
LDBR R102,0X00,1
LDBR R103,0X65,1 ;写入地址
LDBR R0,0X13,1
LDBR R1,0X01,1 ;触摸屏对应地址
MOVXR R104,1,1
LDBR R10,6,1 ;R100-R105
CRCA R100,R106,R10 ;6字节做ANSI CRC计算,放入到R106,R107中
LDBR R9,8,1 ;发送到串口4得字节长度
COMTXD 4,R100,R9 ;数据发送到串口4
WRITE_M_RESP:
RDXLEN 4,R50 ;串口得数据长度放到R50中;
IJNE R50,0,WRITE_M_RESP_OK ;串口接收数据长度不为0,则跳转到RECIVE_handle
GOTO WRITE_M_RESP ;接收数据长度为0,在此处死循环等待响应
WRITE_M_RESP_OK:
MOVDR 17,R20,1 ;若接收到数据,读取通讯超时标志位,通讯超时,说明结束数据完成
IJNE R20,0,WRITE_M_RESP
RDXDAT 4,R150,R50 ;读取接收得数据到R200
LDBR R50,0X00,1 ;清除数据长度缓冲区
WRITE_M_END:
RET
;******************