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