TFTLCD 開發(fā)記錄 -- 7、觸摸屏驅動
????????本文使用到的硬件詳情請參見對應文檔:軟硬件介紹
????????https://www.bilibili.com/read/cv26771439/?spm_id_from=333.999.0.0
????????其中7寸觸摸屏驅動芯片使用的是GT911,所以,要操作觸摸屏首先要編寫GT911的驅動代碼。通過參考GT911的數(shù)據(jù)手冊發(fā)現(xiàn),要驅動它,原理比較簡單,就是使用IIC發(fā)送對應寄存器指令即可。
????????首先,要保證IIC協(xié)議可以正常通信,本文使用IO口軟件模擬IIC時序,實現(xiàn)IIC通信。IIC通信比較基礎,較常用,這里不中詳細說明,若有需要,請去本文對應的開源地址GitHub上下載源碼。
接下來就是實現(xiàn)GT911通過IIC讀寫寄存器操作。
寫寄存器:
讀寄存器數(shù)據(jù):
????????然后是GT911的初始化操作,gt911和其他基于i2c的芯片略有不同,它可以通過,外部引腳INT和RST引腳改變他的地址,一般地址默認是0xBA,通過用INT和RESET引腳可以輸入特定的時序,改變他的地址,變?yōu)?x28,或者變回0xBA,具體時序圖可參見手冊。
編寫一個修改IIC地址的函數(shù)
????????以上操作正常之后,GT911芯片就正常工作了,此時可以讀一下芯片ID,看看督導的ASCII碼是否為“911”,是就表示芯片初始化成功,可以讀取觸摸屏數(shù)據(jù)了。
????????讀取觸摸屏數(shù)據(jù)需要先判斷屏幕上是否有觸摸事件產(chǎn)生,要先讀取0x814E寄存其中的標志位,判斷是否被按下

????????當有觸摸時,寄存器0x814E的最高位(bit7)位會被置位為1, 低4位為觸摸的點的數(shù)量, 最多支持5個點。我們只要在while中不斷輪詢判斷, 寄存器最高位是否置位,就可以知道, 屏幕是否被觸摸,這里需要注意,輪詢時間布特太短否則會出現(xiàn)異常, 手冊上的參考時間是7.5ms~10ms,另外,當讀完寄存器0x814E后, 要手動清0該寄存器, 表示已讀, 要不然會不斷輸出中斷信號。
觸摸后,讀數(shù)據(jù)寄存器即可得到觸摸點的坐標信息:

????????每個位置信息都由16+16+16位數(shù)據(jù)表示, 第一個16位是x的位置數(shù)據(jù), 第二個16位是y的位置數(shù)據(jù), 第三個是位置上的觸摸面積。每個16位又由兩個寄存器的8位數(shù)據(jù)構成,先是低8位,后是高8位。寄存器0x8150中讀出x的低8位數(shù)據(jù),然后讀出寄存器0x8151讀出x的高8位數(shù)據(jù),把數(shù)據(jù)組合成x的16位的數(shù)據(jù),y的數(shù)據(jù), 觸摸面積數(shù)據(jù)讀出方式一樣。
代碼如下所示:
????????至此,GT911觸摸屏驅動編寫完成,最后可以測試下是否正常,這里的測試方法是,結合上篇文章,檢測到觸摸點后,在觸摸點處畫一個半徑5的實心圓,測試代碼截圖如下:

最終效果如下圖:

????????視頻演示效果請轉至(開源)TFTLCD開發(fā)記錄--觸摸屏
????????視頻下方簡介有完整的工程代碼開源github上,有需要的小伙伴請自行下載在