📄 vter_test.c
字号:
#include <reg51.h>
#include <math.h>
//=======================
#define rate 3.14 //圆周率定义
//==============按键图片的编号定义
#define background 0
#define abstract 1
#define return_ 2
#define timeon 3
#define timeoff 4
#define settime 5
#define drawgraph 6
#define drawline 7
#define drawell 8
#define drawrec 9
#define string 10
#define diswave 11
#define execute 12
#define keyboard 13
#define topbmp 14
#define wavegraph 15
//===========功能按键坐标定义
#define key1x 0 //简介
#define key1y 440
#define key2x 110 //显示时间
#define key2y 440
#define key3x 220 //设置时间
#define key3y 440
#define key4x 330 //绘制图形
#define key4y 440
#define key5x 440 //字符
#define key5y 440
#define key6x 550 //显示波形
#define key6y 440
#define keywidth 87 //功能按键的宽
#define keyheith 40 //功能按键的高
#define touchxx 304 //触摸屏x坐标显示位置
#define touchxy 9 //触摸屏x坐标显示位置
#define touchyx 375 //触摸屏y坐标显示位置
#define touchyy 9 //触摸屏y坐标显示位置
//===========背景图片中间黑色方框区域坐标定义
#define bmpx 58 //左上角x坐标
#define bmpy 95 //左上角y坐标
#define bmpwidth 557 //区域的宽
#define bmpheith 328 //区域的高
//=============显示时间的位置坐标定义
#define distimex 5
#define distimey 5
//=============设置时间时,键入的数据显示坐标定义
#define dissetdatex (bmpx+60) //日期行的坐标
#define dissetdatey (bmpy+77)
#define dissettimex (bmpx+40) //时间行的坐标
#define dissettimey (bmpy+126)
//=============设置时间时,键盘的按键定义
#define boardkeywidth 78 //键盘按键的宽
#define boardkeyheith 77 //键盘按键的高
#define keyboard0x (bmpx+242) //0数字键(其中bmpx是背景图片中间黑色方框区域坐标,也就是显示键盘的坐标)
#define keyboard0y (bmpy+5)
#define keyboard1x (bmpx+242+boardkeywidth) //1数字键
#define keyboard1y (bmpy+5)
#define keyboard2x (bmpx+242+2*boardkeywidth)//2数字键
#define keyboard2y (bmpy+5)
#define keyboard3x (bmpx+242+3*boardkeywidth)//3数字键
#define keyboard3y (bmpy+5)
#define keyboard4x (bmpx+242) //4数字键
#define keyboard4y (bmpy+5+boardkeyheith)
#define keyboard5x (bmpx+242+boardkeywidth) //5数字键
#define keyboard5y (bmpy+5+boardkeyheith)
#define keyboard6x (bmpx+242+2*boardkeywidth)//6数字键
#define keyboard6y (bmpy+5+boardkeyheith)
#define keyboard7x (bmpx+242+3*boardkeywidth)//7数字键
#define keyboard7y (bmpy+5+boardkeyheith)
#define keyboard8x (bmpx+242) //8数字键
#define keyboard8y (bmpy+5+2*boardkeyheith)
#define keyboard9x (bmpx+242+boardkeywidth) //9数字键
#define keyboard9y (bmpy+5+2*boardkeyheith)
#define keyboardcx (bmpx+242+2*boardkeywidth)//清除键
#define keyboardcy (bmpy+5+2*boardkeyheith)
#define keyboardokx (bmpx+242) //确定键
#define keyboardoky (bmpy+5+3*boardkeyheith)
//=====================全局变量定义===========
unsigned char fcolor,bcolor; //前景色、背景色变量定义
unsigned char touchbuf[4]; //触摸屏坐标存储区
unsigned char datebuf[6]; //日期存储区
unsigned char timebuf[8]; //时间存储区
unsigned char int_state=0; //引发中断的事件(触摸屏、日期、时间)
unsigned char rx_count=0; //读串口数据的计数器
unsigned char touchok=0; //触摸屏数据接收OK
unsigned char dateok=0; //日期数据接收OK
unsigned char timeok=0; //时间数据接收OK
//=====================按键是否被点击的标志定义,0表示未点击,1点击一次,2点击两次
unsigned char abstractkey=0; //简介
unsigned char timeonkey=0; //时间
unsigned char settimekey=0; //设置时间
unsigned char drawgraphkey=0; //绘制图形
unsigned char stringkey=0; //字符
unsigned char wavekey=0; //显示波形
//=================================函数声明=====================================================
void command_head(unsigned char command1,unsigned char command2);
void command_head2(unsigned char command1,unsigned char command2,unsigned short x0,unsigned short y0);
dis_value(unsigned short x,unsigned short y,unsigned short Va,unsigned char area);
dis_smallchar(unsigned short x,unsigned short y,char *fmt);
void dis_bmp(unsigned short x,unsigned short y,unsigned char num);
void draw_rec(unsigned short x,unsigned short y,unsigned short width,unsigned short heith);
void inv_rec(unsigned short x,unsigned short y,unsigned short width,unsigned short heith);
void draw_line(unsigned short x0,unsigned short y0,unsigned short x1,unsigned short y1,unsigned short width);
void draw_ell(unsigned short x,unsigned short y,unsigned short xsize,unsigned short ysize);
void draw_sin(unsigned short x,unsigned short y,unsigned char mode,double pi,unsigned char cp,unsigned short xsize);
void time_on(unsigned short x,unsigned short y,unsigned char mode);
void Lcd_Clr(void);
void send_byte(unsigned char byte);
void tx_check();
void onkey1(void);
void onkey2(void);
void onkey3(void);
void onkey4(void);
void onkey5(void);
void onkey6(void);
void set_time(void);
void renewtime(unsigned char *da);
unsigned char disfigure(unsigned char num,unsigned char figure);
//==============================================================================================
main(void)
{
unsigned char keyvalue=0;
unsigned short chx,chy;
unsigned int i;
//对AT89C51(11.059MHz)的串口初始化
SP = 0xe0; //定义堆栈的起始地址为0xe0(也可以由系统自动分配)
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,允许串口中断
//===============================================================================================
//显示终端在上电就绪时发送F0.用仿真器时不要检测F0.
//当把程序烧写到单片机上时,显示终端和单片机同时上电,所以一定
//要检测是否收到F0。以判断显示终端是否上电就绪
//===============================================================================================
i = 0;
while(!(i == 0xF0))
{
i = SBUF;
}
fcolor = 0x00; //前景色
bcolor = 0xff; //背景色
Lcd_Clr(); //清屏
dis_bmp(0,0,background); //显示背景图片
dis_bmp(key1x,key1y,abstract); //显示按键图片
dis_bmp(key2x,key2y,timeon);
dis_bmp(key3x,key3y,settime);
dis_bmp(key4x,key4y,drawgraph);
dis_bmp(key5x,key5y,string);
dis_bmp(key6x,key6y,diswave);
while(1)
{
while(1) //触摸屏被触发吗?没有则循环检测(读串口)?
{
if(touchok==1)
{
chx=(touchbuf[0]*100+touchbuf[1]); //将两字节数据转换为短整型
chy=(touchbuf[2]*100+touchbuf[3]);
touchok=0;
break;
}
}
dis_value(touchxx+2,touchxy+2,chx,03); //显示触摸屏坐标
dis_value(touchyx+2,touchyy+2,chy,03);
//===================================================按键检测程序==================================
if(abstractkey==0 && settimekey==0 && drawgraphkey==0
&& stringkey==0 && wavekey==0 //检测这些参数是为了判断是否已经有其他按键事先按下,若有,此按键无效;这个条件是程序的关键
|| abstractkey==1 || settimekey==1 || drawgraphkey==1 || stringkey==1//若有其它按键事先按下,则返回键也接收点击
|| wavekey==2) //当“显示波形”键被按了两次,“返回”键也
{
if(chx>key1x && chx<(key1x+keywidth) && chy>key1y && chy<(key1y+keyheith))//您点击在按键的范围吗?
{
keyvalue=1; //键值置1
}
}
if(abstractkey==0 && settimekey==0 && drawgraphkey==0 && stringkey==0 && wavekey==0)//检测这些参数是为了判断是否已经有其他按键事先按下,若有,此按键无效
{
if(chx>key2x && chx<(key2x+keywidth) && chy>key2y && chy<(key2y+keyheith))
{
keyvalue=2;
}
}
if(abstractkey==0 && settimekey==0 && drawgraphkey==0 && stringkey==0 && wavekey==0)//不用我多说了吧?
{
if(chx>key3x && chx<(key3x+keywidth) && chy>key3y && chy<(key3y+keyheith))
{
keyvalue=3;
}
}
if(abstractkey==0 && settimekey==0 && drawgraphkey==0 && stringkey==0 && wavekey==0
|| drawgraphkey==1)
{
if(chx>key4x && chx<(key4x+keywidth) && chy>key4y && chy<(key4y+keyheith))
{
keyvalue=4;
}
}
if(abstractkey==0 && settimekey==0 && drawgraphkey==0 && stringkey==0 && wavekey==0
|| drawgraphkey==1)
{
if(chx>key5x && chx<(key5x+keywidth) && chy>key5y && chy<(key5y+keyheith))
{
keyvalue=5;
}
}
if( abstractkey==0 && settimekey==0 && drawgraphkey==0 && stringkey==0 && wavekey==0
|| wavekey==1 || drawgraphkey==1)//当“显示波形”键按过一次或“绘制图形”键按过一次时也生效(看运行结果就明白了)
{
if(chx>key6x && chx<(key6x+keywidth) && chy>key6y && chy<(key6y+keyheith))
{
keyvalue=6;
}
}
//======================================根据键值实现相应的功能
switch (keyvalue)
{
case 0:
keyvalue=0;
break;
case 1:
keyvalue=0; //切记清键值
onkey1(); //按键1功能函数
break;
case 2:
keyvalue=0;
onkey2();
break;
case 3:
keyvalue=0;
onkey3();
break;
case 4:
keyvalue=0;
onkey4();
break;
case 5:
keyvalue=0;
onkey5();
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -