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

📄 vterminal_uart.c

📁 wq_vga.rar,系列C51列程
💻 C
字号:
//智能显示终端串口(Uart)通信演示程序。
//
#include <reg51.h>
#include <stdio.h>
#include <string.h>
#define uchar unsigned char

uchar  Fcolor;                 		//背景色
uchar  Bcolor;                 		//前景色
unsigned short 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_Clr();
Read_time();
Read_date();
DIS_Ellipse(unsigned short x0,unsigned short y0,unsigned short xr,unsigned short yr);
DIS_Line(unsigned short x0,unsigned short y0,unsigned short x1,unsigned short y1,unsigned short with);
void Clr_squ(unsigned short x0,unsigned short y0,unsigned short width,unsigned short heith);
void inv_squ(unsigned short x0,unsigned short y0,unsigned short width,unsigned short heith);
void Set_time(uchar year,uchar month,uchar day,uchar hour,uchar minute,uchar second,uchar date);
AUTO_BMP(unsigned short x0,unsigned short y0,uchar N1,uchar N2,uchar T);
DIS_BMP(unsigned short x0,unsigned short y0,uchar N1);
void Dis_time(unsigned short x0,unsigned short y0,unsigned char i);
DIS_Value(unsigned short x0,unsigned short y0,unsigned short Va,unsigned char i);
DIS_String(unsigned short x0,unsigned short y0,char *fmt);

//============================================
//LCD 分辨率为 320X240 640X480 或800X600
#define  LCD_XSIZE    640    
#define  LCD_YSIZE    480 
 
main(void)
{
  unsigned int i;

//对AT89C51(11.059MHz)的串口初始化
  TMOD=0x20;                              //定时器1设置为模式2
  SM0=0;
  SM1=1;                                  //设置串口为方式1,10位异步收发
  PCON=PCON|0x80;                         //波特率加倍
  TL1=0xFD;
  TH1=0xFD;                               //波特率为19200
  TR1=1;                                  //启动定时器1
  REN = 1;                                //允许串口接受使能

  EA=1;                                   //全局中断使能,(EA=0,关全局中断;EA=1,开全局中断)
  ES = 1;                                 //串口中断使能置1,允许串口中断

  Fcolor = 0x0;
  Bcolor = 0xff;
  i = 0;

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

  Lcd_Clr();     //清除全屏。
  //DIS_BMP(LCD_XSIZE-50,LCD_YSIZE-50,0);

  for(i=10;i<40;i+=4)
  {
    DIS_Line(10,i,(LCD_XSIZE-10),i,1);             //画直线
  }
  for(i=10;i<40;i+=4)
  {
    DIS_Ellipse(LCD_XSIZE/4*3,LCD_YSIZE/2,i,i);   //画圆
  }

  DIS_String(0,0,"并行接口通信演示程序之一总线方式");    //显示字符
  Dis_time(0,16,3);

  DIS_String(0,32,"读取年月日:");
  Read_date();
  for(i=0;i<3;i++)
  {
     DIS_Value((6*16)+(i*24),32,Date[i+1],2);
  }
  DIS_String(0,48,"读取时分秒:");
  Read_time();
  for(i=0;i<3;i++)
  {
     DIS_Value((6*16)+(i*24),48,Date[i+5],2);
  }

  Set_time(05,11,9,17,22,30,3);     //设置时间为2005年11月9日,17:22:30,星期三。
  DIS_String(0,64,"X轴座标值:");
  DIS_String(0,80,"Y轴座标值:");
  Bcolor = 0x03;
  Fcolor = 0xE0;
  Clr_squ((LCD_XSIZE/4*1)-35,(LCD_YSIZE/2)-10,70,20);
  DIS_String((LCD_XSIZE/4*1)-32,(LCD_YSIZE/2)-8,"按键测试");
  AUTO_BMP(LCD_XSIZE-50,LCD_YSIZE-50,0,3,2);

  while(1)
  {
      //判断是否有触摸事件发生。
      if(touch_en==5)
	  {
        DIS_Value((6*16),64,CHX_DAT,3);
        DIS_Value((6*16),80,CHY_DAT,3);
		if(CHX_DAT > ((LCD_XSIZE/4*1)-35) && CHX_DAT < ((LCD_XSIZE/4*1)+35) &&
		    CHY_DAT > ((LCD_YSIZE/2)-10) && CHY_DAT < ((LCD_YSIZE/2)+10))	//判断点击处是否在按键区域,如果是往下执行
		{
            inv_squ((LCD_XSIZE/4*1)-35,(LCD_YSIZE/2)-10,70,20);   //反色按钮。
			//用户可在这里加上自己的处理程序,实现按键功能。
            while(touch_en!=2){}    //等待放开按键。
            inv_squ((LCD_XSIZE/4*1)-35,(LCD_YSIZE/2)-10,70,20);   //反色按钮(恢复原来颜色)。
		}
        else 
		{DIS_Ellipse(CHX_DAT,CHY_DAT,4,4);} //如果没有点击到按键,则在按下触摸屏的位置显示一个小圆形。
        touch_en = 0;
	  }
  }
}
//=====================================================================
//查看一个字符是否传送完毕,当一个字符传送完毕后TI位会被硬件置1;
void check_uart(void)
{
  while(TI==0)
  {}
   TI=0;
}
//=====================================================================
//指令头,每一条指令都规定为"0x81, command1,command2,Fcolor,Bcolor"
command_head(unsigned char command1,unsigned char command2)
{
   TI=0;
   SBUF= 0x81;
   check_uart();
   SBUF= command1;
   check_uart();
   SBUF= command2;
   check_uart();

   SBUF= Fcolor;
   check_uart();
   SBUF= Bcolor;
   check_uart();
}
//=====================================================
//指令头+x0+y0
command_head2(uchar command1,uchar command2,unsigned short x0,unsigned short y0)
{
   command_head(command1,command2);

   SBUF= x0/100;
   check_uart();
   SBUF= x0%100;
   check_uart();
   SBUF= y0/100;
   check_uart();
   SBUF= y0%100;
   check_uart();
}
//====================================================
//清屏子程序
Lcd_Clr()
{
   command_head(0x43,0x4c);		//总共发送了五个字节:0x81,0x43,0x4c,Fcolor,Bcolor
   SBUF= 0x84;
   check_uart();
}
//===================================================
// 清矩形
void Clr_squ(unsigned short x0,unsigned short y0,unsigned short width,unsigned short heith)
{
   command_head2(0x43,0x58,x0,y0);

   SBUF= width/100;
   check_uart();
   SBUF= width%100;
   check_uart();
   SBUF= heith/100;
   check_uart();
   SBUF= heith%100;
   check_uart();

   SBUF= 0x84;
   check_uart();
}
//==========================================================
// 反色矩形
void inv_squ(unsigned short x0,unsigned short y0,unsigned short width,unsigned short heith)
{
   command_head2(0x43,0x4e,x0,y0);

   SBUF= width/100;
   check_uart();
   SBUF= width%100;
   check_uart();
   SBUF= heith/100;
   check_uart();
   SBUF= heith%100;
   check_uart();

   SBUF= 0x84;
   check_uart();
}
//====================================================
//读取年月日
Read_date()
{
     command_head(0x52,0x44);
     SBUF= 0x84;
     check_uart();
     while(rc_timer_en != 5){}
     rc_timer_en = 0;
}
//=====================================================
//读取时分秒
Read_time()
{
     command_head(0x52,0x54);
     SBUF= 0x84;
     check_uart();
     while(rc_timer_en != 6){}
     rc_timer_en = 0;
}
//=====================================================
//画圆子程序。
DIS_Ellipse(unsigned short x0,unsigned short y0,unsigned short xr,unsigned short yr)
{
   command_head2(0x44,0x45,x0,y0);

   SBUF= xr/100;
   check_uart();
   SBUF= xr%100;
   check_uart();
   SBUF= yr/100;
   check_uart();
   SBUF= yr%100;
   check_uart();

   SBUF= 0x84;
   check_uart();
}
//======================================================
//画直线子程序。
DIS_Line(unsigned short x0,unsigned short y0,unsigned short x1,unsigned short y1,unsigned short with)
{

   command_head2(0x44,0x4c,x0,y0);

   SBUF= x1/100;
   check_uart();
   SBUF= x1%100;
   check_uart();
   SBUF= y1/100;
   check_uart();
   SBUF= y1%100;
   check_uart();

   SBUF= with/100;
   check_uart();
   SBUF= with%100;
   check_uart();

   SBUF= 0x84;
   check_uart();
}
//=======================================================
//显示字符串子程序。
DIS_String(unsigned short x0,unsigned short y0,char *fmt)
{
   command_head2(0x44,0x57,x0,y0);

   while(*fmt)			//为0时(字符串结束)退出
   {
     SBUF= *fmt;
     check_uart();
	 fmt++;
   }
   SBUF= 0x84;
   check_uart();
}
//========================================================
//开(关)显示时间子程序
void Dis_time(unsigned short x0,unsigned short y0,unsigned char i)
{
   command_head2(0x44,0x54,x0,y0);

   SBUF= i;			//显示方式,若是0则关时间显示
   check_uart();
   SBUF= 0x84;
   check_uart();
}
//======================================================
//设置时间子程序;
//年,月,日,时 ,分,秒,星期。
void Set_time(uchar year,uchar month,uchar day,uchar hour,uchar minute,uchar second,uchar date)
{
   command_head(0x53,0x54);
   SBUF= year;
   check_uart();
   SBUF= month;
   check_uart();
   SBUF= day;
   check_uart();
   SBUF= hour;
   check_uart();
   SBUF= minute;
   check_uart();
   SBUF= second;
   check_uart();
   SBUF= date;
   check_uart();

   SBUF= 0x84;
   check_uart();
}
//=======================================================
//显示变量子程序
DIS_Value(unsigned short x0,unsigned short y0,unsigned short Va,unsigned char i)
{
   command_head2(0x44,0x56,x0,y0);
   SBUF= Va/100;
   check_uart();
   SBUF= Va%100;
   check_uart();

   SBUF= i;			//显示的域宽
   check_uart();
   SBUF= 0x84;
   check_uart();
}
//========================================================
//显示位图子程序
DIS_BMP(unsigned short x0,unsigned short y0,uchar N1)
{
   command_head2(0x44,0x53,x0,y0);

   SBUF= N1;			//位图在Flash中的编号
   check_uart();
   SBUF= 0x84;
   check_uart();
}
//=======================================================
//自动显示位图子程序
AUTO_BMP(unsigned short x0,unsigned short y0,uchar N1,uchar N2,uchar T)
{
   command_head2(0x5a,0x44,x0,y0);
   SBUF= N1;			//开始的位图编号
   check_uart();
   SBUF= N2;			//结束的位图编号
   check_uart();
   SBUF= T;				//位图显示的切换间隔时间
   check_uart();
   SBUF= 0x84;
   check_uart();
}
//=====================================================
//保存当前窗口至后台子程序
void push_windows(unsigned char mun_dc)
{command_head(0x43,0x44);
 SBUF=mun_dc;			//后台编号
 check_uart();
 SBUF= 0x84;
 check_uart();
}
//================================================
//恢复之前保存在后台的窗口
void pop_windows(unsigned char mun_dc)
{command_head(0x45,0x44);
 SBUF=mun_dc;			//后台编号
 check_uart();
 SBUF= 0x84;
 check_uart();
}
//======================================================
/*从智能显示终端模块读数据到单片机的数据格式是
                   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是放开按钮,CHX_H,CHX_L分别是X轴的高位字节和低位字节。
年月日数据格式: 0xF8    年    月     日    星期
时分秒数据格式: 0xF9    时    分     秒
上电就绪      :  0xF0
*/
/*uart 中断程序*/
void uart_int( ) interrupt 4 using 1       
{ 
   unsigned char temp1;

   EA=0;
   if(RI==1)
   {
      temp1 = SBUF;
	  if(temp1 < 0xf0)      //小于F0的数据为参数,大于F0的数据为前导字节。
	  {
	      if(touch_en ==1)   //触摸屏接收充许,开始接收触摸屏数据。
		  {
	         switch(rx_count)
			 {
		        case 0 : CHX_DAT = temp1*100;rx_count=1;      break;
	            case 1 : CHX_DAT = CHX_DAT + temp1; rx_count=2;   break;
	            case 2 : CHY_DAT = temp1*100;rx_count=3;      break;
	            case 3 : CHY_DAT = 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;  //充许接收时分秒数据
		  }
	  }
      RI =0;
   }
   EA=1;
}

⌨️ 快捷键说明

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