触摸屏在STM32中的应用

触摸屏分电阻屏和电容屏两类,原理这里就不讲了,网上资料很多,博主主要讲一下他的应用。

原料: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的灯状态。博主实测有效。

有更多关于触摸屏使用的讨论,欢迎在下方评论留言,博主会积极参与讨论。

原文地址:https://www.cnblogs.com/showtime20190824/p/11435701.html