STM32学习之TFTLCD
前言
之前的STM32博客學習了從0新建工程,C語言知識復習,總線時鐘等基礎知識,現(xiàn)在根據(jù)手冊開始正式的開發(fā)項目,本篇博客主要是理解文檔中的TFTLCD部分的學習
學習資料來自:STM32F407最小系統(tǒng)板開發(fā)指南-庫函數(shù)版本_V1.1.pdf
正點原子,感謝原子哥的開源奉獻
正點原子資料下載中心
硬件:
STM32F407ZGT6
2.8 LCD MODULE
一個攝像頭
注意:
共分為3篇:
如果僅僅想要實現(xiàn),可以直接去看最后一篇的使用,前邊的基礎知識可以跳過
STM32單片機學習資料均來自 正點原子 ,僅用于學習,如有侵權請聯(lián)系我刪除
本博客內(nèi)容原創(chuàng),創(chuàng)作不易,轉載請注明
本文鏈接
個人博客:https://ronglin.fun/?p=102
PDF鏈接:見博客網(wǎng)站
CSDN: https://blog.csdn.net/RongLin02/article/details/121445952
基礎知識
TFT-LCD 即薄膜晶體管液晶顯示器。該模塊有如下特點:
本章,我們以 2.8 寸(其他 3.5 寸/4.3 寸等 LCD 方法類似,請參考 2.8 的即可)的 ALIENTEK TFTLCD 模塊為例介紹,該模塊支持 65K 色顯示,顯示分辨率為 320×240,接口為 16 位的 80并口,自帶觸摸屏。
原理圖如下:
ALIENTEK TFTLCD 模塊采用 16 位的并方式與外部連接(DB1–DB16)
同時還有其信號線功能如下:
- CS:TFTLCD 片選信號。
- WR:向 TFTLCD 寫入數(shù)據(jù)。
- RD:從 TFTLCD 讀取數(shù)據(jù)。
- D[15:0]:16 位雙向數(shù)據(jù)線。
- RST:硬復位 TFTLCD。
- RS:命令/數(shù)據(jù)標志(0,讀寫命令;1,讀寫數(shù)據(jù))
8080并口
8080 并口方式知識補充:
首先先介紹一下模塊的 8080 并行接口,8080 并行接口的發(fā)明者是 INTEL,該總線也被廣泛應用于各類液晶顯示器,這種接口,使得 MCU 可以快速的訪問模塊數(shù)據(jù)。
模塊的 8080 并口讀/寫的過程為:
先根據(jù)要寫入/讀取的數(shù)據(jù)的類型,設置 DC 為高(數(shù)據(jù))/低(命令),然后拉低片選,選中 SSD1306,接著我們根據(jù)是讀數(shù)據(jù),還是要寫數(shù)據(jù)置 RD/WR為低,然后:
在 RD 的上升沿, 使數(shù)據(jù)鎖存到數(shù)據(jù)線(D[7:0])上;
在 WR 的上升沿,使數(shù)據(jù)寫入到 SSD1306 里面;
時序圖如下:
注意:
在 8080 方式下讀數(shù)據(jù)操作的時候,我們有時候(例如讀顯存的時候)需要一個假讀命(Dummy Read),以使得微控制器的操作頻率和顯存的操作頻率相匹配。在讀取真正的數(shù)據(jù)之前,由一個的假讀的過程。這里的假讀,其實就是第一個讀到的字節(jié)丟棄不要,從第二個開始,才是我們真正要讀的數(shù)據(jù)。
同時連接方式還有 4 線串行(SPI)方式 等,不再介紹。
顯存說明
需要說明的是,TFTLCD模塊的 RST 信號線是直接接到 STM32F4 的復位腳上,并不由軟件控制,這樣可以省下來一個IO 口。
另外我們還需要一個背光控制線來控制 TFTLCD 的背光。所以,我們總共需要的 IO 口數(shù)目為 21 個。這里還需要注意,我們標注的 DB1-DB8,DB10-DB17,是相對于 LCD 控制 IC標注的,實際上大家可以把他們就等同于 D0~D15,這樣理解起來就比較簡單一點。
不同尺寸的 TFTLCD 模塊,其驅動芯片有很多種類型,這里我們僅以 ILI9341 控制器為例進行介紹,其他
的控制基本都類似,我們就不詳細闡述了。
ILI9341 液晶控制器自帶顯存,其顯存總大小為 172800(240*320*18/8),即 18 位模式(26萬色)下的顯存量。
在 16 位模式下,ILI9341 采用 RGB565 格式存儲顏色數(shù)據(jù),此時 ILI9341的 18 位數(shù)據(jù)線與 MCU 的 16 位數(shù)據(jù)線以及 LCD GRAM 的對應關系如圖
在9341中18位,其中D12和D0沒用用上,也就是說,一個色彩的顯示,是16位。
在 MCU 的 16 位數(shù)據(jù)中,最低 5 位代表藍色,中間 6 位為綠色,最高 5 位為紅色。
數(shù)值越大,表示該顏色越深。
指令
指令有點像C語言中的函數(shù)調(diào)用,當讀取的時候,輸入指令,模塊會返回參數(shù),當寫入的時候,輸入指令,后邊跟著參數(shù)就可以將數(shù)據(jù)寫入
注意 ILI9341 所有的指令都是 8 位的(高 8 位無效),且參數(shù)除了讀寫 GRAM (色彩數(shù)據(jù)) 的時候是 16 位,其他操作參數(shù),都是 8 位的。
這個和 ILI9320 等驅動器不一樣,必須加以注意。
接下來,我們介紹一下 ILI9341 的幾個重要命令,因為 ILI9341 的命令很多,我們這里就不全部介紹了,有興趣的大家可以找到 ILI9341 的 datasheet 看看。里面對這些命令有詳細的介紹。介紹:0XD3,0X36,0X2A,0X2B,0X2C,0X2E 等 6 條指令。
0XD3
0XD3,這個是讀 ID4 指令,用于讀取 LCD 控制器的 ID,指令功能如圖:
從上表可以看出,0XD3 指令后面跟了 4 個參數(shù),最后 2 個參數(shù),讀出來是 0X93 和 0X41,剛好是我們控制器 ILI9341 的數(shù)字部分,從而,通過該指令,即可判別所用的 LCD 驅動器是什么型號,這樣,我們的代碼,就可以根據(jù)控制器的型號去執(zhí)行對應驅動 IC 的初始化代碼,從而兼容不同驅動 IC 的屏,使得一個代碼支持多款 LCD。
參考一下網(wǎng)上的代碼:
0X36
0X36,這是存儲訪問控制指令,可以控制 ILI9341 存儲器的讀寫方向,簡單的說,就是在連續(xù)寫 GRAM 的時候,可以控制 GRAM 指針的增長方向,從而控制顯示方式(讀 GRAM 也是一樣)。該指令如圖:
在0X36 指令后面,緊跟一個參數(shù),這里我們主要關注:MY、MX、MV這三個位,也就是D7 D6 D5,通過這三個位的設置,我們可以控制整個ILI9341 的全部掃描方向,如表
| 0 | 0 | 0 | 從左到右,從上到下 |
| 1 | 0 | 0 | 從左到右,從下到上 |
| 0 | 1 | 0 | 從右到左,從上到下 |
| 1 | 1 | 0 | 從右到左,從下到上 |
| 0 | 0 | 1 | 從上到下,從左到右 |
| 0 | 1 | 1 | 從上到下,從右到左 |
| 1 | 0 | 1 | 從下到上,從左到右 |
| 1 | 1 | 1 | 從下到上,從右到左 |
這樣,我們就可以控制ILI9341的顯示方向了,比如顯示 BMP 圖片,BMP 解碼數(shù)據(jù),就是從圖片的左下角開始,慢慢顯示到右上角,如果設置 LCD 掃描方向為從左到右,從下到上,那么我們只需要設置一次坐標,然后就不停的往 LCD 填充顏色數(shù)據(jù)即可,這樣可以大大提高顯示速度。
0X2A
0X2A,這是列地址設置指令,在從左到右,從上到下的掃描方式(默認)下面,該指令用于設置橫坐標(x 坐標),該指令如表 16.1.1.4 所示:
在默認掃描方式時,該指令用于設置 x 坐標,該指令帶有 4 個參數(shù),實際上是 2 個坐標值:SC 和 EC,即列地址的起始值和結束值,SC 必須小于等于 EC,且 0≤SC/EC≤239。
一般在設置 x 坐標的時候,我們只需要帶 2 個參數(shù)即可,也就是設置 SC 即可,因為如果 EC 沒有變化,我們只需要設置一次即可(在初始化 ILI9341 的時候設置),從而提高速度。
0X2B
0X2B,是頁地址設置指令,在從左到右,從上到下的掃描方式(默認)下面,該指令用于設置縱坐標(y 坐標)。該指令如表 16.1.1.5 所示:
在默認掃描方式時,該指令用于設置 y 坐標,該指令帶有 4 個參數(shù),實際上是 2 個坐標值:SP 和 EP,即頁地址的起始值和結束值,SP 必須小于等于 EP,且 0≤SP/EP≤319。
一般在設置y 坐標的時候,我們只需要帶 2 個參數(shù)即可,也就是設置 SP 即可,因為如果 EP 沒有變化,我們只需要設置一次即可(在初始化 ILI9341 的時候設置),從而提高速度。
0X2C
0X2C,該指令是寫 GRAM 指令,在發(fā)送該指令之后,我們便可以往 LCD的 GRAM 里面寫入顏色數(shù)據(jù)了,該指令支持連續(xù)寫,指令描述如表 16.1.1.6 所示:
從上表可知,在收到指令 0X2C 之后,數(shù)據(jù)有效位寬變?yōu)?16 位,這16位代表的色彩含義見上邊的顯存說明,我們可以連續(xù)寫入 LCD GRAM 值,而 GRAM 的地址將根據(jù) MY/MX/MV 設置的掃描方向進行自增。
例如:假設設置的是從左到右,從上到下的掃描方式,那么設置好起始坐標(通過 SC,SP 設置)后,每寫入一個顏色值,GRAM 地址將會自動自增 1(SC++),如果碰到 EC,則回到 SC,同時 SP++,一直到坐標:EC,EP 結束,其間無需再次設置的坐標,從而大大提高寫入速度。
0X2E
0X2E,該指令是讀 GRAM 指令,用于讀取 ILI9341 的顯存(GRAM),該指令在 ILI9341 的數(shù)據(jù)手冊上面的描述是有誤的,真實的輸出情況如表 16.1.1.7 所示:
該指令用于讀取 GRAM,如表 16.1.1.7 所示,ILI9341 在收到該指令后,第一次輸出的是dummy 數(shù)據(jù),也就是無效的數(shù)據(jù),第二次開始,讀取到的才是有效的 GRAM 數(shù)據(jù)(從坐標:SC,SP 開始),輸出規(guī)律為:每個顏色分量占 8 個位,一次輸出 2 個顏色分量。
比如:第一次輸出是 R1G1,隨后的規(guī)律為:B1R2 G2B2 R3G3 B3R4 G4B4 R5G5… 以此類推。如果我們只需要讀取一個點的顏色值,那么只需要接收到參數(shù) 3 即可,如果要連續(xù)讀取(利用 GRAM地址自增,方法同上),那么就按照上述規(guī)律去接收顏色數(shù)據(jù)。
以上,就是操作 ILI9341 常用的幾個指令,通過這幾個指令,我們便可以很好的控制 ILI9341顯示我們所要顯示的內(nèi)容了。
使用流程
任何 LCD,使用流程都可以簡單的用以上流程圖表示。
其中硬復位和初始化序列,只需要執(zhí)行一次即可。
畫點流程是:設置坐標 ->?寫 GRAM 指令 -> 寫入顏色數(shù)據(jù),然后在 LCD 上面,我們就可以看到對應的點顯示我們寫入的顏色了。
讀點流程為:設置坐標 ->?讀 GRAM 指令 -> 讀取顏色數(shù)據(jù),這樣就可以獲取到對應點的顏色數(shù)據(jù)了。
以上只是最簡單的操作,也是最常用的操作,有了這些操作,一般就可以正常使用 TFTLCD了。
接下來我們將該模塊用來來顯示字符和數(shù)字,通過以上介紹,我們可以得出 TFTLCD 顯示
步驟
需要的相關設置步驟如下:
這一步,先將我們與 TFTLCD 模塊相連的 IO 口進行初始化,以便驅動 LCD。這里用到的是 FSMC,FSMC詳解在下部分。
即上圖中的初始化序列,初始化序列,就是向 LCD 控制器寫入一系列的設置值(比如伽馬校準),這些初始化序列一般 LCD 供應商會提供給客戶,我們直接使用這些序列即可,不需要深入研究。在初始化之后,LCD 才可以正常使用。
這一步則通過上圖左側的流程,即:設置坐標 -> 寫 GRAM 指令 -> 寫 GRAM來實現(xiàn),但是這個步驟,只是一個點的處理,我們要顯示字符/數(shù)字,就必須要多次使用這個步驟,從而達到顯示字符/數(shù)字的目的,所以需要設計一個函數(shù)來實現(xiàn)數(shù)字/字符的顯示,之后調(diào)用該函數(shù),就可以實現(xiàn)數(shù)字/字符的顯示了。
總結
這一部分主要介紹TFTLCD的基礎知識,下一篇介紹FSMC,最后就是代碼部分,未完待續(xù),=w=
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結
以上是生活随笔為你收集整理的STM32学习之TFTLCD的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32H743+CubeMX-低功耗
- 下一篇: tokudb 分形树_分形树Fracta