本系列將驅(qū)動一塊1.44”的128x128像素的彩色液晶屏幕。
并分幾個篇幅分別講述如何使其顯示色塊,英文數(shù)字,漢字以及圖片。
本文是系列的第一篇,目標是點亮屏幕并顯示指定色塊。
最終效果
最終效果
硬件
- 1.44英寸 spi接口 128x128液晶屏幕 X 1(淘寶10-20元)
正面
背面 
先上代碼看效果
這次直接上代碼,大家自己復制代碼保存為py文件。文件名無所謂。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
#!/usr/bin/env python import RPi.GPIO as GPIOimport timecs=23# 片選rs=17# 數(shù)據(jù) / 命令 切換sda=13# 數(shù)據(jù)scl=19# 時鐘reset=27# 復位# 傳輸bytedef setByteData(data):# print ""# print "S-----------setByte---------------:", hex(data)for bit in range(0,8):# 傳入的數(shù)字從高位到低位依次判斷是否為1,若為1則設置高電平,否則設置低電平# 判斷的方法是先向左移位,把要判斷的位移動到最高位然后跟0x80(1000 0000)相與,# 如果結(jié)果仍然是0x80(1000 0000)就表示最高位是1,否則最高位就是0if ((data<
?
然后,按下表連接液晶屏和樹莓派。(連接完以后屏幕應該是白屏狀態(tài))
液晶屏樹莓派LCD3.3V(不可以是5V??!)SCKGPIO19SDAGPIO13AOGPIO17RESETGPIO27CSGPIO23GNDGNDVCC3.3V(不可以是5V??!)然后,執(zhí)行!
1
sudo python prog.py
?
不出意外,你應該能看到屏幕被慢慢地掃描刷新成紅屏了?。。?br>紅屏
原理說明
想要跟硬件通信,給硬件發(fā)送指令,首先要搞清楚硬件的通信協(xié)議。
對于屏幕來說,其通信協(xié)議是由屏幕的主控IC芯片決定的,不同的主控IC芯片有不同的通信協(xié)議,也就是發(fā)送指令的方法。
不過,即使是不同的屏幕,也有可能使用同一款(或同系列)主控IC。
所以拿到一塊屏幕首先要搞清楚這塊屏幕使用的是哪種主控IC,谷歌,百度都可以,最方便的是問賣家。。。
本文使用的屏幕的主控IC是ST7735S,文末提供數(shù)據(jù)手冊下載。
簡單來說,通過SDA數(shù)據(jù)引腳和SCLK時鐘引腳串行輸入(從第一篇學習過來的一定不陌生)不同的指令數(shù)據(jù)就可以控制屏幕的輸出。
指令數(shù)據(jù)分成兩種,指令種類數(shù)據(jù)和指令內(nèi)容數(shù)據(jù)。每次發(fā)送指令都是先發(fā)送指令種類再發(fā)送指令內(nèi)容。
有點拗口,比如說我告訴屏幕“接下來我要改變屏幕顏色啦”,接著你發(fā)送了一串數(shù)字,硬件接收到這串數(shù)字后會作為一個顏色值應用在屏幕上。如果你告訴屏幕“接下來我要改變屏幕的亮度啦”,接著你又發(fā)送了一串數(shù)字,這次硬件接收到這一串數(shù)字后會作為亮度值應用在屏幕上。這么說你再不明白我就。。。。
再回過頭來看代碼:
1234567891011
def write_command(cmd):GPIO.output(cs, False)GPIO.output(rs, False)setByteData(cmd)GPIO.output(cs, True)def write_data(data):GPIO.output(cs, False)GPIO.output(rs, True)setByteData(data)GPIO.output(cs, True)
?
上面這兩個函數(shù),一個用來發(fā)送指令種類,一個用來發(fā)送指令內(nèi)容。區(qū)別僅僅在于rs引腳的電平高低不同。
另外,屏幕初始化函數(shù)lcd_init()里有一堆命令,天書一般,光是看就暈了。
別暈,這些代碼大多只用執(zhí)行一遍,最開始不必關心,照葫蘆畫瓢即可。
下面是你需要注意的關鍵指令種類和內(nèi)容:
- 0x2A:指定繪圖指針的列起始和結(jié)束地址(X坐標范圍)
指令內(nèi)容是4個字節(jié)的32位數(shù)據(jù),從高位到低位分別是
起始X坐標高8位
起始X坐標低8位
結(jié)束X坐標高8位
結(jié)束X坐標低8位 - 0x2B:指定繪圖指針的行起始和結(jié)束地址(Y坐標范圍)
指令內(nèi)容是4個字節(jié)的32位數(shù)據(jù),從高位到低位分別是
起始Y坐標高8位
起始Y坐標低8位
結(jié)束Y坐標高8位
結(jié)束Y坐標低8位 
下面的代碼設定的范圍是(0,0)-(127, 127),也就是全屏幕。
12345678910
write_command(0x2A) # Set Column Addresswrite_data(0x00)write_data(0x00)write_data(0x00)write_data(0x7F)write_command(0x2B) # Set Page Addresswrite_data(0x00)write_data(0x00)write_data(0x00)write_data(0x7F)
?
- 0x2C:在當前指針位置(X,Y坐標)繪制指定顏色的像素點
指令內(nèi)容是2個字節(jié)的顏色數(shù)據(jù)。
每次執(zhí)行完一個像素點的繪色以后,硬件會根據(jù)設定好的開始坐標和結(jié)束坐標自動移動繪圖指針到下一個位置,遇到邊界自動換行。
下面的代碼的意義是連續(xù)繪制128 X 128個像素點,并且顏色為紅色(#0xF800)。12345678
write_command(0x2C)show_single_color(0xf8,0x00) # 紅色背景......def show_single_color(DH,DL):for i in xrange(0,128):for j in xrange(0,128):write_data_16bit(DH,DL)
 
這就是本文示例代碼顯示紅屏的原理。
其實只要學會了這3個命令的使用,基本上啥都能顯示了,無非是效率問題。給大家留個作業(yè),自己完成本文開頭的最終效果彩帶。
本節(jié)到此結(jié)束,下一節(jié)我們繼續(xù)討論。
關于顏色的補充說明
有人問博主0xF800是什么鬼?紅色難道不應該是0xFF0000嗎?
這里就引出一個RGB顏色數(shù)據(jù)格式的問題,0xF800和0xFF0000都是紅色,只是格式不一樣。
我們常見的0xFF0000這種格式一共是24位,紅綠藍各用8位表示,所以紅色就是FF,00,00。
而本文使用的是另一種叫RGB565的格式,這種格式一共只有16位,紅綠藍分別使用5位6位5位。
RGB565
根據(jù)上圖,紅色應該是11111000 00000000,也就是0xF800。
常用RGB565顏色表
其實,這款彩屏支持以下3種顏色格式
4k Colors, RGB 4,4,4
3AH=“03h”12
write_command(0x3a)write_data(0x03)
65k Colors, RGB 5,6,5
3AH=“05h”(本文使用的格式)12
write_command(0x3a)write_data(0x05)
262k Colors, RGB 6,6,6
3AH=“06h”12
write_command(0x3a)write_data(0x06)
詳細內(nèi)容請自己參考文檔(9.8 Data Color Coding)。
                        電子發(fā)燒友App
                    
                
                
          
        
        






           
            
            
                
            
評論