基于STM32的TFT触摸屏虚拟按键

TFT触摸屏虚拟按键功能展示

虚拟按键的代码是基于触摸屏的(这里触摸屏详细可以去看正点原子官方例程这里不过多赘述)

这里主要复习复习本例程中用到的LCD、触摸屏功能函数

并讲讲触摸屏虚拟按键相较于基础的触摸屏多了哪些函数

一、LCD、触摸屏功能函数复习

①清屏函数(一般用于界面的刷新或切换)

void LCD_Clear(u16 Color);	 //清屏

②在指定区域填充颜色(用于设置按键捕获状态)

void LCD_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 color);//在指定区域填充颜色

③画矩形函数(用于构造界面)

void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2);		 //画矩形

④显示字符串函数(用于显示信息 注意size仅可选择16/12)

LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,u8 *p); //显示字符串

⑤触摸屏校准函数(TFT是电阻屏 一定要记得校准!!)

void TP_Adjust(void);	//触摸屏校准

二、虚拟按键功能函数

在触摸屏的基础上,触摸屏虚拟按键主要多了三个函数,以下一一讲解。

变量及函数定义:

u8** keycontent;
const  u8* key_menu[15]={"Ret"," : "," None","1","2","3","4","5","6","7","8","9","DEL","0","Enter",};  //按键界面菜单
void Load_keyboard(u16 x,u16 y,u8 **key_content);  //加载按键界面
void Key_staset(u16 x,u16 y,u8 keyx,u8 sta);  //设置按键捕获状态
u8 Get_keynum(u16 x,u16 y);  //得到按键的输入

①按键界面加载函数

void Load_keyboard(u16 x,u16 y,u8 **key_content)
{
	u16 i;
	POINT_COLOR=RED; //字体颜色为红色
	keycontent=key_content;
	LCD_Fill(x,y,x+240,y+150,WHITE);
	LCD_DrawRectangle(x,y,x+240,y+150);						   
	LCD_DrawRectangle(x+80,y,x+160,y+150);	 
	LCD_DrawRectangle(x,y+30,x+240,y+60);
	LCD_DrawRectangle(x,y+90,x+240,y+120);
	POINT_COLOR=BLUE;
	for(i=0;i<15;i++)
	{
		if(i==1) //":"不需要中间显示
			LCD_ShowString(x+(i%3)*80+2,y+7+30*(i/3),16,16,16,(u8*)keycontent[i]);	
		else
			Show_Str_Mid(x+(i%3)*80,y+7+30*(i/3),(u8*)keycontent[i],16,80);
	} 
}

这个函数主要用于显示出如下按键界面

第三个空白是因为我当时烧程序的时候还是“ ”而不是“None” 

为什么选用画矩形的函数而不是画直线的函数来构建界面的原因以及很明朗啦(代码更少,更方便,更简单

这里额外讲一下,方便大家去构建自己的界面

TFT显示屏X轴像素点最大为240,Y轴像素点最大为320(简而言之就是坐标的值)

至于Show_Str_Mid函数是我额外写的一个  意在让字符串在所要求位置的中间显示

②设置按键捕获状态函数

void Key_staset(u16 x,u16 y,u8 keyx,u8 sta)
{		  
	u16 i=keyx/3,j=keyx%3;
	if(keyx>16)return;
	if(sta &&keyx!=1)  //":"区域不捕获
		LCD_Fill(x+j*80+1,y+i*30+1,x+j*80+78,y+i*30+28,GREEN);  //当该区域被按下 区域被绿色填充
	else if(keyx!=1)  //松手后区域恢复白色 
		LCD_Fill(x+j*80+1,y+i*30+1,x+j*80+78,y+i*30+28,WHITE);
	if(keyx!=1)  //区域被填色后重新显示
		Show_Str_Mid(x+j*80,y+7+30*i,(u8*)keycontent[keyx],16,80);
}

    else if(keyx!=1)  //松手后区域恢复白色 
        LCD_Fill(x+j*80+1,y+i*30+1,x+j*80+78,y+i*30+28,WHITE);

这个函数一定要有 它决定这个按键能不能连按

此函数流程框图如下

 ③得到按键的输入函数

//返回值:1-15
u8 Get_keynum(u16 x,u16 y)
{
	u16 i,j;
	static u8 key_x=0;
	u8 key=0;
	tp_dev.scan(0); 		 
	if(tp_dev.sta&TP_PRES_DOWN)  //触摸屏被按下
	{	
		for(i=0;i<5;i++)
		{
			for(j=0;j<3;j++)
			{
			 	if(tp_dev.x[0]<(x+j*80+80)&&tp_dev.x[0]>(x+j*80)&&tp_dev.y[0]<(y+i*30+30)&&tp_dev.y[0]>(y+i*30))  //决定每一块区域所代表的值
				{	
					key=i*3+j+1;	//i代表行 每一行的变化需要变化三个值 j代表列 每一列变化仅需要变化一个值
					break;	 		   
				}
			}
			if(key) //key!=0
			{	   
				if(key_x==key)key=0; 
				else 
				{
					Key_staset(x,y,key_x-1,0);  
					key_x=key;
					Key_staset(x,y,key_x-1,1);  //决定哪一块区域发生按键捕获
				}
				break;
			}
	  }  
	}
	else if(key_x)  //每次从0开始 不记录上次的状态
	{
		Key_staset(x,y,key_x-1,0);
		key_x=0;
	} 
	return key; 
}

虚拟按键可供大家完成更加完备和体验感更好的功能开发

这里分享触摸屏虚拟按键的完整工程√

https://download.csdn.net/download/weixin_54057317/20430541

希望大家点个赞呀~

补充:除了TFT-LCD触摸屏外,还有更易于开发的一种屏幕即——USART HMI智能串口屏。

相关介绍及教程转链接~https://blog.csdn.net/weixin_54057317/article/details/119323787

版权声明:本文为CSDN博主「鱼鱼不秃头」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_54057317/article/details/119008174

生成海报
点赞 0

鱼鱼不秃头

我还没有学会写个人说明!

暂无评论

相关推荐

趣聊51之串口通信(概念篇)

对于刚刚接触单片机的同学们来说,串口通信似乎是一个神秘感十足的东西,笔者在刚刚开始学习51单片机时,读的是郭天祥先生的那本著名的《新概念51单片机教程》,贼厚的一本书,但是等

ANO匿名上位机V7协议&STM32

ANO匿名上位机V7协议&STM32 说明:以下程序为自己编写,若有误欢迎各位指出。 基于ANO匿名V7上位机的通信协议编写的代码 前言 提示:以下内容需用到C语言中的指针、结构体、枚举、及大小端