樹莓派GPIO入門11-驅動液晶屏幕(一)

2021-02-13 莫比嗨客MbhAi

本系列將驅動一塊1.44"的128x128像素的彩色液晶屏幕。
並分幾個篇幅分別講述如何使其顯示色塊,英文數字,漢字以及圖片。
本文是系列的第一篇,目標是點亮屏幕並顯示指定色塊。

最終效果

硬體先上代碼看效果

這次直接上代碼,大家自己複製代碼保存為py文件。文件名無所謂。

#!/usr/bin/env python import RPi.GPIO as GPIOimport timecs=23       # 片選rs=17       # 數據 / 命令 切換sda=13      # 數據scl=19      # 時鐘reset=27    # 復位# 傳輸bytedef setByteData(data):    # print ""    # print "S-setByte:", hex(data)    for bit in range(0,8):        # 傳入的數字從高位到低位依次判斷是否為1,若為1則設置高電平,
否則設置低電平        # 判斷的方法是先向左移位,把要判斷的位移動到最高位
然後跟0x80(1000 0000)相與,        # 如果結果仍然是0x80(1000 0000)就表示最高位是1,
否則最高位就是0        if ((data<<bit) & 0x80 == 0x80):            setBitData(True)            # print "1",        else:            setBitData(False)            # print "0",    # print ""    # print "E-setByte"def setBitData(data):    GPIO.output(scl, False)    GPIO.output(sda, data)    GPIO.output(scl, True)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)def write_data_16bit(dataH, dataL):    write_data(dataH)    write_data(dataL)def lcd_reset():    GPIO.output(reset, False)    time.sleep(0.1)    GPIO.output(reset, True)    time.sleep(0.1)def lcd_init():    lcd_reset()    write_command(0x11) # Exit Sleep    time.sleep(0.02)    write_command(0x26) # Set Default Gamma    write_data(0x04)    write_command(0xB1)# Set Frame Rate    write_data(0x0e)    write_data(0x10)    write_command(0xC0) # Set VRH1[4:0] & VC[2:0] for VCI1 & GVDD    write_data(0x08)    write_data(0x00)    write_command(0xC1) # Set BT[2:0] for AVDD & VCL & VGH & VGL    write_data(0x05)    write_command(0xC5) # Set VMH[6:0] & VML[6:0] for VOMH & VCOML    write_data(0x38)    write_data(0x40)    write_command(0x3a) # Set Color Format    write_data(0x05)    write_command(0x36) # RGB    write_data(0xc8)    write_command(0x2A) # Set Column Address    write_data(0x00)    write_data(0x00)    write_data(0x00)    write_data(0x7F)    write_command(0x2B) # Set Page Address    write_data(0x00)    write_data(0x00)    write_data(0x00)    write_data(0x7F)    write_command(0xB4)    write_data(0x00)    write_command(0xf2) # Enable Gamma bit    write_data(0x01)    write_command(0xE0)    write_data(0x3f)# p1    write_data(0x22)# p2    write_data(0x20)# p3    write_data(0x30)# p4    write_data(0x29)# p5    write_data(0x0c)# p6    write_data(0x4e)# p7    write_data(0xb7)# p8    write_data(0x3c)# p9    write_data(0x19)# p10    write_data(0x22)# p11    write_data(0x1e)# p12    write_data(0x02)# p13    write_data(0x01)# p14    write_data(0x00)# p15    write_command(0xE1)    write_data(0x00)# p1    write_data(0x1b)# p2    write_data(0x1f)# p3    write_data(0x0f)# p4    write_data(0x16)# p5    write_data(0x13)# p6    write_data(0x31)# p7    write_data(0x84)# p8    write_data(0x43)# p9    write_data(0x06)# p10    write_data(0x1d)# p11    write_data(0x21)# p12    write_data(0x3d)# p13    write_data(0x3e)# p14    write_data(0x3f)# p15    write_command(0x29) #  Display On    write_command(0x2C)def show_single_color(DH,DL):    for i in xrange(0,128):        for j in xrange(0,128):            write_data_16bit(DH,DL)try:    GPIO.setmode(GPIO.BCM)    GPIO.setup(cs, GPIO.OUT)    GPIO.setup(rs, GPIO.OUT)    GPIO.setup(sda, GPIO.OUT)    GPIO.setup(scl, GPIO.OUT)    GPIO.setup(reset, GPIO.OUT)        lcd_init()    write_command(0x2C)    show_single_color(0xf8,0x00) # 紅色背景    while True:        passexcept KeyboardInterrupt:    pass# 清理GPIO口GPIO.cleanup()

然後,按下表連接液晶屏和樹莓派。(連接完以後屏幕應該是白屏狀態)

液晶屏 |樹莓派
|---
LCD |3.3V(不可以是5V!!)
SCK |GPIO19
SDA |GPIO13
AO |GPIO17
RESET |GPIO27
CS |GPIO23
GND |GND
VCC |3.3V(不可以是5V!!)

然後,執行!

sudo python prog.py

不出意外,你應該能看到屏幕被慢慢地掃描刷新成紅屏了!!!

原理說明

想要跟硬體通信,給硬體發送指令,首先要搞清楚硬體的通信協議。
對於屏幕來說,其通信協議是由屏幕的主控IC晶片決定的,不同的主控IC晶片有不同的通信協議,也就是發送指令的方法。
不過,即使是不同的屏幕,也有可能使用同一款(或同系列)主控IC。
所以拿到一塊屏幕首先要搞清楚這塊屏幕使用的是哪種主控IC,谷歌,百度都可以,最方便的是問賣家。。。
本文使用的屏幕的主控IC是ST7735S,文末提供數據手冊下載。
簡單來說,通過SDA數據引腳和SCLK時鐘引腳串行輸入(從第一篇學習過來的一定不陌生)不同的指令數據就可以控制屏幕的輸出。
指令數據分成兩種,指令種類數據和指令內容數據。每次發送指令都是先發送指令種類再發送指令內容。
有點拗口,比如說我告訴屏幕「接下來我要改變屏幕顏色啦」,接著你發送了一串數字,硬體接收到這串數字後會作為一個顏色值應用在屏幕上。如果你告訴屏幕「接下來我要改變屏幕的亮度啦」,接著你又發送了一串數字,這次硬體接收到這一串數字後會作為亮度值應用在屏幕上。這麼說你再不明白我就。。。。
再回過頭來看代碼:

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)

上面這兩個函數,一個用來發送指令種類,一個用來發送指令內容。區別僅僅在於rs引腳的電平高低不同。
另外,屏幕初始化函數lcd_init()裡有一堆命令,天書一般,光是看就暈了。
別暈,這些代碼大多只用執行一遍,最開始不必關心,照葫蘆畫瓢即可。
下面是你需要注意的關鍵指令種類和內容:

下面的代碼設定的範圍是(0,0)-(127, 127),也就是全屏幕。

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)

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個命令的使用,基本上啥都能顯示了,無非是效率問題。給大家留個作業,自己完成本文開頭的最終效果彩帶。
本節到此結束,下一節我們繼續討論。

關於顏色的補充說明

有人問博主0xF800是什麼鬼?紅色難道不應該是0xFF0000嗎?
這裡就引出一個RGB顏色數據格式的問題,0xF800和0xFF0000都是紅色,只是格式不一樣。
我們常見的0xFF0000這種格式一共是24位,紅綠藍各用8位表示,所以紅色就是FF,00,00。
而本文使用的是另一種叫RGB565的格式,這種格式一共只有16位,紅綠藍分別使用5位6位5位。

根據上圖,紅色應該是11111000 00000000,也就是0xF800。

其實,這款彩屏支持以下3種顏色格式

write_command(0x3a)write_data(0x03)

write_command(0x3a)write_data(0x05)

write_command(0x3a)write_data(0x06)

詳細內容請自己參考文檔(9.8 Data Color Coding)。

本文轉載自芒果愛吃胡蘿蔔的blog

相關焦點

  • 使用樹莓派的GPIO
    國外嵌入式開源領域具有良好的分享精神,樹莓派的GPIO各種集成庫也層出不窮,下面推薦幾個。    【python GPIO】    【開發語言】——python    【簡單介紹】——該庫更確切的名稱為raspberry-gpio-python,樹莓派官方資料中推薦且容易上手。
  • 如何用樹莓派控制 GPIO 引腳並操作繼電器
    都不是,而是僅僅使用一個樹莓派。讓我來告訴你如何使用 PHP 和溫度傳感器實現樹莓派控制 GPIO 引腳並操作繼電器。我使用 AJAX 把它們整合在了一起。測試 WiringPi運行 gpio 命令來檢查安裝成功與否:gpio -v gpio readall這將給你一些信心,軟體運行良好。連接 DS18B20 傳感器到樹莓派傳感器上的黑線用於 GND。紅線用於 VCC。黃線是 GPIO 線。
  • Linux 驅動開發 / gpio子系統 / 快速入門
    gpio 和 pinctrl 子系統在內核裡的使用率非常高,和嵌入式產品的關聯非常大。從這兩個子系統開始學習驅動開發是個不錯的入門選擇。本文目錄:一、gpio 與 pinctrl二、內核裡如何引用 gpio三、gpio 子系統框架四、應用層如何訪問 gpio一、gpio 與 pinctrl
  • 樹莓派用gpiozero庫控制LED燈
    準備硬體樹莓派一個,我的是3B+閃迪SD卡(class10),不小於8G樹莓派電源,電流2.5A以上,否則供電不足軟體給樹莓派刷好系統,這部分網上教程有非常多。如果你用的不是 noobs,那麼建議使用 Etcher這個鏡像燒錄軟體:安裝gpiozero庫gpiozero庫介紹和一些廢話zero是零的意思,也有初級入門的含義,所以gpiozero庫的宗旨就是為了降低使用樹莓派gpio的門檻,相比於其他操縱樹莓派引腳gpio的庫,gpiozero用戶體驗更加友好,更加直觀和簡單。
  • 樹莓派使用入門:進入物理世界 —— 如何使用樹莓派的 GPIO 針腳 | Linux 中國
    到目前為止,本系列文章主要專注於樹莓派的軟體方面,而今天我們將學習硬體。
  • 樹莓派入門(一)
    準備寫一些樹莓派入門教程,本教程採用c語言教學。大概涉及樹莓派的gpio口的控制,樹莓派介紹,以及具體通過幾個例子使用gpio口。
  • 樹莓派GPIO最入門教程:先從控制一個LED小燈開始
    中間部分每五列柵格為一組,這一組五個柵格是導通的,在最中間的位置有一條凹槽,用於隔斷左右兩部分。LED 燈LED 是英文 Light Emitting Diode(發光二極體)的縮寫。它有2個腳,長腳是正極,短腳是負極。當有電流流過時,LED 就會亮起。
  • (1)配置GPIO輸出驅動LED
    點擊上方藍字,關注微聯智控工作室可點擊右上角的 …,分享這篇文章
  • 樹莓派GPIO入門07-利用聲音傳感器製作聲控燈_極客迷
    最終效果樹莓派GPIO入門07-利用聲音傳感器製作聲控燈視頻演示:硬體麵包板杜邦線LED發光二極體一隻聲音傳感器一隻硬體連接聲音傳感器電源正極 - 樹莓派的VCC聲音傳感器電源負極 - 樹莓派的GND聲音傳感器數據OUT - 樹莓派的GPIO4LED長針 - 樹莓派的GPIO17LED短針 - 樹莓派的GND代碼(Python)12345678910
  • 玩轉樹莓派(四)使用Python 通過RPi.GPIO庫控制GPIO
    一、創建環境新建PythonWorkSpace文件夾新建gpio_out.py文件pi@raspberrypi:
  • 【.NET 與樹莓派】使用 GPIO 庫
    1 開燈,0 關燈;1 向左轉,0 向右轉;0 翻牆,1 撞牆;0 引爆火藥,1 引爆自己……喲西,這麼一來,兩個電平就可以對應兩個二進位數字:高電平—— 1,低電平—— 0,完事。有了兩個明確的值,還需要明確方向。
  • 修改gpio
    一、首先可以查看串口映射關係1.輸入ls -l /dev2.
  • Linux內核驅動之gpio子系統的使用
    一 概述linux 內核中 gpio 是最簡單,最常用的資源(和 interrupt ,dma,timer一樣)驅動程序,應用程式都能夠通過相應的接口使用
  • 樹莓派新手入門教程
    不過,顯示器只在安裝系統時需要,後面可以 SSH 登錄,就不需要了。(4)無線鍵鼠樹莓派內置藍牙,USB 或藍牙的無線鍵鼠都可以用。SSH 登錄安裝系統後,樹莓派就可以上網了(Wifi 或者網線)。樹莓派的默認用戶是pi。樹莓派會提示你輸入密碼。pi的默認密碼是raspberry。正常情況下,這樣就可以登錄樹莓派了。接著,就可以進行各種伺服器操作了,比如修改密碼。$ passwd後面的實驗需要將用戶加入gpio用戶組。$ sudo adduser pi gpio上面的代碼表示將用戶pi加入gpio用戶組。
  • 樹莓派JAVA開發串口(RXTX)和GPIO(pi4j)
    配置樹莓派GPIO1) 安裝Java要想控制繼電器,我們必須先學會控制樹莓派上的GPIO,控制GPIO有很多方式:python、wiringPi、pi4j。要想使用pi4j必須給樹莓派安裝Java,不過在最新的樹莓派系統Raspbian中已經內置了Java(2013-12-20-wheezy-raspbian.zip),如果不知道你的樹莓派中有沒有Java,你可以使用javac -version 來查看是否有安裝了Java。如下圖出現了版本信息,就表示安裝了Java。如果沒有就去下載最新的Raspbian系統吧。
  • 嵌入式 | GPIO的使用
    適合於做電流型的驅動 ,其吸收電流的能力相對強 ( 一般 20ma 以內 ).利用外部電路的驅動能力,減少 IC 內部的驅動。當 IC 內部 MOSFET 導通時,驅動電流是從外部的 VCC 流經 R pull-up ,MOSFET 到 GND。IC 內部僅需很下的柵極驅動電流。
  • 樹莓派筆記08—Python流水燈
    關注、星標公眾號,不錯過精彩內RPI.GPIO「raspberry-gpio-python
  • 樹莓派2 GPIO 和 SwiftyGPIO
    for gpio in gpios {  gpio.direction = .OUT  gpio.value     = GPIOState.Off.rawValue}// 5func setLedColor(color:(GPIOState,GPIOState), gpios:[GPIO]) {  gpios[0].value = color.0.rawValue  gpios[1].value
  • 樹莓派[Raspberry Pi 2 Model B]測評(三)——樹莓派2B的軟實力
    如果其他卡片電腦能做到35美元,且提供更開放詳實的官方資料,會出現樹莓派的衰落嗎? 未來的答案未可知。那就再和拆摸Boy一起概覽一下樹莓派2B提供的軟能力,感受它對一個技術員的引力吧。一、OS支持 樹莓派社區確實得到了大量開源作業系統社區和商業作業系統製造商的鼎力支持。