📄 eview100.c
字号:
/****************************************************/
//Designed by King 2006.04.20 for Eview touch panel(M510T) test
#include "Eview10.h"
#define Ms_LW 181
#define Ms_RW 180
#define Ms_LB 161
#define Ms_RB 160
//定义全局变量
//接收数组、发送数组
//接收数据的长度,停止接收数据后的延时字节次数,发送标志
//T0定时的时间常数
unsigned char RD_cmd[17]={0x60,0x71,0x17,0x06,0x14,0,0x09,0,0x02,0,0,0,0,0,0,0,0x33};
unsigned char WR_bit_cmd[21]={0x60,0x71,0x17,0x06,0x14,0,0x0d,0,0x03,0x04,0,0,0,0,0,0,0,0,0,0,0x33};
unsigned char WR_word_cmd[21]={0x60,0x71,0x17,0x06,0x14,0,0,0,0x03,0,0,0,0,0,0,0,0,0,0,0,0x33};
unsigned char cmd_type,receBuf[7],error; //命令类型,接收缓冲区,通讯错误
unsigned int rx_data;
//==========================================
//==========================================
//晶振为16M时微秒级延时函数
void delay_us(unsigned int i)
{
while(i--)
NOP();
}
//------------------------------------------
void wait_time_ms (unsigned int t) {
while (t--)
delay_us(1000);
}
//------------------------------------------------------
//发送读起始地址为addr的num个字数据命令
//输入参数包括:地址类型,数据个数,起始地址
unsigned int RD_eview(unsigned char adr_type,unsigned char num,unsigned int addr)
{
unsigned char temp,crc_temp,i,cSREG;
cSREG=SREG;
CLI();
RD_cmd[10] =adr_type; //地址类型代码
RD_cmd[11] =num; //所读数据长度(以word为单位)
RD_cmd[12] =(addr&0xff); //所读数据首地址低位
RD_cmd[13] =((addr>>8)&0xff); //所读数据首地址高位
RD_cmd[14] =0; //命令标识符
crc_temp =RD_cmd[8]; //计算校验码
for(i=0;i<6;i++)
crc_temp ^=RD_cmd[i+9];
crc_temp +=0x04; //MODBUS-RTU协议的PLC代码
RD_cmd[15] =crc_temp; //命令标识符,可更改
USART0_Tx_bytes(RD_cmd,17); //发送命令
i=0;
temp=0x00;
while((temp!=0x33)&&(i<0x0f)) //查询的方式接收返回值
{
temp=USART0_RxD();
receBuf[i]=temp;
i++;
}
crc_temp =receBuf[2];
crc_temp ^=receBuf[3];
crc_temp ^=receBuf[4];
crc_temp +=0x04;
if(crc_temp==receBuf[5]){ //判断校验码
rx_data =(receBuf[3]<<8);
rx_data +=receBuf[2]; //返回的数据低字节在前
}
SREG =cSREG;
return rx_data;
}
//------------------------------------------------------
//修改地址addr中的数据的第num位状态
//输入参数包括:地址类型,第几位(0~15),位操作
unsigned char WR_bit_eview(unsigned char adr_type,unsigned char num,unsigned int addr,unsigned char operate)
{
unsigned char temp,crc_temp,i,cSREG;
cSREG =SREG;
CLI();
WR_bit_cmd[10] =adr_type; //地址类型代码
WR_bit_cmd[11] =num; //欲写的第几位
WR_bit_cmd[12] =(addr&0xff); //写起始地址低字节
WR_bit_cmd[13] =((addr>>8)&0xff); //写起始地址高字节
if(operate)
WR_bit_cmd[14] =0x01; //将该位置位
else
WR_bit_cmd[14] =0x00; //将该位清零
WR_bit_cmd[15] =0; //补3个字节的零
WR_bit_cmd[16] =0;
WR_bit_cmd[17] =0;
WR_bit_cmd[18] =1; //命令标识符
crc_temp =WR_bit_cmd[8]; //计算校验码
for(i=0;i<10;i++)
crc_temp ^=WR_bit_cmd[i+9];
crc_temp +=0x04; //MODBUS-RTU协议的PLC代码
WR_bit_cmd[19] =crc_temp; //命令标识符,可更改
USART0_Tx_bytes(WR_bit_cmd,21); //发送命令
i=0;
temp=0x00;
while((temp!=0x33)&&(i<0x0f)){ //查询的方式接收返回值
temp=USART0_RxD();
receBuf[i]=temp;
i++;
}
crc_temp =receBuf[2];
crc_temp ^=receBuf[3];
crc_temp ^=receBuf[4];
crc_temp +=0x04;
if(crc_temp==receBuf[5]){ //判断校验码
if((receBuf[2]==0xb3)&&(receBuf[3]==0x07))
temp =1;
else temp =0;
}
else
temp =0;
SREG =cSREG;
return temp; //返回写操作成功与否
}
//------------------------------------------------------
//修改地址addr中的数据值
//输入参数包括:地址类型,第几位(0~15),位操作
void WR_word_eview(unsigned char adr_type,unsigned char num,unsigned int addr,unsigned char data)
{
unsigned char temp,crc_temp,i,cSREG;
cSREG =SREG;
CLI();
WR_word_cmd[6] =0xb;//(16+num); //写字命令
WR_word_cmd[9] =num; //所写的字节数
WR_word_cmd[10] =adr_type; //地址类型代码
WR_word_cmd[11] =num; //欲写的数据个数(word型)
WR_word_cmd[12] =(addr&0xff); //写起始地址低字节
WR_word_cmd[13] =((addr>>8)&0xff); //写起始地址高字节
WR_word_cmd[14] =(data&0xff); //写数据值低字节
WR_word_cmd[15] =((data>>8)&0xff); //写数据值高字节
WR_word_cmd[16] =0;
WR_word_cmd[17] =0;
WR_word_cmd[18] =2; //命令标识符
crc_temp =WR_word_cmd[8]; //计算校验码
for(i=0;i<10;i++)
crc_temp ^=WR_word_cmd[i+9];
crc_temp +=0x04; //MODBUS-RTU协议的PLC代码
WR_word_cmd[19] =crc_temp; //命令标识符,可更改
USART0_Tx_bytes(WR_word_cmd,21); //发送命令
i=0;
temp=0x00;
while((temp!=0x33)&&(i<0x0f)){ //查询的方式接收返回值
temp=USART0_RxD();
receBuf[i]=temp;
i++;
}
SREG =cSREG;
}
//==========================================
//==========================================
//主函数
void main (void){
unsigned char tmpchar,i;
unsigned int rx_dat;
CLI(); //禁止任何中断
USART0_Init(); //异步模式、1停止位、偶校验、8字符长度
while(1){
rx_dat =RD_eview(Ms_LW,1,1);
i =WR_bit_eview(Ms_RW,1,400,1);
wait_time_ms(500);
rx_dat =RD_eview(Ms_RW,1,400);
i =WR_bit_eview(Ms_RW,1,400,0);
wait_time_ms(500);
rx_dat =RD_eview(Ms_RW,1,400);
WR_word_eview(Ms_LW,2,1,100);
wait_time_ms(500);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -