本系列將驅動一塊1.44”的128x128像素的彩色液晶屏幕。
并分幾個篇幅分別講述如何使其顯示色塊,英文數字,漢字以及圖片。
本文是系列的第一篇,目標是點亮屏幕并顯示指定色塊。
最終效果
最終效果
硬件
- 1.44英寸 spi接口 128x128液晶屏幕 X 1(淘寶10-20元)
正面
背面
先上代碼看效果
這次直接上代碼,大家自己復制代碼保存為py文件。文件名無所謂。
?
然后,按下表連接液晶屏和樹莓派。(連接完以后屏幕應該是白屏狀態)
液晶屏樹莓派LCD3.3V(不可以是5V??!)SCKGPIO19SDAGPIO13AOGPIO17RESETGPIO27CSGPIO23GNDGNDVCC3.3V(不可以是5V??!)
然后,執行!
?
不出意外,你應該能看到屏幕被慢慢地掃描刷新成紅屏了?。。?br>紅屏
原理說明
想要跟硬件通信,給硬件發送指令,首先要搞清楚硬件的通信協議。
對于屏幕來說,其通信協議是由屏幕的主控IC芯片決定的,不同的主控IC芯片有不同的通信協議,也就是發送指令的方法。
不過,即使是不同的屏幕,也有可能使用同一款(或同系列)主控IC。
所以拿到一塊屏幕首先要搞清楚這塊屏幕使用的是哪種主控IC,谷歌,百度都可以,最方便的是問賣家。。。
本文使用的屏幕的主控IC是ST7735S,文末提供數據手冊下載。
簡單來說,通過SDA數據引腳和SCLK時鐘引腳串行輸入(從第一篇學習過來的一定不陌生)不同的指令數據就可以控制屏幕的輸出。
指令數據分成兩種,指令種類數據和指令內容數據。每次發送指令都是先發送指令種類再發送指令內容。
有點拗口,比如說我告訴屏幕“接下來我要改變屏幕顏色啦”,接著你發送了一串數字,硬件接收到這串數字后會作為一個顏色值應用在屏幕上。如果你告訴屏幕“接下來我要改變屏幕的亮度啦”,接著你又發送了一串數字,這次硬件接收到這一串數字后會作為亮度值應用在屏幕上。這么說你再不明白我就。。。。
再回過頭來看代碼:
?
上面這兩個函數,一個用來發送指令種類,一個用來發送指令內容。區別僅僅在于rs引腳的電平高低不同。
另外,屏幕初始化函數lcd_init()里有一堆命令,天書一般,光是看就暈了。
別暈,這些代碼大多只用執行一遍,最開始不必關心,照葫蘆畫瓢即可。
下面是你需要注意的關鍵指令種類和內容:
- 0x2A:指定繪圖指針的列起始和結束地址(X坐標范圍)
指令內容是4個字節的32位數據,從高位到低位分別是
起始X坐標高8位
起始X坐標低8位
結束X坐標高8位
結束X坐標低8位 - 0x2B:指定繪圖指針的行起始和結束地址(Y坐標范圍)
指令內容是4個字節的32位數據,從高位到低位分別是
起始Y坐標高8位
起始Y坐標低8位
結束Y坐標高8位
結束Y坐標低8位
下面的代碼設定的范圍是(0,0)-(127, 127),也就是全屏幕。
?
- 0x2C:在當前指針位置(X,Y坐標)繪制指定顏色的像素點
指令內容是2個字節的顏色數據。
每次執行完一個像素點的繪色以后,硬件會根據設定好的開始坐標和結束坐標自動移動繪圖指針到下一個位置,遇到邊界自動換行。
下面的代碼的意義是連續繪制128 X 128個像素點,并且顏色為紅色(#0xF800)。
這就是本文示例代碼顯示紅屏的原理。
其實只要學會了這3個命令的使用,基本上啥都能顯示了,無非是效率問題。給大家留個作業,自己完成本文開頭的最終效果彩帶。
本節到此結束,下一節我們繼續討論。
關于顏色的補充說明
有人問博主0xF800是什么鬼?紅色難道不應該是0xFF0000嗎?
這里就引出一個RGB顏色數據格式的問題,0xF800和0xFF0000都是紅色,只是格式不一樣。
我們常見的0xFF0000這種格式一共是24位,紅綠藍各用8位表示,所以紅色就是FF,00,00。
而本文使用的是另一種叫RGB565的格式,這種格式一共只有16位,紅綠藍分別使用5位6位5位。
RGB565
根據上圖,紅色應該是11111000 00000000,也就是0xF800。
常用RGB565顏色表
其實,這款彩屏支持以下3種顏色格式
4k Colors, RGB 4,4,4
3AH=“03h”
65k Colors, RGB 5,6,5
3AH=“05h”(本文使用的格式)
262k Colors, RGB 6,6,6
3AH=“06h”
詳細內容請自己參考文檔(9.8 Data Color Coding)。
評論
查看更多