1. 程式人生 > 其它 >10外接觸控式螢幕_探索者 STM32F407 開發板資料連載第三十三章 觸控式螢幕實驗

10外接觸控式螢幕_探索者 STM32F407 開發板資料連載第三十三章 觸控式螢幕實驗

技術標籤:10外接觸控式螢幕

)實驗平臺:alientek 阿波羅 STM32F767 開發板

2)摘自《STM32F7 開發指南(HAL 庫版)》關注官方微訊號公眾號,獲取更多資料:正點原子

14af0b23292461a73acb3f3b80065b53.png

第三十三章 觸控式螢幕實驗

本章,我們將介紹如何使用 STM32F4 來驅動觸控式螢幕,ALIENTEK 探索者 STM32F4 開發板

本身並沒有觸控式螢幕控制器,但是它支援觸控式螢幕,可以通過外接帶觸控式螢幕的 LCD 模組(比如

ALIENTEK TFTLCD 模組),來實現觸控式螢幕控制。在本章中,我們將向大家介紹 STM32 控制

ALIENTKE TFTLCD 模組(包括電阻觸控與電容觸控),實現觸控式螢幕驅動,最終實現一個手寫

板的功能。本章分為如下幾個部分:

33.1 電阻與電容觸控式螢幕簡介

33.2 硬體設計

33.3 軟體設計

33.4 下載驗證

33.1 觸控式螢幕簡介

目前最常用的觸控式螢幕有兩種:電阻式觸控式螢幕與電容式觸控式螢幕。下面,我們來分別介紹。

33.1.1 電阻式觸控式螢幕

在 Iphone 面世之前,幾乎清一色的都是使用電阻式觸控式螢幕,電阻式觸控式螢幕利用壓力感應進

行觸點檢測控制,需要直接應力接觸,通過檢測電阻來定位觸控位置。

ALIENTEK 2.4/2.8/3.5 寸 TFTLCD 模組自帶的觸控式螢幕都屬於電阻式觸控式螢幕,下面簡單介紹

下電阻式觸控式螢幕的原理。

電阻觸控式螢幕的主要部分是一塊與顯示器表面非常配合的電阻薄膜屏,這是一種多層的複合

薄膜,它以一層玻璃或硬塑料平板作為基層,表面塗有一層透明氧化金屬(透明的導電電阻)

導電層,上面再蓋有一層外表面硬化處理、光滑防擦的塑料層、它的內表面也塗有一層塗層、

在他們之間有許多細小的(小於 1/1000 英寸)的透明隔離點把兩層導電層隔開絕緣。 當手指

觸控式螢幕幕時,兩層導電層在觸控點位置就有了接觸,電阻發生變化,在 X 和 Y 兩個方向上產生

訊號,然後送觸控式螢幕控制器。控制器偵測到這一接觸並計算出(X,Y)的位置,再根據獲得的

位置模擬滑鼠的方式運作。這就是電阻技術觸控式螢幕的最基本的原理。

電阻觸控式螢幕的優點:精度高、價格便宜、抗干擾能力強、穩定性好。

電阻觸控式螢幕的缺點:容易被劃傷、透光性不太好、不支援多點觸控。

從以上介紹可知,觸控式螢幕都需要一個 AD 轉換器, 一般來說是需要一個控制器的。

ALIENTEK TFTLCD 模組選擇的是四線電阻式觸控式螢幕,這種觸控式螢幕的控制晶片有很多,包括:

ADS7843、ADS7846、TSC2046、XPT2046 和 AK4182 等。這幾款晶片的驅動基本上是一樣的,

也就是你只要寫出了 ADS7843 的驅動,這個驅動對其他幾個晶片也是有效的。而且封裝也有一

樣的,完全 PIN TO PIN 相容。所以在替換起來,很方便。

ALIENTEK TFTLCD 模組自帶的觸控式螢幕控制晶片為 XPT2046。XPT2046 是一款 4 導線制觸

摸屏控制器,內含 12 位解析度 125KHz 轉換速率逐步逼近型 A/D 轉換器。XPT2046 支援從 1.5V

到 5.25V 的低電壓 I/O 介面。XPT2046 能通過執行兩次 A/D 轉換查出被按的螢幕位置, 除此

之外,還可以測量加在觸控式螢幕上的壓力。內部自帶 2.5V 參考電壓可以作為輔助輸入、溫度測量

和電池監測模式之用,電池監測的電壓範圍可以從 0V 到 6V。XPT2046 片內整合有一個溫度傳

感器。 在 2.7V 的典型工作狀態下,關閉參考電壓,功耗可小於 0.75mW。XPT2046 採用微小

的封裝形式:TSSOP-16,QFN-16(0.75mm 厚度)和 VFBGA-48。工作溫度範圍為-40℃~+85℃。

該晶片完全是相容 ADS7843 和 ADS7846 的,關於這個晶片的詳細使用,可以參考這兩個

晶片的 datasheet。

電阻式觸控式螢幕就介紹到這裡。

33.1.2 電容式觸控式螢幕

現在幾乎所有智慧手機,包括平板電腦都是採用電容屏作為觸控式螢幕,電容屏是利用人體感

應進行觸點檢測控制,不需要直接接觸或只需要輕微接觸,通過檢測感應電流來定位觸控座標。

ALIENTEK 4.3/7 寸 TFTLCD 模組自帶的觸控式螢幕採用的是電容式觸控式螢幕,下面簡單介紹下

電容式觸控式螢幕的原理。

電容式觸控式螢幕主要分為兩種:

1、 表面電容式電容觸控式螢幕。

表面電容式觸控式螢幕技術是利用 ITO(銦錫氧化物,是一種透明的導電材料)導電膜,通過電

場感應方式感測螢幕表面的觸控行為進行。但是表面電容式觸控式螢幕有一些侷限性,它只能識別

一個手指或者一次觸控。

2、 投射式電容觸控式螢幕。

投射電容式觸控式螢幕是感測器利用觸控式螢幕電極發射出靜電場線。一般用於投射電容感測技術

的電容型別有兩種:自我電容和互動電容。

自我電容又稱絕對電容,是最廣為採用的一種方法,自我電容通常是指掃描電極與地構成

的電容。在玻璃表面有用 ITO 製成的橫向與縱向的掃描電極,這些電極和地之間就構成一個電

容的兩極。當用手或觸控筆觸控的時候就會並聯一個電容到電路中去,從而使在該條掃描線上

的總體的電容量有所改變。在掃描的時候,控制 IC 依次掃描縱向和橫向電極,並根據掃描前後

的電容變化來確定觸控點座標位置。膝上型電腦觸控輸入板就是採用的這種方式,膝上型電腦

的輸入板採用 X*Y 的感測電極陣列形成一個感測格子,當手指靠近觸控輸入板時,在手指和傳

感電極之間產生一個小量電荷。採用特定的運演算法則處理來自行、列感測器的訊號來確定手指

的位置。

互動電容又叫做跨越電容,它是在玻璃表面的橫向和縱向的 ITO 電極的交叉處形成電容。

互動電容的掃描方式就是掃描每個交叉處的電容變化,來判定觸控點的位置。當觸控的時候就

會影響到相鄰電極的耦合,從而改變交叉處的電容量,互動電容的掃面方法可以偵測到每個交

叉點的電容值和觸控後電容變化,因而它需要的掃描時間與自我電容的掃描方式相比要長一些,

需要掃描檢測 X*Y 根電極。目前智慧手機/平板電腦等的觸控式螢幕,都是採用互動電容技術。

ALIENTEK 所選擇的電容觸控式螢幕,也是採用的是投射式電容屏(互動電容型別),所以後

面僅以投射式電容屏作為介紹。

透射式電容觸控式螢幕採用縱橫兩列電極組成感應矩陣,來感應觸控。以兩個交叉的電極矩陣,

即: X 軸電極和 Y 軸電極,來檢測每一格感應單元的電容變化,如圖 33.1.2.1 所示:

c0ee25e7d4505dddca587f0c8406cba1.png

圖 33.1.2.1 投射式電容屏電極矩陣示意圖

示意圖中的電極,實際是透明的,這裡是為了方便大家理解。圖中,X、Y 軸的透明電極

電容屏的精度、解析度與 X、Y 軸的通道數有關,通道數越多,精度越高。以上就是電容觸控

屏的基本原理,接下來看看電容觸控式螢幕的優缺點:

電容觸控式螢幕的優點:手感好、無需校準、支援多點觸控、透光性好。

電容觸控式螢幕的缺點:成本高、精度不高、抗干擾能力差。

這裡特別提醒大家電容觸控式螢幕對工作環境的要求是比較高的,在潮溼、多塵、高低溫環境

下面,都是不適合使用電容屏的。

電容觸控式螢幕一般都需要一個驅動 IC 來檢測電容觸控,且一般是通過 IIC 介面輸出觸控資料

的。ALIENTEK 7’ TFTLCD 模組的電容觸控式螢幕,採用的是 15*10 的驅動結構(10 個感應通道,

15 個驅動通道),採用的是 GT811/FT5206 做為驅動 IC。ALIENTEK 4.3’ TFTLCD 模組有兩種

成觸控式螢幕:1,使用 OTT2001A 作為驅動 IC,採用 13*8 的驅動結構(8 個感應通道,13 個驅動

通道);2,使用 GT9147 作為驅動 IC,採用 17*10 的驅動結構(10 個感應通道,17 個驅動通

道)。

這兩個模組都只支援最多 5 點觸控,本例程支援 ALIENTEK 的 4.3 寸屏模組和新版的 7 寸

屏模組(採用 SSD1963+FT5206 方案),電容觸控驅動 IC,這裡只介紹 OTT2001A 和 GT9147,

GT811/FT5206 的驅動方法同這兩款 IC 是類似的,大家可以參考著學習即可。

OTT2001A 是臺灣旭曜科技生產的一顆電容觸控式螢幕驅動 IC,最多支援 208 個通道。支援

SPI/IIC 介面,在 ALIENTEK 4.3’ TFTLCD 電容觸控式螢幕上,OTT2001A 只用了 104 個通道,採

用 IIC 介面。IIC 介面模式下,該驅動 IC 與 STM32F4 的連線僅需要 4 根線:SDA、SCL、RST

和 INT,SDA 和 SCL 是 IIC 通訊用的,RST 是復位腳(低電平有效),INT 是中斷輸出訊號,

關於 IIC 我們就不詳細介紹了,請參考第二十九章。

OTT2001A 的器件地址為 0X59(不含最低位,換算成讀寫命令則是讀:0XB3,寫:0XB2),

接下來,介紹一下 OTT2001A 的幾個重要的暫存器。

1, 手勢 ID 暫存器

手勢 ID 暫存器(00H)用於告訴 MCU,哪些點有效,哪些點無效,從而讀取對應的資料,

該暫存器各位描述如表 33.1.2.1 所示:

c75723c547a8284c110e27f9f85b8a9e.png 0e62ce18ac0902a4eccb985d1107966a.png

表 33.1.2.1 手勢 ID 暫存器

OTT2001A 支援最多 5 點觸控,所以表中只有 5 個位用來表示對應點座標是否有效,其餘

位為保留位(讀為 0),通過讀取該暫存器,我們可以知道哪些點有資料,哪些點無資料,如果

讀到的全是 0,則說明沒有任何觸控。

2, 感測器控制暫存器(ODH)

感測器控制暫存器(ODH),該暫存器也是 8 位,僅最高位有效,其他位都是保留,當最

高位為 1 的時候,開啟感測器(開始檢測),當最高位設定為 0 的時候,關閉感測器(停止檢測)。

3, 座標資料暫存器(共 20 個)

座標資料暫存器總共有 20 個,每個座標佔用 4 個暫存器,座標暫存器與座標的對應關係如

表 33.1.2.2 所示:

0fb6ce47f263be43d84ea2605bdb9d1d.png

表 33.1.2.2 座標暫存器與座標對應表

從表中可以看出,每個座標的值,可以通過 4 個暫存器讀出,比如讀取座標 1(X1,Y1),

我們則可以讀取 01H~04H,就可以知道當前座標 1 的具體數值了,這裡我們也可以只發送寄存

器 01,然後連續讀取 4 個位元組,也可以正常讀取座標 1,暫存器地址會自動增加,從而提高讀

取速度。

OTT2001A 相關暫存器的介紹就介紹到這裡,更詳細的資料,請參考:OTT2001A IIC 協議

指導.pdf 這個文件。OTT2001A 只需要經過簡單的初始化就可以正常使用了,初始化流程:復

位→延時 100ms→釋放復位→設定感測器控制暫存器的最高位位 1,開啟感測器檢查。就可以

正常使用了。

另外,OTT2001A 有兩個地方需要特別注意一下:

1,

OTT2001A 的暫存器是 8 位的,但是傳送的時候要傳送 16 位(高八位有效),才可

以正常使用。

2,

OTT2001A 的輸出座標,預設是以:X 座標最大值是 2700,Y 座標最大值是 1500

的解析度輸出的,也就是輸出範圍為:X:0~2700,Y:0~1500;MCU 在讀取到坐

標後,必須根據 LCD 解析度做一個換算,才能得到真實的 LCD 座標。

下面我們簡單介紹下 GT9147,該晶片是深圳匯頂科技研發的一顆電容觸控式螢幕驅動 IC,支

持 100Hz 觸點掃描頻率,支援 5 點觸控,支援 18*10 個檢測通道,適合小於 4.5 寸的電容觸控

屏使用。

和 OTT2001A 一樣,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 的型號,從而判斷是 OTT2001A 還是 GT9147,以便執行不同的初始化。

4,狀態暫存器(0X814E)

該暫存器各位描述如表 33.1.2.3 所示:

5de561f7aa79261174f7ad9a2a5427fb.png

表 33.1.2.3 狀態暫存器各位描述

這裡,我們僅關心最高位和最低 4 位,最高位用於表示 buffer 狀態,如果有資料(座標/

按鍵),buffer 就會是 1,最低 4 位用於表示有效觸點的個數,範圍是:0~5,0,表示沒有觸控,

5 表示有 5 點觸控。這和前面 OTT2001A 的表示方法稍微有點區別,OTT2001A 是每個位表示

一個觸點,這裡是有多少有效觸點值就是多少。最後,該暫存器在每次讀取後,如果 bit7 有效,

則必須寫 0,清除這個位,否則不會輸出下一次資料!!這個要特別注意!!!

5,座標資料暫存器(共 30 個)

這裡共分成 5 組(5 個點),每組 6 個暫存器儲存資料,以觸點 1 的座標資料暫存器組為例,

如表 33.1.2.4 所示:

8214bdb402e786591264b26e52dfae2e.png

表 33.1.2.4 觸點 1 座標暫存器組描述

我們一般只用到觸點的 x,y 座標,所以只需要讀取 0X8150~0X8153 的資料,組合即可得

到觸點座標。其他 4 組分別是:0X8158、0X8160、0X8168 和 0X8170 等開頭的 16 個暫存器組成,分別針對觸點 2~4 的座標。同樣 GT9147 也支援暫存器地址自增,我們只需要傳送暫存器

組的首地址,然後連續讀取即可,GT9147 會自動地址自增,從而提高讀取速度。

GT9147 相關暫存器的介紹就介紹到這裡,更詳細的資料,請參考:GT9147 程式設計指南.pdf

這個文件。

GT9147 只需要經過簡單的初始化就可以正常使用了,初始化流程:硬復位→延時 10ms→

結束硬復位→設定 IIC 地址→延時 100ms→軟復位→更新配置(需要時)→結束軟復位。此時

GT9147 即可正常使用了。

然後,我們不停的查詢 0X814E 暫存器,判斷是否有有效觸點,如果有,則讀取座標資料

暫存器,得到觸點座標,特別注意,如果 0X814E 讀到的值最高位為 1,就必須對該位寫 0,否

則無法讀到下一次座標資料。

電容式觸控式螢幕部分,就介紹到這裡。

33.2 硬體設計

本章實驗功能簡介:開機的時候先初始化 LCD,讀取 LCD ID,隨後,根據 LCD ID 判斷

是電阻觸控式螢幕還是電容觸控式螢幕,如果是電阻觸控式螢幕,則先讀取 24C02 的資料判斷觸控式螢幕是否已

經校準過,如果沒有校準,則執行校準程式,校準過後再進入電阻觸控式螢幕測試程式,如果已經

校準了,就直接進入電阻觸控式螢幕測試程式。

如果是 4.3 寸電容觸控式螢幕,則先讀取晶片 ID,判斷是不是 GT9147,如果是則執行 GT9147

的初始化程式碼,如果不是,則執行 OTT2001A 的初始化程式碼;如果是 7 寸電容觸控式螢幕(僅支援

新款 7 寸屏,使用 SSD1963+FT5206 方案),則執行 FT5206 的初始化程式碼,在初始化電容觸

摸屏完成後,進入電容觸控式螢幕測試程式(電容觸控式螢幕無需校準!!)。

電阻觸控式螢幕測試程式和電容觸控式螢幕測試程式基本一樣,只是電容觸控式螢幕支援最多 5 點同時

觸控,電阻觸控式螢幕只支援一點觸控,其他一模一樣。測試介面的右上角會有一個清空的操作區

域(RST),點選這個地方就會將輸入全部清除,恢復白板狀態。使用電阻觸控式螢幕的時候,可

以通過按 KEY0 來實現強制觸控式螢幕校準,只要按下 KEY0 就會進入強制校準程式。

所要用到的硬體資源如下:

1) 指示燈 DS0

2) KEY0 按鍵

3) TFTLCD 模組(帶電阻/電容式觸控式螢幕)

4) 24C02

所有這些資源與 STM32F4 的連線圖,在前面都已經介紹了,這裡我們只針對 TFTLCD 模

塊與 STM32F4 的連線埠再說明一下,TFTLCD 模組的觸控式螢幕(電阻觸控式螢幕)總共有 5 跟線

與 STM32F4 連線,連線電路圖如圖 33.2.1 所示:

0bbf629fa8c1047564e2996a9249061a.png

圖 33.2.1 觸控式螢幕與 STM32F4 的連線圖

從圖中可以看出, T_MOSI、T_MISO、T_SCK、T_CS 和 T_PEN 分別連線在 STM32F4 的:PF11、

PB2、PB0、PC13 和 PB1 上。

如果是電容式觸控式螢幕,我們的介面和電阻式觸控式螢幕一樣(上圖右側介面),只是沒有用到

五根線了,而是四根線,分別是: T_PEN(CT_INT) 、 T_CS(CT_RST) 、 T_CLK(CT_SCL) 和

T_MOSI(CT_SDA)。其中:CT_INT、CT_RST、CT_SCL 和 CT_SDA 分別是 OTT2001A/GT9147/FT5206

的:中斷輸出訊號、復位訊號,IIC 的 SCL 和 SDA 訊號。這裡,我們用查詢的方式讀取

OTT2001A/GT9147/FT5206 的資料,對於 OTT2001A/FT5206 沒有用到中斷訊號(CT_INT),所以

同 STM32F4 的連線,只需要 3 根線即可,不過 GT9147 還需要用到 CT_INT 做 IIC 地址設定,所

以需要 4 根線連線。

33.3 軟體設計

開啟本章實驗工程目錄可以看到,我們在 HARDWARE 資料夾下新建了一個 TOUCH 檔案

夾,然後新建了 touch.c、touch.h、ctiic.c、ctiic.h、ott2001a.c、ott2001a.h、gt9147.c、gt9147.h、

ft5206.c 和 ft5206.h 等十個檔案用來存放觸控式螢幕相關的程式碼。同時引入這些原始檔到工程

HARDWARE 分組之下,並將 TOUCH 資料夾加入標頭檔案包含路徑。其中,touch.c 和 touch.h

是電阻觸控式螢幕部分的程式碼,順帶兼電容觸控式螢幕的管理控制,其他則是電容觸控式螢幕部分的程式碼。

開啟 touch.c 檔案,裡面主要是與觸控式螢幕相關的程式碼(主要是電阻觸控式螢幕的程式碼),這裡我

們也不全部貼出來了,僅介紹幾個重要的函式。

首先我們要介紹的是 TP_Read_XY2 這個函式,該函式專門用於從電阻式觸控式螢幕控制 IC 讀取

座標的值(0~4095),TP_Read_XY2 的程式碼如下:

//連續 2 次讀取觸控式螢幕 IC,且這兩次的偏差不能超過//ERR_RANGE,滿足條件,則認為讀數正確,否則讀數錯誤.//該函式能大大提高準確度//x,y:讀取到的座標值//返回值:0,失敗;1,成功。#define ERR_RANGE 50 //誤差範圍u8 TP_Read_XY2(u16 *x,u16 *y){u16 x1,y1;u16 x2,y2;u8 flag; flag=TP_Read_XY(&x1,&y1); if(flag==0)return(0); flag=TP_Read_XY(&x2,&y2); if(flag==0)return(0);//前後兩次取樣在+-50 內 if(((x2<=x1&&x1

該函式採用了一個非常好的辦法來讀取螢幕座標值,就是連續讀兩次,兩次讀取的值之差

不能超過一個特定的值(ERR_RANGE),通過這種方式,我們可以大大提高觸控式螢幕的準確度。另

外該函式呼叫的 TP_Read_XY 函式,用於單次讀取座標值。TP_Read_XY 也採用了一些軟體濾波

演算法,具體見光碟的原始碼。接下來,我們介紹另外一個函式 TP_Adjust,該函式原始碼如下:

/觸控式螢幕校準程式碼//得到四個校準引數void TP_Adjust(void){u16 pos_temp[4][2];//座標快取值u8 cnt=0; u32 tem1,tem2;u16 d1,d2; u16 outtime=0;double fac;POINT_COLOR=BLUE;BACK_COLOR =WHITE;LCD_Clear(WHITE);//清屏POINT_COLOR=RED;//紅色LCD_Clear(WHITE);//清屏POINT_COLOR=BLACK;LCD_ShowString(40,40,160,100,16,(u8*)TP_REMIND_MSG_TBL);//顯示提示資訊TP_Drow_Touch_Point(20,20,RED);//畫點 1tp_dev.sta=0;//消除觸發訊號tp_dev.xfac=0;//xfac 用來標記是否校準過,所以校準之前必須清掉!以免錯誤while(1)//如果連續 10 秒鐘沒有按下,則自動退出{tp_dev.scan(1);//掃描物理座標if((tp_dev.sta&0xc0)==TP_CATH_PRES) //按鍵按下了一次(此時按鍵鬆開了.){outtime=0;tp_dev.sta&=~(1<<6);//標記按鍵已經被處理過了pos_temp[cnt][0]=tp_dev.x;pos_temp[cnt][1]=tp_dev.y;cnt++;switch(cnt){case 1:TP_Drow_Touch_Point(20,20,WHITE);//清除點 1TP_Drow_Touch_Point(lcddev.width-20,20,RED);//畫點 2break;case 2:TP_Drow_Touch_Point(lcddev.width-20,20,WHITE); //清除點 2TP_Drow_Touch_Point(20,lcddev.height-20,RED); //畫點 3break;case 3:TP_Drow_Touch_Point(20,lcddev.height-20,WHITE);//清除點 3TP_Drow_Touch_Point(lcddev.width-20,lcddev.height-20,RED);//畫點 4break;case 4://全部四個點已經得到//對邊相等tem1=abs(pos_temp[0][0]-pos_temp[1][0]);//x1-x2tem2=abs(pos_temp[0][1]-pos_temp[1][1]);//y1-y2tem1*=tem1;tem2*=tem2;d1=sqrt(tem1+tem2);//得到 1,2 的距離tem1=abs(pos_temp[2][0]-pos_temp[3][0]);//x3-x4tem2=abs(pos_temp[2][1]-pos_temp[3][1]);//y3-y4tem1*=tem1;tem2*=tem2;d2=sqrt(tem1+tem2);//得到 3,4 的距離fac=(float)d1/d2;if(fac<0.95||fac>1.05||d1==0||d2==0)//不合格{cnt=0; TP_Drow_Touch_Point(lcddev.width-20,lcddev.height-20,WHITE);//清除點 4TP_Drow_Touch_Point(20,20,RED); //畫點 1TP_Adj_Info_Show(pos_temp[0][0],pos_temp[0][1],pos_temp[1][0],pos_temp[1][1],pos_temp[2][0],pos_temp[2][1],pos_temp[3][0],pos_temp[3][1],fac*100);//顯示資料continue;}tem1=abs(pos_temp[0][0]-pos_temp[2][0]);//x1-x3tem2=abs(pos_temp[0][1]-pos_temp[2][1]);//y1-y3tem1*=tem1;tem2*=tem2;d1=sqrt(tem1+tem2);//得到 1,3 的距離tem1=abs(pos_temp[1][0]-pos_temp[3][0]);//x2-x4tem2=abs(pos_temp[1][1]-pos_temp[3][1]);//y2-y4tem1*=tem1;tem2*=tem2;d2=sqrt(tem1+tem2);//得到 2,4 的距離fac=(float)d1/d2;if(fac<0.95||fac>1.05)//不合格{cnt=0;TP_Drow_Touch_Point(lcddev.width-20,lcddev.height-20,WHITE); //清除點 4TP_Drow_Touch_Point(20,20,RED); //畫點 1 TP_Adj_Info_Show(pos_temp[0][0],pos_temp[0][1],pos_temp[1][0],pos_temp[1][1],pos_temp[2][0],pos_temp[2][1],pos_temp[3][0],pos_temp[3][1],fac*100);//顯示資料continue;}//正確了//對角線相等tem1=abs(pos_temp[1][0]-pos_temp[2][0]);//x1-x3tem2=abs(pos_temp[1][1]-pos_temp[2][1]);//y1-y3tem1*=tem1;tem2*=tem2;d1=sqrt(tem1+tem2);//得到 1,4 的距離tem1=abs(pos_temp[0][0]-pos_temp[3][0]);//x2-x4tem2=abs(pos_temp[0][1]-pos_temp[3][1]);//y2-y4tem1*=tem1;tem2*=tem2;d2=sqrt(tem1+tem2);//得到 2,3 的距離fac=(float)d1/d2;if(fac<0.95||fac>1.05)//不合格{cnt=0;TP_Drow_Touch_Point(lcddev.width-20,lcddev.height-20,WHITE); //清除點 4TP_Drow_Touch_Point(20,20,RED);//畫點 1TP_Adj_Info_Show(pos_temp[0][0],pos_temp[0][1],pos_temp[1][0],pos_temp[1][1],pos_temp[2][0],pos_temp[2][1],pos_temp[3][0],pos_temp[3][1],fac*100);//顯示資料continue;}//正確了//計算結果 tp_dev.xfac=(float)(lcddev.width-40)/(pos_temp[1][0]-pos_temp[0][0]);//得到 xfactp_dev.xoff=(lcddev.width-tp_dev.xfac*(pos_temp[1][0]+pos_temp[0][0]))/2;//得到 xoff tp_dev.yfac=(float)(lcddev.height-40)/(pos_temp[2][1]-pos_temp[0][1]);//得到 yfac tp_dev.yoff=(lcddev.height-tp_dev.yfac*(pos_temp[2][1]+pos_temp[0][1]))/2;//得到 yoffif(abs(tp_dev.xfac)>2||abs(tp_dev.yfac)>2)//觸屏和預設的相反了.{cnt=0;TP_Drow_Touch_Point(lcddev.width-20,lcddev.height-20,WHITE);//清除點 4TP_Drow_Touch_Point(20,20,RED); //畫點 1LCD_ShowString(40,26,lcddev.width,lcddev.height,16,"TP Needreadjust!");tp_dev.touchtype=!tp_dev.touchtype;//修改觸屏型別.if(tp_dev.touchtype)//X,Y 方向與螢幕相反{CMD_RDX=0X90; CMD_RDY=0XD0;}else {CMD_RDX=0XD0;CMD_RDY=0X90;}//X,Y 方向與螢幕相同continue;}POINT_COLOR=BLUE;LCD_Clear(WHITE);//清屏LCD_ShowString(35,110,lcddev.width,lcddev.height,16,"Touch ScreenAdjust OK!");//校正完成delay_ms(1000);TP_Save_Adjdata();LCD_Clear(WHITE);//清屏return;//校正完成}}delay_ms(10); outtime++;if(outtime>1000) { TP_Get_Adjdata();break; }}}/

TP_Adjust 是此部分最核心的程式碼,在這裡,給大家介紹一下我們這裡所使用的觸控式螢幕校

正原理:我們傳統的滑鼠是一種相對定位系統,只和前一次滑鼠的位置座標有關。而觸控式螢幕則

是一種絕對座標系統,要選哪就直接點哪,與相對定位系統有著本質的區別。絕對座標系統的

特點是每一次定位座標與上一次定位座標沒有關係,每次觸控的資料通過校準轉為螢幕上的坐

標,不管在什麼情況下,觸控式螢幕這套座標在同一點的輸出資料是穩定的。不過由於技術原理的

原因,並不能保證同一點觸控每一次取樣資料相同,不能保證絕對座標定位,點不準,這就是

觸控式螢幕最怕出現的問題:漂移。對於效能質量好的觸控式螢幕來說,漂移的情況出現並不是很嚴重。

所以很多應用觸控式螢幕的系統啟動後,進入應用程式前,先要執行校準程式。 通常應用程式中使

用的 LCD 座標是以畫素為單位的。比如說:左上角的座標是一組非 0 的數值,比如(20,20),

而右下角的座標為(220,300)。這些點的座標都是以畫素為單位的,而從觸控式螢幕中讀出的是點

的物理座標,其座標軸的方向、XY 值的比例因子、偏移量都與 LCD 座標不同,所以,需要在

程式中把物理座標首先轉換為畫素座標,然後再賦給 POS 結構,達到座標轉換的目的。

校正思路:在瞭解了校正原理之後,我們可以得出下面的一個從物理座標到畫素座標的轉

換關係式:

LCDx=xfac*Px+xoff;LCDy=yfac*Py+yoff;

其中(LCDx,LCDy)是在 LCD 上的畫素座標,(Px,Py)是從觸控式螢幕讀到的物理座標。xfac,

yfac 分別是 X 軸方向和 Y 軸方向的比例因子,而 xoff 和 yoff 則是這兩個方向的偏移量。

這樣我們只要事先在螢幕上面顯示 4 個點(這四個點的座標是已知的),分別按這四個點就

可以從觸控式螢幕讀到 4 個物理座標,這樣就可以通過待定係數法求出 xfac、yfac、xoff、yoff 這四

個引數。我們儲存好這四個引數,在以後的使用中,我們把所有得到的物理座標都按照這個關

系式來計算,得到的就是準確的螢幕座標。達到了觸控式螢幕校準的目的。

TP_Adjust 就 是根 據 上面 的 原理 設 計的 校準函 數 ,注 意 該函 數裡面 多 次使 用 了

lcddev.width和lcddev.height,用於座標設定,主要是為了相容不同尺寸的LCD(比如320*240、

480*320 和 800*480 的屏都可以相容)。

接下來看看觸控式螢幕初始化函式:TP_Init,該函式根據 LCD 的 ID(即 lcddev.id)判別是電

阻屏還是電容屏,執行不同的初始化,該函式程式碼如下:

//觸控式螢幕初始化//返回值:0,沒有進行校準 1,進行過校準u8 TP_Init(void){if(lcddev.id==0X5510)//電容觸控式螢幕{if(GT9147_Init()==0) //是 GT9147?{tp_dev.scan=GT9147_Scan; //掃描函式指向 GT9147 觸控式螢幕掃描}else{OTT2001A_Init();tp_dev.scan=OTT2001A_Scan;//掃描函式指向 OTT2001A 觸控式螢幕掃描}tp_dev.touchtype|=0X80;//電容屏tp_dev.touchtype|=lcddev.dir&0X01;//橫屏還是豎屏return 0;} else if(lcddev.id==0X1963){FT5206_Init();tp_dev.scan=FT5206_Scan;//掃描函式指向 GT9147 觸控式螢幕掃描tp_dev.touchtype|=0X80;//電容屏tp_dev.touchtype|=lcddev.dir&0X01;//橫屏還是豎屏return 0;} else{ __HAL_RCC_GPIOB_CLK_ENABLE();//開啟 GPIOB 時鐘__HAL_RCC_GPIOC_CLK_ENABLE();//開啟 GPIOC 時鐘__HAL_RCC_GPIOF_CLK_ENABLE();//開啟 GPIOF 時鐘//GPIOB1,2 初始化設定GPIO_Initure.Pin=GPIO_PIN_1|GPIO_PIN_2;//PB1/PB2 設定為上拉輸入GPIO_Initure.Mode=GPIO_MODE_INPUT;//輸入模式GPIO_Initure.Pull=GPIO_PULLUP;//上拉GPIO_Initure.Speed=GPIO_SPEED_HIGH;//高速HAL_GPIO_Init(GPIOB,&GPIO_Initure);//初始化//PB0GPIO_Initure.Pin=GPIO_PIN_0;//PB0 設定為推輓輸出GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推輓輸出HAL_GPIO_Init(GPIOB,&GPIO_Initure);//初始化//PC13GPIO_Initure.Pin=GPIO_PIN_13;//PC13 設定為推輓輸出HAL_GPIO_Init(GPIOC,&GPIO_Initure);//初始化//PF11GPIO_Initure.Pin=GPIO_PIN_11;//PF11 設定推輓輸出HAL_GPIO_Init(GPIOF,&GPIO_Initure);//初始化TP_Read_XY(&tp_dev.x[0],&tp_dev.y[0]);//第一次讀取初始化AT24CXX_Init();//初始化 24CXXif(TP_Get_Adjdata())return 0;//已經校準else//未校準?{LCD_Clear(WHITE);//清屏TP_Adjust();//螢幕校準TP_Save_Adjdata();}TP_Get_Adjdata();}return 1;}

該函式比較簡單,重點說一下:tp_dev.scan,這個結構體函式指標,預設是指向 TP_Scan

的,如果是電阻屏則用預設的即可,如果是電容屏,則指向新的掃描函式 GT9147_Scan、

OTT2001A_Scan 或 FT5206_Scan(根據晶片 ID 判斷到底指向那個),執行電容觸控式螢幕的掃描函

數,這幾個函式在後續會介紹。

其他的函式我們這裡就不多介紹了,接下來開啟 touch.h 檔案,程式碼如下:

#define TP_PRES_DOWN 0x80 //觸屏被按下#define TP_CATH_PRES 0x40 //有按鍵按下了#define CT_MAX_TOUCH 5//電容屏支援的點數,固定為 5 點//觸控式螢幕控制器typedef struct{u8 (*init)(void);//初始化觸控式螢幕控制器u8 (*scan)(u8);//掃描觸控式螢幕.0,螢幕掃描;1,物理座標;void (*adjust)(void);//觸控式螢幕校準u16 x[CT_MAX_TOUCH]; //當前座標u16 y[CT_MAX_TOUCH]; //電容屏有最多 5 組座標,電阻屏則用 x[0],y[0]代表: 此次//掃描時觸屏的座標,用 x[4],y[4]儲存第一次按下時的座標.u8 sta;//筆的狀態//b7:按下 1/鬆開 0; //b6:0,沒有按鍵按下;1,有按鍵按下.//b5:保留//b4~b0:電容觸控式螢幕按下的點數(0,表示未按下,1 表示按下)/觸控式螢幕校準引數(電容屏不需要校準)//float xfac;float yfac;short xoff;short yoff;//新增的引數,當觸控式螢幕的左右上下完全顛倒時需要用到.//b0:0,豎屏(適合左右為 X 座標,上下為 Y 座標的 TP)// 1,橫屏(適合左右為 Y 座標,上下為 X 座標的 TP)//b1~6:保留.//b7:0,電阻屏// 1,電容屏u8 touchtype;}_m_tp_dev;extern _m_tp_dev tp_dev;//觸屏控制器在 touch.c 裡面定義//電阻屏晶片連線引腳#define PENPBin(1)//T_PEN#define DOUTPBin(2) //T_MISO#define TDINPFout(11) //T_MOSI#define TCLKPBout(0) //T_SCK#define TCSPCout(13) //T_CS//電阻屏函式void TP_Write_Byte(u8 num);//向控制晶片寫入一個數據u16 TP_Read_AD(u8 CMD);//讀取 AD 轉換值u16 TP_Read_XOY(u8 xy);//帶濾波的座標讀取(X/Y)……(//省略部分程式碼)u8 TP_Scan(u8 tp);//掃描u8 TP_Init(void);//初始化#endif

上述程式碼,我們重點看看_m_tp_dev 結構體,改結構體用於管理和記錄觸控式螢幕(包括電阻

觸控式螢幕與電容觸控式螢幕)相關資訊。通過結構體,在使用的時候,我們一般直接呼叫 tp_dev 的相

關成員函式/變數屏即可達到需要的效果,這種設計簡化了介面,且方便管理和維護,大家可以

效仿一下。

ctiic.c 和 ctiic.h 是電容觸控式螢幕的 IIC 介面部分程式碼,與第二十九章的 myiic.c 和 myiic.h 基本

一樣,這裡就不單獨介紹了。接下來看看檔案 ott2001a.c 程式碼如下:

//向 OTT2001A 寫入一次資料//reg:起始暫存器地址//buf:資料緩快取區//len:寫資料長度//返回值:0,成功;1,失敗.u8 OTT2001A_WR_Reg(u16 reg,u8 *buf,u8 len){u8 i; u8 ret=0;CT_IIC_Start();CT_IIC_Send_Byte(OTT_CMD_WR);CT_IIC_Wait_Ack();//傳送寫命令CT_IIC_Send_Byte(reg>>8); CT_IIC_Wait_Ack();//傳送高 8 位地址CT_IIC_Send_Byte(reg&0XFF); CT_IIC_Wait_Ack(); //傳送低 8 位地址for(i=0;i>8); CT_IIC_Wait_Ack();//傳送高 8 位地址CT_IIC_Send_Byte(reg&0XFF); CT_IIC_Wait_Ack(); //傳送低 8 位地址CT_IIC_Start();CT_IIC_Send_Byte(OTT_CMD_RD); CT_IIC_Wait_Ack();//傳送讀命令for(i=0;i240)t=10;//重新從 10 開始計數return res;}

此部分總共 5 個函式,其中 OTT2001A_WR_Reg 和 OTT2001A_RD_Reg 分別用於讀寫

OTT2001A 晶片,這裡特別注意暫存器地址是 16 位的,與 OTT2001A 手冊介紹的是有出入的,

必須 16 位才能正常操作。另外,重點介紹下 OTT2001A_Scan 函式,OTT2001A_Scan 函式用

於掃描電容觸控式螢幕是否有按鍵按下,由於我們不是用的中斷方式來讀取 OTT2001A 的資料的,

而是採用查詢的方式,所以這裡使用了一個靜態變數來提高效率,當無觸控的時候,儘量減少

對 CPU 的佔用,當有觸控的時候,又保證能迅速檢測到。至於對 OTT2001A 資料的讀取,則

完全是我們在上面介紹的方法,先讀取手勢 ID 暫存器(OTT_GSTID_REG),判斷是不是有有

效資料,如果有,則讀取,否則直接忽略,繼續後面的處理。

其他的函式我們這裡就不多介紹了,接下來看下 gt9147.c 裡面的程式碼,這裡我們僅介紹

GT9147_Init 和 GT9147_Scan 兩個函式,程式碼如下:

//初始化 GT9147 觸控式螢幕//返回值:0,初始化成功;1,初始化失敗u8 GT9147_Init(void){u8 temp[5];__HAL_RCC_GPIOB_CLK_ENABLE();//開啟 GPIOB 時鐘 __HAL_RCC_GPIOC_CLK_ENABLE();//開啟 GPIOC 時鐘 //PB1 GPIO_Initure.Pin=GPIO_PIN_1;//PB1 設定為上拉輸入 GPIO_Initure.Mode=GPIO_MODE_INPUT; //輸入 GPIO_Initure.Pull=GPIO_PULLUP;//上拉 GPIO_Initure.Speed=GPIO_SPEED_HIGH;//高速 HAL_GPIO_Init(GPIOB,&GPIO_Initure);//初始化 //PC13 GPIO_Initure.Pin=GPIO_PIN_13;//PC13 設定為推輓輸出 GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推輓輸出 HAL_GPIO_Init(GPIOC,&GPIO_Initure);//初始化CT_IIC_Init();//初始化電容屏的 I2C 匯流排GT_RST=0;//復位delay_ms(10);GT_RST=1;//釋放復位delay_ms(10);GPIO_Initure.Pin=GPIO_PIN_1;//PB1 設定為上拉輸入 GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //輸出模式 GPIO_Initure.Pull=GPIO_NOPULL;//無上下拉 GPIO_Initure.Speed=GPIO_SPEED_HIGH;//高速 HAL_GPIO_Init(GPIOB,&GPIO_Initure);//初始化delay_ms(100);GT9147_RD_Reg(GT_PID_REG,temp,4);//讀取產品 IDtemp[4]=0;printf("CTP ID:%s",temp);//列印 IDif(strcmp((char*)temp,"9147")==0)//ID==9147{temp[0]=0X02;GT9147_WR_Reg(GT_CTRL_REG,temp,1);//軟復位 GT9147GT9147_RD_Reg(GT_CFGS_REG,temp,1);//讀取 GT_CFGS_REG 暫存器if(temp[0]<0X60)//預設版本比較低,需要更新 flash 配置{printf("Default Ver:%d",temp[0]);GT9147_Send_Cfg(1);//更新並儲存配置}delay_ms(10);temp[0]=0X00;GT9147_WR_Reg(GT_CTRL_REG,temp,1);//結束復位return 0;}return 1;}const u16 GT9147_TPX_TBL[5]={GT_TP1_REG,GT_TP2_REG,GT_TP3_REG,GT_TP4_REG,GT_TP5_REG};//掃描觸控式螢幕(採用查詢方式)//mode:0,正常掃描.//返回值:當前觸屏狀態.//0,觸屏無觸控;1,觸屏有觸控u8 GT9147_Scan(u8 mode){u8 buf[4]; u8 i=0; u8 res=0; u8 temp;static u8 t=0;//控制查詢間隔,從而降低 CPU 佔用率t++;if((t%10)==0||t<10)//空閒時,每進入 10 次,函式才檢測 1 次,從而節省 CPU 使用率{GT9147_RD_Reg(GT_GSTID_REG,&mode,1);//讀取觸控點的狀態if((mode&0XF)&&((mode&0XF)<6)){temp=0XFF<240)t=10;//重新從 10 開始計數return res;}

以上程式碼,GT9147_Init 用於初始化 GT9147,該函式通過讀取 0X8140~0X8143 這 4 個寄存

器,並判斷是否是:“9147”,來確定是不是 GT9147 晶片,在讀取到正確的 ID 後,軟復位 GT9147,

然後根據當前晶片版本號,確定是否需要更新配置,通過 GT9147_Send_Cfg 函式,傳送配置信

息(一個數組),配置完後,結束軟復位,即完成 GT9147 初始化。GT9147_Scan 函式,用於讀

取觸控式螢幕座標資料,這個和前面的 OTT2001A_Scan 大同小異,大家看原始碼即可。

最後我們開啟 main.c,修改部分程式碼,這裡就不全部貼出來了,僅介紹三個重要的函式:

//5 個觸控點的顏色(電容觸控式螢幕用)const u16 POINT_COLOR_TBL[5]={RED,GREEN,BLUE,BROWN,GRED};//電阻觸控式螢幕測試函式void rtp_test(void){u8 key; u8 i=0;while(1){key=KEY_Scan(0);tp_dev.scan(0);if(tp_dev.sta&TP_PRES_DOWN)//觸控式螢幕被按下{if(tp_dev.x[0](lcddev.width-24)&&tp_dev.y[0]<16)Load_Drow_Dialog();else TP_Draw_Big_Point(tp_dev.x[0],tp_dev.y[0],RED);/畫圖}}else delay_ms(10);//沒有按鍵按下的時候if(key==KEY0_PRES) //KEY0 按下,則執行校準程式{LCD_Clear(WHITE); //清屏 TP_Adjust();//螢幕校準TP_Save_Adjdata();Load_Drow_Dialog();}i++;if(i%20==0)LED0=!LED0;}}//電容觸控式螢幕測試函式void ctp_test(void){u8 t=0; u8 i=0;u16 lastpos[5][2];//最後一次的資料while(1){tp_dev.scan(0);for(t=0;t<5;t++){if((tp_dev.sta)&(1<(lcddev.width-24)&&tp_dev.y[t]<20){Load_Drow_Dialog();//清除}}}else lastpos[t][0]=0XFFFF;}delay_ms(5);i++;if(i%20==0)LED0=!LED0;}}int main(void){HAL_Init(); //初始化 HAL 庫 Stm32_Clock_Init(336,8,2,7); //設定時鐘,168Mhzdelay_init(168); //初始化延時函式uart_init(115200); //初始化 USARTusmart_dev.init(84);//初始化 USMARTLED_Init();//初始化 LEDKEY_Init();//初始化 KEYLCD_Init();//初始化 LCDtp_dev.init(); //觸控式螢幕初始化 POINT_COLOR=RED;LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");LCD_ShowString(30,70,200,16,16,"TOUCH TEST");LCD_ShowString(30,90,200,16,16,"[email protected]");LCD_ShowString(30,110,200,16,16,"2017/4/14"); if(tp_dev.touchtype!=0XFF)LCD_ShowString(30,130,200,16,16,"Press KEY0 to Adjust");//電阻屏才顯示delay_ms(1500);Load_Drow_Dialog();if(tp_dev.touchtype&0X80)ctp_test();//電容屏測試else rtp_test();//電阻屏測試}

下面分別介紹一下這三個函式。

rtp_test,該函式用於電阻觸控式螢幕的測試,該函式程式碼比較簡單,就是掃描按鍵和觸控式螢幕,

如果觸控式螢幕有按下,則在觸控式螢幕上面劃線,如果按中“RST”區域,則執行清屏。如果按鍵 KEY0

按下,則執行觸控式螢幕校準。

ctp_test,該函式用於電容觸控式螢幕的測試,由於我們採用 tp_dev.sta 來標記當前按下的觸控

屏點數,所以判斷是否有電容觸控式螢幕按下,也就是判斷 tp_dev.sta 的最低 5 位,如果有資料,

則劃線,如果沒資料則忽略,且 5 個點劃線的顏色各不一樣,方便區分。另外,電容觸控式螢幕不

需要校準,所以沒有校準程式。

main 函式,則比較簡單,初始化相關外設,然後根據觸控式螢幕型別,去選擇執行 ctp_test 還

是 rtp_test。

軟體部分就介紹到這裡,接下來看看下載驗證。

33.4 下載驗證

在程式碼編譯成功之後,我們通過下載程式碼到 ALIENTEK 探索者 STM32F4 開發板上,電阻

觸控式螢幕測試如圖 33.4.1 所示介面:

cf3e73b9ce6a4b0dbbbabfd1044c0e33.png

圖 33.4.1 電阻觸控式螢幕測試程式執行效果

圖中我們在電阻屏上畫了一些內容,右上角的 RST 可以用來清屏,點選該區域,即可清屏

重畫。另外,按 KEY0 可以進入校準模式,如果發現觸控式螢幕不準,則可以按 KEY0,進入校準,

重新校準一下,即可正常使用。

如果是電容觸控式螢幕,測試介面如圖 33.4.2 所示:

8e2a11dab08b5116efad4f48a2018449.png

圖 33.4.2 電容觸控式螢幕測試介面

圖中,同樣輸入了一些內容。電容屏支援多點觸控,每個點的顏色都不一樣,圖中的波浪

線就是三點觸控畫出來的,最多可以 5 點觸控。注意:電容觸控式螢幕支援:ALIENTEK 4.3 寸電

容觸控式螢幕模組或者 ALIENTEK 新款 7 寸電容觸控式螢幕模組(SSD1963+FT5206 方案),老款的 7

寸電容觸控式螢幕模組(CPLD+GT811 方案)本例程不支援!!

同樣,按右上角的 RST 標誌,可以清屏。電容屏無需校準,所以按 KEY0 無效。KEY0 校

準僅對電阻屏有效。