《ESP32-S3使用指南—IDF版 V1.6》第三十四章 RGB觸摸實驗
第三十四章 RGB觸摸實驗
1)實驗平臺:正點原子DNESP32S3開發板
2)章節摘自【正點原子】ESP32-S3使用指南—IDF版 V1.6
3)購買鏈接:https://detail.tmall.com/item.htm?&id=768499342659
4)全套實驗源碼+手冊+視頻下載地址:http://www.openedv.com/docs/boards/esp32/ATK-DNESP32S3.html
5)正點原子官方B站:https://space.bilibili.com/394620890
6)正點原子DNESP32S3開發板技術交流群:132780729


本章,作者將介紹如何使用ESP32-S3來驅動觸摸屏,我們通過外接帶觸摸屏的LCD模塊(比如正點原子RGBLCD模塊),來實現觸摸屏控制。在本章中,我們將向大家介紹ESP32-S3控制正點原子RGBLCD模塊,實現觸摸屏驅動(電容觸摸),最終實現一個手寫板的功能。
本章分為如下幾個小節:
34.1 觸摸屏簡介
34.2 硬件設計
34.3 程序設計
34.4 下載驗證
34.1 觸摸屏簡介
34.1.1 電容式觸摸屏
現在幾乎所有智能手機,包括平板電腦都是采用電容屏作為觸摸屏,電容屏是利用人體感應進行觸點檢測控制,不需要直接接觸或只需要輕微接觸,通過檢測感應電流來定位觸摸坐標。正點原子4.3/7寸TFTLCD模塊自帶的觸摸屏采用的是電容式觸摸屏,下面簡單介紹下電容式觸摸屏的原理。
電容式觸摸屏主要分為兩種:
1、表面電容式電容觸摸屏。
表面電容式觸摸屏技術是利用ITO(銦錫氧化物,是一種透明的導電材料)導電膜,通過電場感應方式感測屏幕表面的觸摸行為進行。但是表面電容式觸摸屏有一些局限性,它只能識別一個手指或者一次觸摸。
2、投射式電容觸摸屏。
投射電容式觸摸屏是傳感器利用觸摸屏電極發射出靜電場線。一般用于投射電容傳感技術的電容類型有兩種:自我電容和交互電容。
自我電容又稱絕對電容,是最廣為采用的一種方法,自我電容通常是指掃描電極與地構成的電容。在玻璃表面有用ITO制成的橫向與縱向的掃描電極,這些電極和地之間就構成一個電容的兩極。當用手或觸摸筆觸摸的時候就會并聯一個電容到電路中去,從而使在該條掃描線上的總體的電容量有所改變。在掃描的時候,控制IC依次掃描縱向和橫向電極,并根據掃描前后的電容變化來確定觸摸點坐標位置。筆記本電腦觸摸輸入板就是采用的這種方式,筆記本電腦的輸入板采用XY的傳感電極陣列形成一個傳感格子,當手指靠近觸摸輸入板時,在手指和傳感電極之間產生一個小量電荷。采用特定的運算法則處理來自行、列傳感器的信號來確定手指的位置。
交互電容又叫做跨越電容,它是在玻璃表面的橫向和縱向的ITO電極的交叉處形成電容。交互電容的掃描方式就是掃描每個交叉處的電容變化,來判定觸摸點的位置。當觸摸的時候就會影響到相鄰電極的耦合,從而改變交叉處的電容量,交互電容的掃面方法可以偵測到每個交叉點的電容值和觸摸后電容變化,因而它需要的掃描時間與自我電容的掃描方式相比要長一些,需要掃描檢測XY根電極。目前智能手機/平板電腦等的觸摸屏,都是采用交互電容技術。
正點原子所選擇的電容觸摸屏,也是采用的是投射式電容屏(交互電容類型),所以后面僅以投射式電容屏作為介紹。
投射式電容觸摸屏采用縱橫兩列電極組成感應矩陣,來感應觸摸。以兩個交叉的電極矩陣,即:X軸電極和Y軸電極,來檢測每一格感應單元的電容變化,如圖34.1.1.1所示:

圖34.1.1.1 投射式電容屏電極矩陣示意圖
示意圖中的電極,實際是透明的,這里是為了方便大家理解。圖中,X、Y軸的透明電極電容屏的精度、分辨率與X、Y軸的通道數有關,通道數越多,精度越高。以上就是電容觸摸屏的基本原理,接下來看看電容觸摸屏的優缺點:
電容觸摸屏的優點:手感好、無需校準、支持多點觸摸、透光性好。
電容觸摸屏的缺點:成本高、精度不高、抗干擾能力差。
這里特別提醒大家電容觸摸屏對工作環境的要求是比較高的,在潮濕、多塵、高低溫環境下面,都是不適合使用電容屏的。
電容觸摸屏一般都需要一個驅動IC來檢測電容觸摸,正點原子的電容觸摸屏使用的是IIC接口輸出觸摸數據的觸摸芯片。正點原子7’TFTLCD模塊的電容觸摸屏,采用的是15*10的驅動結構(10個感應通道,15個驅動通道),采用的是GT911/FT5206作為驅動IC。正點原子4.3’TFTLCD模塊采用的驅動IC是:GT9xxx(GT9147/GT917S/GT911/GT1151/GT9271),不同型號感應通道和驅動通道數量都不一樣,詳看數據手冊,但是這些驅動IC驅動方式都類似,這里我們以GT9147為例給大家做介紹,其他的大家參考著學習即可。
GT9147與MCU通過4根線連接:SDA、SCL、RST和INT。GT9147的IIC地址,可以是0X14或者0X5D,當復位結束后的5ms內,如果INT是高電平,則使用0X14作為地址,否則使用0X5D作為地址,具體的設置過程,請看:GT9147數據手冊.pdf這個文檔。本章我們使用0X14作為器件地址(不含最低位,換算成讀寫命令則是讀:0X29,寫:0X28),接下來,介紹一下GT9147的幾個重要的寄存器。
1,控制命令寄存器(0X8040)
該寄存器可以寫入不同值,實現不同的控制,我們一般使用0和2這兩個值,寫入2,即可軟復位GT9147。在硬復位之后,一般要往該寄存器寫2,實行軟復位。然后,寫入0,即可正常讀取坐標數據(并且會結束軟復位)。
2,配置寄存器組(0X8047~0X8100)
這里共186個寄存器,用于配置GT9147的各個參數,這些配置一般由廠家提供給我們(一個數組),所以我們只需要將廠家給我們的配置,寫入到這些寄存器里面,即可完成GT9147的配置。由于GT9147可以保存配置信息(可寫入內部FLASH,從而不需要每次上電都更新配置),我們有幾點注意的地方提醒大家:1,0X8047寄存器用于指示配置文件版本號,程序寫入的版本號,必須大于等于GT9147本地保存的版本號,才可以更新配置。2,0X80FF寄存器用于存儲校驗和,使得0X8047~0X80FF之間所有數據之和為0。3,0X8100用于控制是否將配置保存在本地,寫0,則不保存配置,寫1則保存配置。
3,產品ID寄存器(0X8140~0X8143)
這里總共由4個寄存器組成,用于保存產品ID,對于GT9147,這4個寄存器讀出來就是:9,1,4,7四個字符(ASCII碼格式)。因此,我們可以通過這4個寄存器的值,來判斷驅動IC的型號,以便執行不同的初始化。
4,狀態寄存器(0X814E)
該寄存器各位描述如表表34.1.1.1所示:

表 34.1.1.1 狀態寄存器各位描述
這里,我們僅關心最高位和最低4位,最高位用于表示buffer狀態,如果有數據(坐標/按鍵),buffer就會是1,最低4位用于表示有效觸點的個數,范圍是:0~5,0,表示沒有觸摸,5表示有5點觸摸。最后,該寄存器在每次讀取后,如果bit7有效,則必須寫0,清除這個位,否則不會輸出下一次數據!!這個要特別注意!!!
5,坐標數據寄存器(共30個)
這里共分成5組(5個點),每組6個寄存器存儲數據,以觸點1的坐標數據寄存器組為例,如表34.1.1.2所示:

表34.1.1.2 觸點1坐標寄存器組描述
我們一般只用到觸點的x,y坐標,所以只需要讀取0X81500X8153的數據,組合即可得到觸點坐標。其他4組分別是:0X8158、0X8160、0X8168和0X8170等開頭的16個寄存器組成,分別針對觸點24的坐標。同樣GT9147也支持寄存器地址自增,我們只需要發送寄存器組的首地址,然后連續讀取即可,GT9147會自動地址自增,從而提高讀取速度。
GT9147相關寄存器的介紹就介紹到這里,更詳細的資料,請參考:GT9147編程指南.pdf 這個文檔。
GT9147只需要經過簡單的初始化就可以正常使用了,初始化流程:硬復位à延時10msà結束硬復位à設置IIC地址à延時100msà軟復位à更新配置(需要時)à結束軟復位。此時GT9147即可正常使用了。然后,我們不停的查詢0X814E寄存器,判斷是否有有效觸點,如果有,則讀取坐標數據寄存器,得到觸點坐標。特別注意,如果0X814E讀到的值最高位為1,就必須對該位寫0,否則無法讀到下一次坐標數據。
電容式觸摸屏部分,就介紹到這里。
34.1.2 觸摸控制原理
前面已經簡單地介紹了電阻屏和電容屏的原理,并且知道了不同類型的觸摸屏其實是屏幕+觸摸傳感器組成。那么這里就會有兩組相互獨立的參數:屏幕坐標和觸摸坐標。要實現觸摸功能,就是要把觸摸點和屏幕坐標對應起來。
我們以LCD顯示屏為例,我們知道屏幕的掃描方向是可以編程設定的,而觸摸點,在觸摸傳感器安裝好后,AD值的變化向方向則是固定的,我們以最常見的屏幕坐標方向:先從左到右,再從上到下掃描為例,此時,屏幕坐標和觸點AD的坐標有類似的規律:從坐標原點出發,水平方向屏幕坐標增加時,AD值的X方向也增加;屏幕坐標的Y方向坐標增加,AD值的Y方向也增加;坐標減少時對應的關系也類似,可以用圖34.1.2.1的示意圖來表示這種關系:

圖34.1.2.1 屏幕坐標和觸摸坐標的一種對應關系
這里再來引入兩個概念,物理坐標和邏輯坐標。物理坐標指觸摸屏上點的實際位置,通常以液晶上點的個數來度量。邏輯坐標指這點被觸摸時A/D轉換后的坐標值。仍以圖34.1.2.1為例,我們假定液晶最左上角為坐標軸原點A,在液晶上任取一點B(實際人手比像素點大得多,一次按下會有多個觸點,此處取十字線交叉中心),B在X方向與A相距100個點,在Y方向與A距離200個點,則這點的物理坐標B為(100,200)。如果我們觸摸這一點時得到的X向A/D轉換值為200,Y向A/D轉換值為400,則這點的邏輯坐標B’為(200,400)。
需要特別說明的是,正點原子的電容屏的參數已經在出廠時由廠家調好,所以無需進行校準,而且可以直接讀到轉換后的觸點坐標;對于電阻屏,請大家理解并熟記物理坐標和邏輯坐標邏輯上的對應關系,我們后面編程需要用到。
RGB屏相關內容,可參考正點原子提供的《ATK-MD0430R模塊用戶手冊_V1.0》和《ATK-MD0430R模塊使用說明_V1.0》,在這兩個手冊中,已經詳細說明了RGB的工作原理及相關參數信息。
溫馨提示:正點原子ATK-MD0430R模塊搭載了GT9147電容式觸摸屏IC,我們可通過IIC協議讀取顯示屏的觸摸點。
34.2 硬件設計
34.2.1 例程功能
本章實驗功能簡介:經過一系列的初始化之后,進入電容觸摸屏測試程序,用戶可在畫板上繪畫字符、線條等,在測試界面的右上角會有一個清空的操作區域(RST),點擊這個地方就會將輸入全部清除,恢復白板狀態。
34.2.2 硬件資源
- LED燈
LED-IO1 - XL9555
IIC_SDA-IO41
IIC_SCL-IO42 - RGBLCD
LCD_BL-IO1_3(XL9555)
LCD_DE-IO4
LCD_VSYNC-NC
LCD_HSYNC-NC
LCD_PCLK-IO5
LCD_R3-IO45
LCD_R4-IO48
LCD_R5-IO47
LCD_R6-IO21
LCD_R7-IO14
LCD_G2-IO10
LCD_G3-IO9
LCD_G4-IO46
LCD_G5-IO3
LCD_G6-IO8
LCD_G7-IO18
LCD_B3-IO17
LCD_B4-IO16
LCD_B5-IO15
LCD_B6-IO7
LCD_B7-IO6
34.2.3 原理圖
RGB接口與ESP32-S3的連接關系,如下圖所示:

圖34.2.3.1RGB接口與ESP32-S3的連接電路圖
34.3 程序設計
34.3.1 程序流程圖
程序流程圖能幫助我們更好的理解一個工程的功能和實現的過程,對學習和設計工程有很好的主導作用。下面看看本實驗的程序流程圖:

圖34.3.1.1 RGB觸摸屏實驗程序流程圖
34.3.2 RGB觸摸屏函數解析
這一章節除了涉及到GPIO、IIC的API函數,便沒有再涉及到其他API函數。因此,有關GPIO和IIC的API函數介紹,請讀者回顧此前的第十章與第十九章的內容。接下來,筆者將直接介紹RGB觸摸屏的驅動代碼。
34.3.3 RGB觸摸屏驅動解析
在IDF版例程24_touch中,作者在24_touch\components\BSP路徑下新增了一個TOUCH文件夾,分別用于存放gt9xxx.c、gt9xxx.h和touch.c以及touch.h這四個文件。其中,gt9xxx.h和touch.h文件負責聲明TOUCH相關的函數和變量,而gt9xxx.c和touch.c文件則實現了TOUCH的驅動代碼。下面,我們將詳細解析這四個文件的實現內容。
1,gt9xxx.h和touch.h文件
我們希望能方便地調用不同觸摸芯片的坐標掃描函數,這里我們定義了一個函數指針(*scan)(uint8_t),我們只要把相應的芯片的初始化函數指針賦值給它,就可以使用這個通用接口方便地調用不同芯片的描述函數得到相應的觸點坐標參數。同時,為了方便管理觸摸,我們定義一個用于管理觸摸信息的結構體類型。在前面的理論介紹時我們已經提到過,觸摸芯片正常工作后,能在觸摸點采集到本次觸摸對應的AD信息,編程時需要用到,所以可以在gt9xxx.h和touch.h中定義下面的結構體:
/* gt9xxx.h文件 */
#defineGT9XXX_INT_GPIO_PIN GPIO_NUM_40
#defineGT9XXX_IIC_PORT I2C_NUM_1
#defineGT9XXX_IIC_SDA GPIO_NUM_39
#defineGT9XXX_IIC_CLK GPIO_NUM_38
#defineGT9XXX_IIC_FREQ 400000 /* IIC FREQ */
#defineGT9XXX_INT gpio_get_level(GT9XXX_INT_GPIO_PIN) /* 中斷引腳 */
/* RGB_BL */
#defineCT_RST(x) do { x ? \
xl9555_pin_write(CT_RST_IO, 1): \
xl9555_pin_write(CT_RST_IO, 0); \
} while(0)
/* IIC讀寫命令 */
#defineGT9XXX_CMD_WR 0X28 /* 寫命令 */
#defineGT9XXX_CMD_RD 0X29 /* 讀命令 */
/* GT9XXX 部分寄存器定義 */
#defineGT9XXX_CTRL_REG 0X8040 /*GT9XXX控制寄存器 */
#defineGT9XXX_CFGS_REG 0X8047 /*GT9XXX配置起始地址寄存器 */
#defineGT9XXX_CHECK_REG 0X80FF /*GT9XXX校驗和寄存器 */
#defineGT9XXX_PID_REG 0X8140 /*GT9XXX產品ID寄存器 */
#defineGT9XXX_GSTID_REG 0X814E /*GT9XXX當前檢測到的觸摸情況 */
#defineGT9XXX_TP1_REG 0X8150 /* 第一個觸摸點數據地址 */
#defineGT9XXX_TP2_REG 0X8158 /* 第二個觸摸點數據地址 */
#defineGT9XXX_TP3_REG 0X8160 /* 第三個觸摸點數據地址 */
#defineGT9XXX_TP4_REG 0X8168 /* 第四個觸摸點數據地址 */
#defineGT9XXX_TP5_REG 0X8170 /* 第五個觸摸點數據地址 */
#defineGT9XXX_TP6_REG 0X8178 /* 第六個觸摸點數據地址 */
#defineGT9XXX_TP7_REG 0X8180 /* 第七個觸摸點數據地址 */
#defineGT9XXX_TP8_REG 0X8188 /* 第八個觸摸點數據地址 */
#defineGT9XXX_TP9_REG 0X8190 /* 第九個觸摸點數據地址 */
#defineGT9XXX_TP10_REG 0X8198 /* 第十個觸摸點數據地址 */
/********************************touch.h文件 *********************************/
#defineTP_PRES_DOWN 0x8000 /* 觸屏被按下 */
#defineTP_CATH_PRES 0x4000 /* 有按鍵按下了 */
#defineCT_MAX_TOUCH 10 /* 電容屏支持的點數,固定為5點 */
/* 觸摸屏控制器 */
typedef struct
{
uint8_t (*init)(void); /* 初始化觸摸屏控制器 */
uint8_t (*scan)(uint8_t); /* 掃描觸摸屏.0,屏幕掃描;1,物理坐標; */
uint16_t x[CT_MAX_TOUCH]; /* 當前坐標 */
uint16_t y[CT_MAX_TOUCH]; /* 電容屏有最多10組坐標,電阻屏則用x[0],y[0]代表:此次 掃描時,觸屏的坐標,用
* x[9],y[9]存儲第一次按下時的坐標.
*/
uint16_t sta; /* 筆的狀態
* b15:按下1/松開0;
* b14:0,沒有按鍵按下;1,有按鍵按下.
* b13~b10:保留
* b9~b0:電容觸摸屏按下的點數(0,表示未按下,1表示按下)
*/
/* 5點校準觸摸屏校準參數(電容屏不需要校準) */
float xfac; /* 5點校準法x方向比例因子 */
float yfac; /* 5點校準法y方向比例因子 */
short xc; /* 中心X坐標物理值(AD值) */
short yc; /* 中心Y坐標物理值(AD值) */
/* 新增的參數,當觸摸屏的左右上下完全顛倒時需要用到.
* b0:0, 豎屏(適合左右為X坐標,上下為Y坐標的TP)
* 1, 橫屏(適合左右為Y坐標,上下為X坐標的TP)
* b1~6: 保留.
* b7:0, 電阻屏
* 1, 電容屏
*/
uint8_t touchtype;
}_m_tp_dev;
extern_m_tp_dev tp_dev; /* 觸屏控制器在touch.c里面定義 */
在上述代碼中,用于保存一些RGB觸摸屏重要參數信息,比如IIC命令和GT9XXX 部分寄存器地址的宏定義以及觸摸屏校準參數等。
2,gt9xxx.c和touch.c文件
電容觸摸芯片我們使用的是IIC接口的觸摸IC。IIC接口部分代碼,我們可以參考 iic.c和iic.h的代碼,這里部分參考IIC章節的知識就可以了,這里不重復介紹。

圖40.3.3.2 正點原子 LCD上的GT9XX觸摸芯片通訊接口
gt9xxx_init的實現也比較簡單,實現CT_INT引腳初始化,調用其IIC初始化接口即可。
同樣地,我們需要通過IIC來讀取觸摸點的物理坐標,由于電容屏在設計時是根據屏幕進行參數設計的,參數已經保存在gt9xxx芯片的內部了,我們只需要按手冊推薦的IIC時序把對應的XY坐標讀出來,轉換成LCD的像素坐標即可。gt9xx系列可以通過中斷或輪詢方式讀限,我們使用的是輪詢方式:
1,按第二節時序,先讀取寄存器0x814E,若當前buffer(buffer status為1)數據準備好,則依據手指個數讀、按鍵狀態取相應個數的坐標、按鍵信息。
2,若在1中發現buffer數據(buffer status為0)未準備好,則等待1ms再進行讀取。這樣,gt9xxx_scan()函數的實現如下:
/* GT9XXX 10個觸摸點(最多) 對應的寄存器表 */
const uint16_tGT9XXX_TPX_TBL[10] =
{
GT9XXX_TP1_REG,
GT9XXX_TP2_REG,
GT9XXX_TP3_REG,
GT9XXX_TP4_REG,
GT9XXX_TP5_REG,
GT9XXX_TP6_REG,
GT9XXX_TP7_REG,
GT9XXX_TP8_REG,
GT9XXX_TP9_REG,
GT9XXX_TP10_REG,
};
/**
* @brief 掃描觸摸屏(采用查詢方式)
* @param mode : 電容屏未用到次參數, 為了兼容電阻屏
* @retval 當前觸屏狀態
* @arg 0, 觸屏無觸摸;
* @arg 1, 觸屏有觸摸;
*/
uint8_tgt9xxx_scan(uint8_t mode)
{
uint8_t buf[4];
uint8_t i = 0;
uint8_t res = 0;
uint16_t temp;
uint16_t tempsta;
static uint8_t t = 0; /* 控制查詢間隔,從而降低CPU占用率 */
t++;
/* 空閑時,每進入10次CTP_Scan函數才檢測1次,從而節省CPU使用率 */
if ((t % 10) == 0 || t < 10)
{
gt9xxx_rd_reg(GT9XXX_GSTID_REG, &mode, 1); /* 讀取觸摸點的狀態 */
if ((mode & 0X80) && ((mode & 0XF) <=g_gt_tnum))
{
i = 0;
gt9xxx_wr_reg(GT9XXX_GSTID_REG, &i, 1);/* 清標志 */
}
if ((mode & 0XF) && ((mode & 0XF) <=g_gt_tnum))
{
/* 將點的個數轉換為1的位數,匹配tp_dev.sta定義 */
temp = 0XFFFF << (mode & 0XF);
tempsta =tp_dev.sta; /* 保存當前的tp_dev.sta值 */
tp_dev.sta = (~temp) |TP_PRES_DOWN | TP_CATH_PRES;
/* 保存觸點0的數據,保存在最后一個上 */
tp_dev.x[g_gt_tnum- 1] = tp_dev.x[0];
tp_dev.y[g_gt_tnum- 1] = tp_dev.y[0];
for (i = 0; i <g_gt_tnum; i++)
{
if (tp_dev.sta & (1 << i)) /* 觸摸有效? */
{
gt9xxx_rd_reg(GT9XXX_TPX_TBL, buf, 4);/* 讀取XY坐標值 */
if (tp_dev.touchtype& 0X01) /* 橫屏 */
{
tp_dev.x = ((uint16_t)buf[1] << 8) + buf[0];
tp_dev.y = ((uint16_t)buf[3] << 8) + buf[2];
}
else /* 豎屏 */
{
tp_dev.x =ltdcdev.width –
(((uint16_t)buf[3] << 8) + buf[2]);
tp_dev.y = ((uint16_t)buf[1] << 8) + buf[0];
}
}
}
res = 1;
/* 非法數據(坐標超出了) */
if (tp_dev.x[0] >ltdcdev.width || tp_dev.y[0] >ltdcdev.height)
{
/* 有其他點有數據,則復第二個觸點的數據到第一個觸點. */
if ((mode & 0XF) > 1)
{
tp_dev.x[0] =tp_dev.x[1];
tp_dev.y[0] =tp_dev.y[1];
t = 0;/* 觸發一次,則會最少連續監測10次,從而提高命中率 */
}
else /* 非法數據,則忽略此次數據(還原原來的) */
{
tp_dev.x[0] =tp_dev.x[g_gt_tnum - 1];
tp_dev.y[0] =tp_dev.y[g_gt_tnum - 1];
mode = 0X80;
tp_dev.sta =tempsta; /* 恢復tp_dev.sta */
}
}
else
{
t = 0;/* 觸發一次,則會最少連續監測10次,從而提高命中率 */
}
}
}
if ((mode & 0X8F) == 0X80) /* 無觸摸點按下 */
{
if (tp_dev.sta &TP_PRES_DOWN) /* 之前是被按下的 */
{
tp_dev.sta &= ~TP_PRES_DOWN; /* 標記按鍵松開 */
}
else /* 之前就沒有被按下 */
{
tp_dev.x[0] = 0xffff;
tp_dev.y[0] = 0xffff;
tp_dev.sta &= 0XE000; /* 清除點有效標記 */
}
if (t > 240)
{
t = 10; /* 重新從10開始計數 */
}
return res;
}
接下來是觸摸初始化的核心程序,我們根據前面介紹的知識點,可以知道觸摸的參數與屏幕大小和使用的觸摸芯片有關,我們的4.3寸屏使用的是匯頂科技的GT9xxx系列觸摸屏驅動IC,這是一個IIC接口的驅動芯片,我們要編寫gt9xxx系列芯片的初始化程序,并編寫一個坐標掃描程序,這里我們先預留這兩個接口分別為gt9xxx_init()和gt9xxx_scan(),在gt9xxx.c文件中再專門實現這兩個驅動,標記使用的為電容屏。
/**
* @brief 觸摸屏初始化
* @param 無
* @retval 0,觸摸屏初始化成功
* 1,觸摸屏有問題
*/
uint8_t tp_init(void)
{
tp_dev.touchtype= 0; /* 默認設置(電阻屏& 豎屏) */
tp_dev.touchtype|= ltdcdev.dir & 0X01; /* 根據LCD判定是橫屏還是豎屏 */
if (ltdcdev.id == 0X4342 ||ltdcdev.id == 0X4384)/* 電容觸摸屏,4.3寸屏 */
{
gt9xxx_init();
tp_dev.scan = gt9xxx_scan; /* 掃描函數指向GT觸摸屏掃描 */
tp_dev.touchtype |= 0X80; /* 電容屏 */
return 0;
}
return 1;
}
正點原子的電容屏在出廠時已經由廠家較對好參數了,通過上面的觸摸初始化后,我們就可以讀取相關的觸點信息用于顯示編程了。
34.3.4 CMakeLists.txt文件
打開本實驗BSP下的CMakeLists.txt文件,其內容如下所示:
set(src_dirs
IIC
LED
RGBLCD
TOUCH
XL9555)
set(include_dirs
IIC
LED
RGBLCD
TOUCH
XL9555)
set(requires
driver
esp_lcd
esp_common
log)
idf_component_register(SRC_DIRS${src_dirs}
INCLUDE_DIRS ${include_dirs}REQUIRES ${requires})
component_compile_options(-ffast-math -O3 -Wno-error=format=-Wno-format)
上述的紅色TOUCH驅動需要由開發者自行添加,以確保TOUCH驅動能夠順利集成到構建系統中。這一步驟是必不可少的,它確保了TOUCH驅動的正確性和可用性,為后續的開發工作提供了堅實的基礎。
34.3.5 實驗應用代碼
打開main/main.c文件,該文件定義了工程入口函數,名為app_main。該函數代碼如下。
i2c_obj_ti2c0_master;
/**
* @brief 程序入口
* @param 無
* @retval 無
*/
voidapp_main(void)
{
esp_err_t ret;
ret =nvs_flash_init(); s/* 初始化NVS*/
if (ret ==ESP_ERR_NVS_NO_FREE_PAGES ||
ret ==ESP_ERR_NVS_NEW_VERSION_FOUND)
{
ESP_ERROR_CHECK(nvs_flash_erase());
ret =nvs_flash_init();
}
i2c0_master =iic_init(I2C_NUM_0); /* 初始化IIC0 */
xl9555_init(i2c0_master); /* 初始化XL9555 */
ltdc_init(); /* 初始化ltdc */
tp_dev.init(); /* 初始化觸摸屏 */
load_draw_dialog();
ctp_test();
}
以上就是main函數的主要組成部分。
34.4 下載驗證
在代碼編譯成功之后,我們通過下載代碼到開發板上,觸摸屏測試如下圖所示界面:

圖34.4.1 觸摸屏測試界面
圖中,作者在觸摸板繪畫“ALIENTEK”字符串。按右上角的RST標志,可以清屏。

浙公網安備 33010602011771號