Touch_GUI(基于STM32触摸屏)
提示:基于STM32
触摸屏的简易GUI设计(主要涉及逻辑控制,界面较为简化)
涉及的硬件为STM32F427VGT6
,触摸屏驱动芯片为TP2046
触摸屏驱动代码请查看我之前的文章
STM32F427V系列的触摸屏驱动
文章目录
前言
一、程序介绍&说明
-
程序中分别有三个结构体
分别控制程序的工作状态、触摸效果和触摸事件处理等 -
用户需要先调用初始化函数
可根据需要进行按键(触摸热区)数量进行加减
这是设置触摸热区范围 -
用户只需在主函数里面调用逻辑控制函数即可
具体位置根据使用情况定 -
用户根据需要进行重写弱函数
-
其代码核心为触摸区域判断
/*****************************************
* 函数名: Judge_Touch
* 函数功能: 判断所绘制的区域是否被按下
* 形参: num:矩形框的位置坐标。x1,y1,x2,y2
* 返回值: 1:按下的是该区域。0:按下的不是该区域
******************************************/
static uint8_t Judge_Touch(uint16_t num[]) //判断触摸区域 若是该区域返回 1,否则返回 0
{
if((tp_dev.x[0]>num[0]) && (tp_dev.x[0]<num[2]) && (tp_dev.y[0]>num[1]) && (tp_dev.y[0]<num[3])) //目标区域
{
return 1;
}
else
return 0;
}
/*****************************************
* 函数名: Gui_TouchAdjust
* 函数功能: 获取所有被按下触摸热区的名称。所有触摸热区归一处理,传入触摸热区,并获取触摸热区名称
* 形参: ButtonArea:按钮区域 TouchName所触发的区域名称
* 返回值: 无
******************************************/
static void Gui_TouchAdjust(uint16_t *ButtonArea[ButtonNumSIZE][LocationSize],uint16_t *TouchName)
{
static uint8_t i = 0;
tp_dev.scan(0); //触摸扫描
if(tp_dev.sta&TP_PRES_DOWN) //触摸屏被按下
{
if(tp_dev.x[0]<lcd_Width&&tp_dev.y[0]<lcd_height) //判断按下区域是否在显示屏内
{
for(i = 0;i < User_Gui.ButtonNumber;i++) //循环遍历寻找触摸区域
{
if(Judge_Touch(*ButtonArea[i])) //判断触摸区域
{
if(User_Gui.Control.State != Start || i == 0) //程序正在执行
{
EffectView(User_Gui.Interface,i+1);
while(!PEN);
EffectView(User_Gui.Interface,User_Gui.Interface); //触摸热区效果显示
*TouchName = i+1; //触摸热区名称
}
}
}
if(User_Gui.Interface == DepuInterface) //副页面的触摸热区名称变换
*TouchName += 3;
}
}
}
- 绘框函数
/*****************************************
* 函数名: DrawRectangle_num
* 函数功能: 绘制矩形框并填充字符
* 形参: num:矩形框的位置坐标。x1,y1,x2,y2
* *string: 字符
* StrColor: 字符颜色
* StrBlaColor: 字符背景色
* RecColor: 框的颜色
* 返回值: 无
******************************************/
static void DrawRectangle_num(uint16_t num[], uint8_t *string, uint16_t StrColor, uint16_t StrBlaColor,uint16_t RecColor) //画矩形并显示字符 (数组形式)
{
uint8_t length; //长度(字符)
uint8_t breadth; //宽度
length = strlen((char*)string); //计算字符串数组长度
breadth = 16;
if(length > (num[2] - num[0])) //当所画的矩形长度小于所要显示的字符时,自动增加长度
{
num[2] = length+2;
if(breadth > num[3] - num[1]) //当所画的矩形宽度小于所要显示的字符时,自动增加宽度
{
num[3] = num[1] + breadth+2;
LCD_ShowString(num[0]+(num[2]-num[0]-length*8)/2,(num[3]-num[1]-breadth)/2+num[1],string,StrColor,StrBlaColor); //显示字符
}
else
LCD_ShowString(num[0]+(num[2]-num[0]-length*8)/2,(num[2]-num[1]-breadth)/2+num[1],string,StrColor,StrBlaColor); //显示字符
}
else
{
LCD_Fill(num[0],num[1],num[2],num[1]+1,RecColor); //上方的线
LCD_Fill(num[0],num[3],num[2],num[3]+1,RecColor); //下方的线
LCD_Fill(num[0],num[1],num[0]+1,num[3],RecColor); //左方的线
LCD_Fill(num[2],num[1],num[2]+1,num[3]+1,RecColor); //右方的线 画线
LCD_ShowString(num[0]+(num[2]-num[0]-length*8)/2,(num[3]-num[1]-breadth)/2+num[1],string,StrColor,StrBlaColor); //中间的字符
}
}
二,程序下载说明
其完整代码可在CSDN上下载或去我GitHub仓库下载
提示:点击上面的CSDN
和GitHub
即可跳转。