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

📄 vter_bus.c

📁 wq_vga.rar,系列C51列程
💻 C
字号:
//智能显示终端并行接口通信演示程序之一总线方式。
//仿真器需选择:"总线设置(Bus Option)"的"仅使用数据总线(Use XBus Only)"。

#include <reg51.h>
#include <stdio.h>
#include <string.h>
#define uchar unsigned char
//==========================================================
//定义P0口为数据线,P3.1, P3.2,P3.3为控制线。
sbit	       CS0	   =P3^1;          //片选信号 
sbit		   PINT    =P3^2;          //触摸屏中断信号
uchar  		   Fcolor;                 //背景色
uchar  	 	   Bcolor;                 //前景色
unsigned short CHX_DAT,CHY_DAT;        //触摸屏坐标
unsigned char  Date[8];				   //读时间值
//==========================================================
//写一个数据子程序:
Write_Byte(uchar dc_data)
{
    uchar xdata DC;   //定义一个外部RAM变量
    uchar i;
    CS0 = 0;
	DC = dc_data;   //数据dc_data写到外部RAM(即LCD控制板)。
    CS0 = 1;
    //加入适当的空操作延时
	//当采用更高速的单片机时应加入更多的空操作延时
	//这里加上8个空操作延时,在AT89C51,22MHz下是完全没问题的。
    for(i=0;i<8;i++){}  
}
//==========================================================
//读一个字节数据子程序:
uchar Read_Byte(void)
{
    uchar xdata DC;
    CS0 = 0;
	return DC;
}
//=================================================
/*外中断处理程序*/
void Ex1_int( ) interrupt 2 using 1       
{ 
	uchar temp1,temp2,temp3,temp4;

	temp1 = Read_Byte();
	temp2 = Read_Byte();
	temp3 = Read_Byte();
	temp4 = Read_Byte();
	if(temp1 == 0xF8)     			//如果接收到的第一个字节是0xF8, 则收到的数据是年月日。
	{
       Date[0] = temp1;
       Date[1] = temp2;
       Date[2] = temp3;
       Date[3] = temp4;
	}
	else if(temp1 == 0xF9)  		//如果接收到的第一个字节是0xF9, 则收到的数据是时分秒。
	{
       Date[4] = temp1;
       Date[5] = temp2;
       Date[6] = temp3;
       Date[7] = temp4;
	}
	else                			//收到的数据触摸屏的座标值。
	{
        CHX_DAT = temp1 * 100;
        CHX_DAT = temp2 + CHX_DAT;  //高低两字节组合(高低两个字节100进1)
        CHY_DAT = temp3 * 100;
        CHY_DAT = temp4 + CHY_DAT;  //高低两字节组合(高低两个字节100进1)
	}
}
//==============================================
//函数声明
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);
test_timer();
void push_windows(unsigned char mun_dc);   //保存当前窗口至后台子程序
void pop_windows(unsigned char mun_dc);	   //恢复之前保存在后台的窗口
//==============================================
//LCD 分辨率为 320X240 640X480 或800X600
#define  LCD_XSIZE    320    
#define  LCD_YSIZE    240 

main(void)
{
  unsigned int i;

  CS0 = 0;
  PINT = 1;
  Fcolor = 0x0;
  Bcolor = 0xff;
  i = 0;

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

  IT1 = 0;           //外部中断1为电平触发方式。    
  EA=1;              //全局中断使能,(EA=0,关全局中断;EA=1,开全局中断)
  EX1 = 1;           //外部中断使能置1,允许外部中断

  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,"读取年月日:");
  DIS_String(0,48,"读取时分秒:");
  test_timer();

  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)
  {
      PINT = 1;     //将PINT设为输入端口
      //判断是否有触摸事件发生。
      if(PINT ==0)
	  {
        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);   //反色按钮。
			//用户可在这里加上自己的处理程序,实现按键功能。

			test_timer();
            while(PINT ==0){}    //等待PINT为高电平,即放开按键。
            inv_squ((LCD_XSIZE/4*1)-35,(LCD_YSIZE/2)-10,70,20);   //反色按钮(恢复原来颜色)。
		}
        else 
		{DIS_Ellipse(CHX_DAT,CHY_DAT,4,4);} //如果没有点击到按键,则在按下触摸屏的位置显示一个小圆形。
        while(PINT ==0){}    //等待PINT为高电平。即放开按钮。
	  }
  }
}
//=========================================================
//测试从显示终端机读取时间。
test_timer()
{
  uchar  i;

  Read_date();
  while(Date[0] == 0){}   //等待显示终端机送年月日数据到单片机
  for(i=0;i<3;i++)
  {
     DIS_Value((6*16)+(i*24),32,Date[i+1],2);
  }
  Read_time();
  while(Date[4] == 0){}   //等待显示终端机送时分秒数据到单片机
  for(i=0;i<3;i++)
  {
     DIS_Value((6*16)+(i*24),48,Date[i+5],2);
  }
}
//===================================================================
//指令头,每一条指令都规定为"0x81, command1,command2,Fcolor,Bcolor"
command_head(unsigned char command1,unsigned char command2)
{
   Write_Byte(0x81);
   Write_Byte(command1);
   Write_Byte(command2);
   Write_Byte(Fcolor);
   Write_Byte(Bcolor);
}
//===================================================================
//清屏
Lcd_Clr()
{
   command_head(0x43,0x4c);   //总共发送了五个字节:0x81,0x43,0x4c,Fcolor,Bcolor
   Write_Byte(0x84);
}
//===================================================================
// 清矩形
void Clr_squ(unsigned short x0,unsigned short y0,unsigned short width,unsigned short heith)
{
   command_head(0x43,0x58);
   Write_Byte(x0/100);		 //x轴坐标,取整运算,高低两个字节100进1
   Write_Byte(x0%100);		 //x轴坐标,取模运算
   Write_Byte(y0/100);		 //Y轴坐标
   Write_Byte(y0%100);

   Write_Byte(width/100);	 //矩形的宽,取整运算,高低两个字节100进1
   Write_Byte(width%100);
   Write_Byte(heith/100);	 //矩形的高
   Write_Byte(heith%100);

   Write_Byte(0x84);
}
//=================================================
// 反色矩形
void inv_squ(unsigned short x0,unsigned short y0,unsigned short width,unsigned short heith)
{
   command_head(0x43,0x4e);
   Write_Byte(x0/100);
   Write_Byte(x0%100);
   Write_Byte(y0/100);
   Write_Byte(y0%100);

   Write_Byte(width/100);
   Write_Byte(width%100);
   Write_Byte(heith/100);
   Write_Byte(heith%100);

   Write_Byte(0x84);
}
//================================================
//读取年月日
Read_date()
{
     Date[0] = 0;		//Date[0]清零,当年月日数据更新后将赋值0xf8,可用查询方式确认数据是否已经更新
     command_head(0x52,0x44);
     Write_Byte(0x84);
}
//================================================
//读取时分秒
Read_time()
{
     Date[4] = 0; 		//Date[4]清零,当时分秒数据更新后将赋值0xf9,可用查询方式确认数据是否已经更新
     command_head(0x52,0x54);
     Write_Byte(0x84);
}
//===============================================
//画圆子程序。
DIS_Ellipse(unsigned short x0,unsigned short y0,unsigned short xr,unsigned short yr)
{
   command_head(0x44,0x45);
   Write_Byte(x0/100);
   Write_Byte(x0%100);
   Write_Byte(y0/100);
   Write_Byte(y0%100);
   Write_Byte(xr/100);
   Write_Byte(xr%100);
   Write_Byte(yr/100);
   Write_Byte(yr%100);
   Write_Byte(x0/100);
   Write_Byte(0x84);
}
//================================================
//画直线子程序。
DIS_Line(unsigned short x0,unsigned short y0,unsigned short x1,unsigned short y1,unsigned short with)
{

   command_head(0x44,0x4c);
   Write_Byte(x0/100);
   Write_Byte(x0%100);
   Write_Byte(y0/100);
   Write_Byte(y0%100);
   Write_Byte(x1/100);
   Write_Byte(x1%100);
   Write_Byte(y1/100);
   Write_Byte(y1%100);
   Write_Byte(with/100);
   Write_Byte(with%100);
   Write_Byte(0x84);
}
//===============================================
//在指定的开始位置(x0,y0)显示字符串子程序。
//当x0大于800且已打开光标功能时在以光标为开始位置显示字符串子程序。
DIS_String(unsigned short x0,unsigned short y0,char *fmt)
{

   command_head(0x44,0x57);

   Write_Byte(x0/100);
   Write_Byte(x0%100);
   Write_Byte(y0/100);
   Write_Byte(y0%100);

   while(*fmt)			//为0时(字符串结束)退出
   {
     Write_Byte(*fmt);
	 fmt++;
   }
   Write_Byte(0x84);
}
//==============================================
//开(关)显示时间子程序
void Dis_time(unsigned short x0,unsigned short y0,unsigned char i)
{
   command_head(0x44,0x54);
   Write_Byte(x0/100);
   Write_Byte(x0%100);
   Write_Byte(y0/100);
   Write_Byte(y0%100);
   Write_Byte(i);		//显示方式,若是0则关时间显示
   Write_Byte(0x84);
}
//==============================================
//设置时间子程序;
//年,月,日,时 ,分,秒,星期。
void Set_time(uchar year,uchar month,uchar day,uchar hour,uchar minute,uchar second,uchar date)
{
   command_head(0x53,0x54);
   Write_Byte(year);
   Write_Byte(month);
   Write_Byte(day);
   Write_Byte(hour);
   Write_Byte(minute);
   Write_Byte(second);
   Write_Byte(date);
   Write_Byte(0x84);
}
//================================================
//显示变量子程序
DIS_Value(unsigned short x0,unsigned short y0,unsigned short Va,unsigned char i)
{
   command_head(0x44,0x56);
   Write_Byte(x0/100);
   Write_Byte(x0%100);
   Write_Byte(y0/100);
   Write_Byte(y0%100);

   Write_Byte(Va/100);
   Write_Byte(Va%100);
   Write_Byte(i);		         //显示的域宽
   Write_Byte(0x84);
}
//================================================
//显示位图子程序
DIS_BMP(unsigned short x0,unsigned short y0,uchar N1)
{
   command_head(0x44,0x53);
   Write_Byte(x0/100);
   Write_Byte(x0%100);
   Write_Byte(y0/100);
   Write_Byte(y0%100);
   Write_Byte(N1);				//位图在Flash中的编号
   Write_Byte(0x84);
}
//================================================
//自动显示位图子程序
AUTO_BMP(unsigned short x0,unsigned short y0,uchar N1,uchar N2,uchar T)
{
   command_head(0x5a,0x44);
   Write_Byte(x0/100);
   Write_Byte(x0%100);
   Write_Byte(y0/100);
   Write_Byte(y0%100);
   Write_Byte(N1);				//开始的位图编号
   Write_Byte(N2);				//结束的位图编号
   Write_Byte(T);				//位图显示的切换间隔时间
   Write_Byte(0x84);
}
//================================================
//保存当前窗口至后台子程序
void push_windows(unsigned char mun_dc)
{command_head(0x43,0x44);
 Write_Byte(mun_dc);			//后台编号
 Write_Byte(0x84);
}
//================================================
//恢复之前保存在后台的窗口
void pop_windows(unsigned char mun_dc)
{command_head(0x45,0x44);
 Write_Byte(mun_dc);			//后台编号
 Write_Byte(0x84);
}

⌨️ 快捷键说明

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