⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eview100.c

📁 eview触摸屏的AVR单片机上位机程序
💻 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 + -