Touch_GUI(基于STM32触摸屏)

Touch_GUI(基于STM32触摸屏)

提示:基于STM32触摸屏的简易GUI设计(主要涉及逻辑控制,界面较为简化)
涉及的硬件为STM32F427VGT6,触摸屏驱动芯片为TP2046
触摸屏驱动代码请查看我之前的文章
STM32F427V系列的触摸屏驱动


文章目录


前言

一、程序介绍&说明

  • 程序中分别有三个结构体
    分别控制程序的工作状态、触摸效果和触摸事件处理等
    Touch_GUI(基于STM32触摸屏)

  • 用户需要先调用初始化函数
    可根据需要进行按键(触摸热区)数量进行加减
    Touch_GUI(基于STM32触摸屏)
    这是设置触摸热区范围
    Touch_GUI(基于STM32触摸屏)

  • 用户只需在主函数里面调用逻辑控制函数即可
    Touch_GUI(基于STM32触摸屏)
    具体位置根据使用情况定
    Touch_GUI(基于STM32触摸屏)

  • 用户根据需要进行重写弱函数
    Touch_GUI(基于STM32触摸屏)

  • 其代码核心为触摸区域判断

/*****************************************
 * 函数名:		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仓库下载
提示:点击上面的CSDNGitHub即可跳转。

上一篇:UITapGestureRecognizer 和 UICollectionView/UITableView等点击事件冲突问题


下一篇:C# Winform中慎用Application.DoEvents