觸摸屏分電阻屏和電容屏兩類,原理這里就不講了,網上資料很多,博主主要講一下他的應用。
原料: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的燈狀態。博主實測有效。
有更多關於觸摸屏使用的討論,歡迎在下方評論留言,博主會積極參與討論。