觸摸屏在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的燈狀態。博主實測有效。

有更多關於觸摸屏使用的討論,歡迎在下方評論留言,博主會積極參與討論。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM