触摸屏分电阻屏和电容屏两类,原理这里就不讲了,网上资料很多,博主主要讲一下他的应用。
原料:4342电容触摸屏(分辨率480*272),STM32F429IGT6开发板(正点原子APOLLO)
博主前面提供了一个STM32的模板,https://www.cnblogs.com/showtime20190824/p/11415470.html(提供下载链接),该模板中包含了RGB屏的初始化,我们直接在该模板上开发触摸屏的操作。下图为模板运行后的效果图:
一般RGB显示屏都会有个驱动芯片,4.3存显示屏用的一般是GT9147/OTT2001A,我们不必了解他们的内部构造,只需知道通过这个驱动芯片,显示屏才能与MCU交互。
这种驱动芯片采用IIC作为通讯协议,文件中的CTIIC就是用来配置触摸屏IIC的,具体内部寄存器就不介绍,都是一些状态和配置的寄存器,早就有高度封装好的库了,我们直接研究库就行了。
这里我们直接采用正点原子提供的库。具体有以下一些文件:
将这些文件以及他们的路径添加进工程中,编译通过后,我们主要看touch.c和touch.h文件,因为它们是我们直接操作触摸屏的上层文件。它们一共包含了以下一些函数,这些函数从字面上看就很容易理解它们的含义,无非就是一些读点的和扫描的操作。
void TP_Write_Byte(u8 num); u16 TP_Read_AD(u8 CMD); u16 TP_Read_XOY(u8 xy); u8 TP_Read_XY(u16 *x,u16 *y); u8 TP_Read_XY2(u16 *x,u16 *y); void TP_Drow_Touch_Point(u16 x,u16 y,u16 color); void TP_Draw_Big_Point(u16 x,u16 y,u16 color); void TP_Save_Adjdata(void); u8 TP_Get_Adjdata(void); void TP_Adjust(void); void TP_Adj_Info_Show(u16 x0,u16 y0,u16 x1,u16 y1,u16 x2,u16 y2,u16 x3,u16 y3,u16 fac); u8 TP_Scan(u8 tp); u8 TP_Init(void);
在c文件中声明了一个结构体变量tp_dev,该变量作为触摸屏的控制器,里面存放了触摸屏的一些信息。
每次运行TP_Init(0)后,结构体tp_dev中的状态就会更新,因此只要不断运行扫描函数(比如设置一个定时器 ,定时器中断函数中运行TP_Init(0))。
我们主要关注结构体中的三个参数:u16 x[10] ,u16 y[10] ,u16 sta。这三个参数分别代表了上一次扫描结果中最多10个触摸点的坐标以及触摸笔的状态(按下/松开 + 触摸点数)
了解触摸屏的工作原理后,我们就可以设计自己的函数运行触摸屏了
OK,先进行最简单的实验,在定时器中添加如下函数:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim == &htim6){ HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0); } if (htim == &htim7){ Showtime_Scan(); CustomizedFlag = KEY_Scan(0); TouchFlag = tp_dev.scan(0); switch (CustomizedFlag) { case KEY0_PRES: LED0 = !LED0; break; case KEY1_PRES: LED0 = !LED0; break; case KEY2_PRES: LED0 = !LED0; break; case WKUP_PRES: LED0 = !LED0; break; } if (tp_dev.sta&TP_PRES_DOWN) { LED0 = !LED0; LCD_ShowString(100,120,400,24,24,"TouchScreen Test Successful"); } } }
同时在main函数中初始化触摸屏(tp.dev()),即可开始使用触摸屏.上面的函数实现的功能是,如果检测到屏幕有触碰点,即转换LED1的灯状态。博主实测有效。
有更多关于触摸屏使用的讨论,欢迎在下方评论留言,博主会积极参与讨论。