📄 vter_bus.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 + -