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

📄 vter100.c

📁 vter液晶显示屏的AVR单片机控制源程序
💻 C
字号:
/****************************************************/
//Designed by Kingtiger  2006.04.05 for Vter640480 test

#include "Vter10.h"

//定义全局变量
unsigned char  Fcolor;                 //背景色
unsigned char  Bcolor;                 //前景色
unsigned int CHX_DAT,CHY_DAT;     //触摸屏坐标变量(CHX_DAT:横坐标,CHY_DAT:纵坐标)
unsigned char  Date[8];//读时间值
unsigned char touch_en=0;
unsigned char rx_count;
unsigned char  rc_timer_en=0;

//LCD 分辨率为 320X240 640X480 或800X600
#define  LCD_XSIZE    640    
#define  LCD_YSIZE    480 
 
//==========================================
//==========================================
//晶振为16M时微秒级延时函数
void delay_us(unsigned int i)
	{
		if(i<2)
		{
			NOP();NOP();NOP();
			return;
		}
		i -= 2;
		NOP();NOP();NOP();NOP();NOP();
		NOP();NOP();NOP();NOP();NOP();
		while(i--)
		{
		NOP();NOP();NOP();NOP();NOP();
		NOP();NOP();NOP();NOP();NOP();
		}
}
//------------------------------------------
void wait_time_ms (unsigned int t) {
   while (t--)
   delay_us(1000);
   }
//--------------------------------------------
//指令头,每一条指令都规定为"0x81, command1,command2,Fcolor,Bcolor"
void command_head(unsigned char command1,unsigned char command2)
{
   USART0_TxD(0x81);
   USART0_TxD(command1);
   USART0_TxD(command2);
   USART0_TxD(Fcolor);
   USART0_TxD(Bcolor);
}
//指令头+x0+y0
void command_head2(unsigned char command1,unsigned char command2,unsigned int x0,unsigned int y0)
{
   command_head(command1,command2);
   USART0_TxD(x0/100);
   USART0_TxD(x0%100);
   USART0_TxD(y0/100);
   USART0_TxD(y0%100);
}
//在指定位置(x0,y0)光标处显示16X16中英文字符串
void DIS_String(unsigned int x0,unsigned int y0,unsigned char *fmt)
{
   command_head2(0x44,0x57,x0,y0);
   while(*fmt)
   {
     USART0_TxD(*fmt);
	 fmt++;
   }
   USART0_TxD(0x84);
}
//在指定位置(x0,y0)光标处显示大字符32X32中英文字符串
void DIS_BigString(unsigned int x0,unsigned int y0,unsigned char *fmt)
{
   command_head2(0x44,0x44,x0,y0);
   while(*fmt)
   {
     USART0_TxD(*fmt);
	 fmt++;
   }
   USART0_TxD(0x84);
}
//--------------------------------------------
//在(x0,y0)位置以十进制显示区域宽度为i(i=<5)个字符的变量Va
void DIS_Value(unsigned int x0,unsigned int y0,unsigned int Va,unsigned char i)
{
   command_head2(0x44,0x56,x0,y0);
   USART0_TxD(Va/100);
   USART0_TxD(Va%100);
   USART0_TxD(i);
   USART0_TxD(0x84);
}
//--------------------------------------------
//在(x0,y0)位置以十进制显示区域宽度为i(i=<5)个字符的字体为font(0~4)的变量Va
//font: 00--16X32,01--24X37,02--24X48,03--36X64,04--48X97
void DIS_FontValue(unsigned char font,unsigned int x0,unsigned int y0,unsigned int Va,unsigned char i)
{
   command_head2(0x56,font,x0,y0);
   USART0_TxD(Va/100);
   USART0_TxD(Va%100);
   USART0_TxD(i);
   USART0_TxD(0x84);
}
//--------------------------------------------
//在(x0,y0)位置显示序号为N1(0~63)的位图
void DIS_BMP(unsigned int x0,unsigned int y0,unsigned char N1)
{
   command_head2(0x44,0x53,x0,y0);
   USART0_TxD(N1);
   USART0_TxD(0x84);
}
//-------------------------------------------
//清屏子程序,前景色无实际作用,但也要发
void Lcd_Clr()
{
   command_head(0x43,0x4c);
   USART0_TxD(0x84);
}
//---------------------------------------------
//以指定的背景色清除(x0,y0)位置处宽width高heith的矩形
void Clr_squ(unsigned int x0,unsigned int y0,unsigned int width,unsigned int heith)
{
   command_head2(0x43,0x58,x0,y0);
   USART0_TxD(width/100);
   USART0_TxD(width%100);
   USART0_TxD(heith/100);
   USART0_TxD(heith%100);
   USART0_TxD(0x84);
}
//--------------------------------------------
//反色(x0,y0)位置处宽width高heith的矩形
void inv_squ(unsigned int x0,unsigned int y0,unsigned int width,unsigned int heith)
{
   command_head2(0x43,0x4e,x0,y0);
   USART0_TxD(width/100);
   USART0_TxD(width%100);
   USART0_TxD(heith/100);
   USART0_TxD(heith%100);
   USART0_TxD(0x84);
}
//--------------------------------------------
//以(x0,y0)为圆心画x轴半径为xr,y轴半径为yr的圆
void DIS_Ellipse(unsigned int x0,unsigned int y0,unsigned int xr,unsigned int yr)
{
   command_head2(0x44,0x45,x0,y0);
   USART0_TxD(xr/100);
   USART0_TxD(xr%100);
   USART0_TxD(yr/100);
   USART0_TxD(yr%100);
   USART0_TxD(0x84);
}
//---------------------------------------------
//以(x0,y0)为起点,(x1,y1)为终点画宽度为with的直线
void DIS_Line(unsigned int x0,unsigned int y0,unsigned int x1,unsigned int y1,unsigned int with)
{
   command_head2(0x44,0x4c,x0,y0);
   USART0_TxD(x1/100);
   USART0_TxD(x1%100);
   USART0_TxD(y1/100);
   USART0_TxD(y1%100);
   USART0_TxD(with/100);
   USART0_TxD(with%100);
   USART0_TxD(0x84);
}
//---------------------------------------------
//以时间间隔T自动循环地在(x0,y0)处显示序号从N1到N2的多幅位图
void AUTO_BMP(unsigned int x0,unsigned int y0,unsigned char N1,unsigned char N2,unsigned char T)
{
   command_head2(0x5a,0x44,x0,y0);
   USART0_TxD(N1);
   USART0_TxD(N2);
   USART0_TxD(T);
   USART0_TxD(0x84);
}
//---------------------------------------------
//在指定(x0,y0)处显示(01)或关闭(00)光标
void DIS_Cursor(unsigned int x0,unsigned int y0,unsigned char disp_con)
{
   command_head2(0x43,0x55,x0,y0);
   USART0_TxD(disp_con);
   USART0_TxD(0x84);
}
//+++++++++++++++ 中断程序区  ++++++++++++++++++
//中断方式接收LCD传过来的数据,触摸屏被按下时,自动连续地发送五个字节的数据到单片机
//此处仅按下有效:第1个是0xF2, 第2,3个是X轴坐标,第4,5个是Y轴坐标
/*从智能显示终端模块读数据到单片机的数据格式是
                   0     1      2      3      4
触摸屏数据格式: 0xF2  CHX_H  CHX_L  CHY_H  CHY_L   其中0xF2是按下按钮,CHX_H,CHX_L分别是X轴的高、低位字节
触摸屏数据格式: 0xF3  CHX_H  CHX_L  CHY_H  CHY_L   其中0xF3是放开按钮,按钮释放有效
年月日数据格式: 0xF8    年    月     日    星期
时分秒数据格式: 0xF9    时    分     秒
上电就绪      :  0xF0                                */

#pragma interrupt_handler uart0_rx_isr:19
void uart0_rx_isr(void)
{
   unsigned char temp1;

   temp1 =UDR0;		  				 	//接收中断上传数据
   if(temp1 < 0xf0)      //小于F0的数据为参数,大于F0的数据为前导字节。
	  {
	      if(touch_en ==1)   //触摸屏接收充许,开始接收触摸屏数据。
		  {
	         switch(rx_count)
			 {
		        case 0 :	 			//X轴高字节
					 CHX_DAT = temp1*100;
					 rx_count=1;
					 break;
	            case 1 :   				//组合X轴坐标点数据
					 CHX_DAT +=temp1;
					 rx_count=2;
					 break;
	            case 2 :   			 	//Y轴高字节
					 CHY_DAT = temp1*100;
					 rx_count=3;
					 break;
	            case 3 :   				//组合Y轴坐标点数据
					 CHY_DAT +=temp1;
					 rx_count=0;touch_en=5;
					 break;
			 }
		  }
          if(rc_timer_en ==1)  //年月日接收充许,开始接收年月日数据。
		  {
              Date[rx_count++] = temp1;
              if(rx_count ==5){rc_timer_en = 5;}
		  }
          if(rc_timer_en ==2)  //时分秒接收充许,开始接收时分秒数据。
		  {
              Date[rx_count++] = temp1;
              if(rx_count ==8){rc_timer_en = 6;}
		  }
	  }
	else
	  {
	      switch(temp1)
		  {
		     case 0xf2 : touch_en = 1;rx_count =0;      break;  //充许接收触摸屏按下数据
		     case 0xf3 : touch_en = 2;rx_count =0;      break;  //充许接收触摸屏释放数据
	         case 0xf8 : rc_timer_en = 1; rx_count =1;  break;  //充许接收年月日数据
	         case 0xf9 : rc_timer_en = 2; rx_count =5;  break;  //充许接收时分秒数据
		  }
	  }
}
//==========================================
//==========================================
//主函数
void main (void){
     unsigned char tmpchar,stand_times=0,ready_times=0,pilot_times=0;
	 unsigned char num3=0,num2=0,num1=0;
	 unsigned int  tmpint;
	 
	 CLI();    				   						//禁止任何中断
	 USART0_Init();
	 UCSR0B |=(1<<RXCIE0);   					   //使能接收完成中断
	 SEI();

	 Fcolor = 0xff;								   //字为白色
	 Bcolor = 0x50;								   //背景为浅绿色

	 //显示终端在上电就绪时发送F0.用仿真器时不要检测F0.
	 //当把程序烧写到单片机上时,显示终端和单片机同时上电,所以一定
	 //要检测是否收到F0。以判断显示终端是否上电就绪
//	 tmpint = 0;
//	 while(!(tmpint == 0xF0))
//	 	tmpint =UDR0; 
	 	wait_time_ms(2000);

	 DIS_BMP(0,0,0);		 		  //显示基本画面0
	 while(1){

		{//判断是否有触摸事件发生&&&&&&&&&&&&&&&&&&&&
		    if(touch_en==5)
			  {
				touch_en = 0;
				if((CHY_DAT >0)&&(CHY_DAT <150))          //模式选择栏
				{
				 	if((CHX_DAT >0)&&(CHX_DAT <200))	  //连续模式
						DIS_BMP(10,10,1);		 		  //显示画面1,连续运行
				 	else if((CHX_DAT >=200)&&(CHX_DAT <400))//脉冲模式
						DIS_BMP(225,10,2);		 		  //显示画面2,脉冲运行
					else								  //单点模式
						DIS_BMP(440,10,3);				  //显示画面3,单点运行
				}
				else if((CHY_DAT >=150)&&(CHY_DAT <250))   //控制动作选择栏
				{
				 	stand_times++;
					if((CHX_DAT >0)&&(CHX_DAT <310))	  //待机按钮
						if(stand_times%2) DIS_BMP(142,174,4); //显示画面4,待机灯变绿
						else			  DIS_BMP(142,174,5); //显示画面5,待机灯变红
					else if((CHX_DAT >=327)&&(CHX_DAT <394)&&(CHY_DAT >=225)){
						 num3++;
						 if(num3>9) num3=0;
						 DIS_BMP(326,230,10+num3);
					  }
					else if((CHX_DAT >=394)&&(CHX_DAT <461)&&(CHY_DAT >=225)){
						 num2++;
						 if(num2>9) num2=0;
						 DIS_BMP(394,230,10+num2);
					  }
					else if((CHX_DAT >=493)&&(CHX_DAT <560)&&(CHY_DAT >=225)){
						 num1++;
						 if(num1>9) num1=0;
						 DIS_BMP(494,230,10+num1);
					  }
				}
				else if((CHY_DAT >=250)&&(CHY_DAT <350))   //控制动作选择栏
				{
				 	ready_times++;
					if((CHX_DAT >0)&&(CHX_DAT <310))	  //待机按钮
						if(ready_times%2) DIS_BMP(151,267,6); //显示画面6,准备灯变绿
						else			  DIS_BMP(151,267,7); //显示画面7,准备灯变红
					else if((CHX_DAT >=327)&&(CHX_DAT <394)){//设定数字
						 num3++;
						 if(num3>9) num3=0;
						 DIS_BMP(327,230,10+num3);
					  }
					else if((CHX_DAT >=394)&&(CHX_DAT <461)){
						 num2++;
						 if(num2>9) num2=0;
						 DIS_BMP(394,230,10+num2);
					  }
					else if((CHX_DAT >=494)&&(CHX_DAT <561)){
						 num1++;
						 if(num1>9) num1=0;
						 DIS_BMP(494,230,10+num1);
					  }
				}
				else if((CHY_DAT >=350)&&(CHY_DAT <480))   //控制动作选择栏
				{
				 	pilot_times++;
					if((CHX_DAT >50)&&(CHX_DAT <150))	  //红光指示按钮
						if(pilot_times%2) DIS_BMP(45,380,8); //显示画面8,指示开关关
						else			  DIS_BMP(45,380,9); //显示画面9,指示开关开
					else{					  				 //其它位置,返回初始界面
						DIS_BMP(0,0,0);		 	  			 //显示基本画面0
						Bcolor =0xe2;						 //字
						DIS_String(0,0,"X轴坐标:");    	 //显示字符
						DIS_Value(70,0,CHX_DAT,3);
						Bcolor =0xb5;					     //字
						DIS_String(100,0,"Y轴坐标:");    	 //显示字符
						DIS_Value(170,0,CHY_DAT,3);
						Bcolor =0xa1;			   			 //字
						DIS_BigString(200,0,"X轴坐标:");
						DIS_FontValue(1,330,0,CHX_DAT,3);	 //显示大字符坐标
						Bcolor =0x90;						 //字为白色
						DIS_BigString(400,0,"Y轴坐标:");
						DIS_FontValue(2,540,0,CHY_DAT/10,2);	 //显示大字符坐标
						DIS_Ellipse(605,52,3,3);
						DIS_FontValue(3,610,0,CHY_DAT%10,1);	 //显示大字符坐标
						Bcolor =0x50;						   //字为白色

						DIS_Cursor(100,200,1);		       //显示光标
//						DIS_Cursor(300,200,0);		       //关闭光标
						}
				}
			  }
		}//&&&&&&&&&&&&&&&&&&&&&&&&&
	 }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -