- 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
- ;******************