TFT-LCD 即薄膜晶體管液晶顯示器,其英文全稱爲:Thin Film Transistor-Liquid CrystalDisplay。TFT-LCD 與無源 TN-LCD、STN-LCD 的簡單矩陣不一樣,它在液晶顯示屏的每個象素上都設置有一個薄膜晶體管(TFT),可有效地克服非選通時的串擾,使顯示液晶屏的靜態特性與掃描線數無關,所以大大提升了圖像質量。TFT-LCD 也被叫作真彩液晶顯示器。ide
該模塊有以下特色:函數
本章,咱們以 2.8 寸的 ALIENTEK TFTLCD 模塊爲例介紹,該模塊支持 65K 色顯示,顯示分辨率爲 320×240,接口爲 16 位的 80 並口,自帶觸摸屏。ui
模塊原理圖如圖 18.1.1.2 所示:spa
TFTLCD 模塊採用 2*17 的 2.54 公排針與外部鏈接,接口定義如圖所示:設計
從圖能夠看出,ALIENTEK TFTLCD 模塊採用 16 位的並方式與外部鏈接,之因此不採用 8 位的方式,是由於彩屏的數據量比較大,尤爲在顯示圖片的時候,若是用 8 位數據線,就會比 16 位方式慢一倍以上,咱們固然但願速度越快越好,因此咱們選擇 16 位的接口。3d
該模塊的 80 並口有以下一些信號線:指針
須要說明的是,TFTLCD模塊的RST信號線是直接接到STM32的復位腳上,並不禁軟件控制,這樣能夠省下來一個 IO口。另外咱們還須要一個背光控制線來控制TFTLCD 的背光。因此,咱們總共須要的 IO口數目爲 21 個。這裏還須要注意,咱們標註的DB1~DB8,DB10~DB17,是相對於 LCD 控制 IC 標註的,實際上你們能夠把他們就等同於 D0~D15,這樣理解起來就比較簡單一點。xml
ILI9341 液晶控制器自帶顯存,其顯存總大小爲 172800(240*320*18/8),即 18 位模式(26萬色)下的顯存量。在 16 位模式下,ILI9341 採用 RGB565 格式存儲顏色數據,此時 ILI9341的 18 位數據線與 MCU 的 16 位數據線以及 LCD GRAM 的對應關係如圖所示:blog
從圖中能夠看出,ILI9341 在 16 位模式下面,數據線有用的是:D17~D13 和 D11~D1,D0和 D12 沒有用到,實際上在咱們 LCD 模塊裏面,ILI9341 的 D0 和 D12 壓根就沒有引出來,這樣,ILI9341 的 D17~D13 和 D11~D1 對應 MCU 的 D15~D0。接口
這樣 MCU 的 16 位數據,最低 5 位表明藍色,中間 6 位爲綠色,最高 5 位爲紅色。數值越大,表示該顏色越深。另外,特別注意 ILI9341 全部的指令都是 8 位的(高 8 位無效,且參數除了讀寫 GRAM 的時候是 16 位,其餘操做參數,都是 8 位的,這個和 ILI9320 等驅動器不同,必須加以注意。
接下來,咱們介紹一下 ILI9341 的幾個重要命令:0XD3,0X36,0X2A,0X2B,0X2C,0X2E 等 6 條指令。
首先來看指令:0XD3,這個是讀 ID4 指令,用於讀取 LCD 控制器的 ID,該指令如圖所示:
從上表能夠看出,0XD3 指令後面跟了 4 個參數,最後 2 個參數,讀出來是 0X93 和 0X41,恰好是咱們控制器 ILI9341 的數字部分,從而,經過該指令,便可判別所用的 LCD 驅動器是什麼型號。這樣,咱們的代碼,就能夠根據控制器的型號去執行對應驅動 IC 的初始化代碼,從而兼容不一樣驅動 IC 的屏,使得一個代碼支持多款 LCD。
接下來看指令:0X36,這是存儲訪問控制指令,能夠控制 ILI9341 存儲器的讀寫方向,簡單的說,就是在連續寫 GRAM 的時候,能夠控制 GRAM 指針的增加方向,從而控制顯示方式(讀 GRAM 也是同樣)。該指令如圖所示:
從上表能夠看出,0X36 指令後面,緊跟一個參數,這裏咱們主要關注:MY、MX、MV這三個位,經過這三個位的設置,咱們能夠控制整個 ILI9341 的所有掃描方向,如圖所示:
這樣,咱們在利用 ILI9341 顯示內容的時候,就有很大靈活性了,好比顯示 BMP 圖片,BMP 解碼數據,就是從圖片的左下角開始,慢慢顯示到右上角。若是設置 LCD 掃描方向爲從左到右,從下到上,那麼咱們只須要設置一次座標,而後就不停的往 LCD 填充顏色數據便可,這樣能夠大大提升顯示速度。
接下來看指令:0X2A,這是列地址設置指令,在從左到右,從上到下的掃描方式(默認)下面,該指令用於設置橫座標(x 座標),該指令如圖所示:
在默認掃描方式時,該指令用於設置 x 座標,該指令帶有 4 個參數,其實是 2 個座標值:SC 和 EC,即列地址的起始值和結束值,SC必須小於等於 EC,且 0≤SC/EC≤239。通常在設置 x 座標的時候,咱們只須要帶 2 個參數便可,也就是設置 SC 便可,由於若是 EC 沒有變化,咱們只須要設置一次便可(在初始化 ILI9341 的時候設置),從而提升速度。
指令:0X2B,與 0X2A 指令相似,是頁地址設置指令。在從左到右,從上到下的掃描方式(默認)下面,該指令用於設置縱座標(y 座標)。該指令如圖所示:
在默認掃描方式時,該指令用於設置 y 座標,該指令帶有 4 個參數,其實是 2 個座標值:SP 和 EP,即頁地址的起始值和結束值,SP 必須小於等於 EP,且 0≤SP/EP≤319。通常在設置y 座標的時候,咱們只須要帶 2 個參數便可,也就是設置 SP 便可,由於若是 EP 沒有變化,咱們只須要設置一次便可(在初始化 ILI9341 的時候設置),從而提升速度。
接下來看指令:0X2C,該指令是寫 GRAM 指令,在發送該指令以後,咱們即可以往 LCD的 GRAM 裏面寫入顏色數據了,該指令支持連續寫,指令描述如圖所示:
從上表可知,在收到指令0X2C以後,數據有效位寬變爲16位,咱們能夠連續寫入 LCD-GRAM 值,而 GRAM 的地址將根據 MY/MX/MV 設置的掃描方向進行自增。例如:假設設置的是從左到右,從上到下的掃描方式,那麼設置好起始座標(經過 SC,SP 設置)後,每寫入一個顏色值,GRAM 地址將會自動自增 1(SC++),若是碰到 EC,則回到 SC,同時 SP++,一直到座標:EC,EP 結束,其間無需再次設置的座標,從而大大提升寫入速度。
最後,來看看指令:0X2E,該指令是讀 GRAM 指令,用於讀取 ILI9341 的顯存(GRAM),該指令在 ILI9341 的數據手冊上面的描述是有誤的,真實的輸出狀況如圖所示:
該指令用於讀取 GRAM,如圖所示,ILI9341 在收到該指令後,第一次輸出的是dummy 數據,也就是無效的數據,第二次開始,讀取到的纔是有效的 GRAM 數據(從座標:SC,SP 開始),輸出規律爲:每一個顏色份量佔 8 個位,一次輸出 2 個顏色份量。好比:第一次輸出是 R1G1,隨後的規律爲:B1R2→G2B2→R3G3→B3R4→G4B4→R5G5... 以此類推。若是咱們只須要讀取一個點的顏色值,那麼只須要接收到參數 3 便可,若是要連續讀取(利用 GRAM地址自增,方法同上),那麼就按照上述規律去接收顏色數據。
以上,就是操做 ILI9341 經常使用的幾個指令,經過這幾個指令,咱們即可以很好的控制 ILI9341
顯示咱們所要顯示的內容了。
通常 TFTLCD 模塊的使用流程如圖:
任何 LCD,使用流程均可以簡單的用以上流程圖表示。其中硬復位和初始化序列,只須要執行一次便可。而畫點流程就是:設置座標→寫 GRAM 指令→寫入顏色數據,而後在 LCD 上面,咱們就能夠看到對應的點顯示咱們寫入的顏色了。
讀點流程爲:設置座標→讀 GRAM 指令→讀取顏色數據,這樣就能夠獲取到對應點的顏色數據了。
以上只是最簡單的操做,也是最經常使用的操做,有了這些操做,通常就能夠正常使用 TFTLCD了。接下來咱們將該模塊(2.8 寸屏模塊)用來來顯示字符和數字,經過以上介紹,咱們能夠得出 TFTLCD 顯示須要的相關設置步驟以下:
這一步,先將咱們與 TFTLCD 模塊相連的 IO 口進行初始化,以便驅動 LCD。這裏咱們用到的是 FSMC,FSMC 將在 18.1.2 節向你們詳細介紹。
即初始化序列,這裏咱們沒有硬復位 LCD,由於精英 STM32F103 的 LCD 接口,將 TFTLCD 的 RST 同 STM32F1 的 RESET 鏈接在一塊兒了,只要按下開發板的 RESET 鍵,就會對 LCD 進行硬復位。初始化序列,就是向 LCD 控制器寫入一系列的設置值(好比伽馬校準),這些初始化序列通常 LCD 供應商會提供給客戶,咱們直接使用這些序列便可,不須要深刻研究。在初始化以後,LCD 才能夠正常使用。
經過函數將字符和數字顯示到 TFTLCD 模塊上。