2012年11月10日 星期六

驅動 16x2 英文字型 LCD 螢幕

網頁最後修改時間:2016/07/28

英文字型 LCD 螢幕一般都是使用 HD44780 (或是相容) 的晶片做控制,因此參考一下文件選擇要使用的驅動方式 (4-bit / 8-bit), 4-bit 介面接線方式比較省接腳,故選擇 4-bit 驅動 16x2 LCD 螢幕

相關文件下載:

  1. HD44780
  2. 輕巧工作室 (06/07/2005)- LCM 液晶顯示模組英文文字型控制命令說明手冊
  3. SMC1602A

以 HD44780 為主的 LCM 英文文字型液晶顯示器模組,控制方式都大同小異,主要是在文字顯示或是移動的位置上,相關程式碼要做修改,利用善心人士寫好的函式庫看懂它做修改就好,不需要花太多時間重新撰寫。

相關的範例程式包含有:AVR GCC (Attiny2313)、8051、python

如果程式沒有接線圖,請參照提供的範例程式找出相對應的接腳與晶片做連接。


Raspberry Pi 驅動 LCD (16x2) 螢幕

材料:
  • LCD 是使用 SMC1602-H1W4 (5V 驅動、藍底白字、帶 LED 背光、16*2) (賣場連結)
    • 10k 可變電阻 (隨貨附送)
    • 排針 (隨貨附送  16-pin ,須自行焊接)

  • Raspberry Pi (Model B, Revision 2.0, 512MB RAM) (賣場連結)

  • Raspberry Pi 特製 GPIO (P1) 專用排線 (賣場連結)
  • 若有購買賣場的壓克力外殼,而且又有使用此條排線與 GPIO (P1)做連接的話,排線附帶的壓線扣 (ㄇ字型)不要裝 (除非你要拆掉上蓋,不然上蓋到排線頭的距離是剛剛好的);另外若排線選擇不拆掉外殼使用,要由上蓋出線,出線後上蓋就不能隨意翻動,另外這需要拆掉一些壓克力板後再組裝,要有點耐心。

    不同的插入方向會影響排線接腳與 GPIO (P1) 的接腳對應,正確的接法如下圖所示。



    照這樣插線,排線最下方的那一條所對應的就是 GPIO (P1) 排針上的第一支接腳,再配合 GPIO 卡 (可到 "Raspberry Pi (樹莓派) Model B 各版本之間的差異" 裡,移動到最下面有 Rev1.0 和 Rev2.0 下載的連結),連接上就比較方便。

  • 麵包板 (8.5x5.5cm, 400孔) (賣場連結)

  • 麵包板連接測試跳線 (賣場連結)
LCD 螢幕連接線路圖
( 2013/01/03 更正 Vss 與 Vdd 連接線路 [ 網友 TaKa 提出更正訊息)


LCD (***1602*) 接腳名稱

下面分幾個步驟說明,若是對於連接 LCD 一部分很熟或是有把握,可將線一次接好直接跳到最後的程式測試部分。

驅動 16x2 LCD 在這裡所使用的方式是 4-bit interface,扣除 LCD 只使用到寫出的功能,所以會接到 RaspPi 的接腳只有 (RS、E、D4、D5、D6和D7) 六個接腳。


LCD 有 3.3V5.0V 兩種電壓供應,但我們所使用的 LCD 是 5.0V 驅動,與 3.3V 輸出的 RaspPi 可以搭配嗎 ?

答案是可以的!只要 RaspPi 對 LCD 只做輸出的情形下,在'不接收 LCD 的訊號就可以 (所以我們才把 LCD 的 RW 接腳接地,讓 LCD 處在寫入模式下)。


備註:為了方便起見,RaspPi GPIO (P1) 都是使用偶數 (也就是靠近 LCD 的那一排) 與 LCD 做連接。

LCD 開機與背光(LED)測試

現在先測試 LCD 是否正常,以及背光 (LED) 是否可正常顯示,依照下方表格裡方括號的接腳編號和後面接的名稱,將其與對應 RaspPi 的 P1 接腳接在一起。

LCD 接腳編號 (名稱)RaspPi P1 接腳編號 (名稱)
[01] Vss[02] +5V   [06] GND*
[02] Vdd[06] GND [02] +5V*
[15] LED+[02] +5V
[16] LED-[06] GND

(* 2016/07/28 接腳更正, 感謝網友陳宗照的提醒)
LCD 電源與背光 (LCD) 接線圖


然後把電源接上 RaspPi,就要看到 LCD 如下圖這樣顯示,除了有電源之外還要有背光 (LED) 出現。

開啟電源後 LCD 顯示的情形


調整 LCD 對比度 

將 10K 的可變電阻安裝在麵包板上,左右兩邊一個接 +5V,另一個接地,中間那一隻接腳接到 LCD 的 [03] V0 接腳

裝上 10K 可變電阻


插上電源開始調整對比度,調到5*10方格子變成白色,或是在文字出現後再調整。

對比度調整


LCD 控制線路連接

現在先測試 LCD 是否正常,以及背光 (LED) 是否可正常顯示,依照下方表格裡方括號的接腳編號和後面接的名稱,將其與對應 RaspPi 的 P1 接腳接在一起,由於使用 GPIO (P1) 偶數接腳,因此不管是 Rev 1.0 或 Rev 2.0 都可以適用。

GPIO (P1) 接腳相對應之 IO 與 功能

LCD 接腳編號 (名稱)RaspPi P1 接腳編號 (名稱)
[04] RS[26] CE1, #07
[05] RW[06] GND
[06] E[24] CE0, #08
[11] D4[22] ........, #25
[12] D5[18] ........, #24
[13] D6[16] ........, #23
[14] D7[12] ........, #18

對照上表,連接 LCD 與 RaspPi 之間的連線,如下圖所示。未說明方便,圖面上省略排線,

LCD 控制線路與 RaspPi 連接
加上排線 GPIO (P1)

線路連接完成,準備測試


安裝需要的套件

如果已經超過一段時間沒做套件更新的話,請先執行

$sudo apt-get update && sudo apt-get upgrade -y
  • 安裝 python 開發套件 (2.x)

  • $sudo apt-get install python-dev

  • Upgrade distribute (給 RPI-GPIO 用)

  • $sudo apt-get install python-setuptools

    $sudo easy_install -U distribute

    $sudo apt-get install python-pip



  • 安裝 RPI.GPIO 最新版 (RPi.GPIO 現在版本 ver. 0.4.1a, 2012/11/08)

  • $sudo pip install rpi.gpio

  • 建立目錄並下載 CharLCD.py 檔案

  • $mkdir my-python-projects

    $mkdir my-python-prohects/CharLCD

    $cd my-python-projects/CharLCD

    $wget -O CharLCD.py http://goo.gl/2ynro



CharLCD.py 程式需修改及注意的地方

因為有使用中文註解,要加入

line2:#!-*- coding: utf-8 -*-



LCD 的控制是使用 4-bit interface ,而且只使用寫入的功能,因此 R/W 接腳直接接地。控制接腳只要使要 6 根,也就是用到 BCM2835 IO #7、#8、#25、 #24、#23和#18 這6根,對照到排線的接腳號碼分別為 26、24、22、16、18和12。

因此可根據 GPIO P1 所使用的接腳代號 (參考 GPIO 卡上的說明) 去接,再修改下面程式。

line 63:pins_db=[DB4, DB5, DB6, DB7]



要顯示網路的 IP 位址,可由 line 261 與  line 265 的命令列指令做到。如果是使用有線網路就用 line 261,把 line 265 前面加上 #;如果是使用無線網路,就用 line 265,把 line 261 前面加上 #

line 267 ~ 270: 式返回命令列指令的結果,也就是 IP 位址。

line 280 ~ 284:文字加上時間的顯示

line 286 ~ 290:時間加上IP位置的顯示

lcd.screen() 指令之後必須做一小段延遲 (sleep(0.01) = 10ms),不然接下來的顯示會成亂碼。詳細的指令與初始話方法請參照 HD447780 的說明




程式設置好之後,將 LCD 與 RaspPi 之間的接線接後,就可以執行了。輸入

$sudo python CharLCD.py


下面是使用 #1.文字顯示 + 時間,出現的樣子為

1. 文字顯示 + 時間

使用 #2.時間 + IP 位置,出現的樣子為

2. 時間 + IP 位置
請有購買 LCD 的各位,除了相關參考資料以傳送給各位之外,範例程式 (8051, AVR,) 也一併附在內 (包括 raspberry pi );Arduino 直接在 File/Examples/LiquidCrystal 選擇後修改接線的 pin 角位置就可 upload 到 Arduino 執行。



雖程式不同,但內容大同小異,請自行參照所附資料與檔案測試。

4 則留言:

  1. 您好版主!我覺得您的這篇文寫的很棒!不過對接的接腳圖有點小錯誤,LCD的VSS (GND) 及 VDD (+5V) 似乎相反了喔。

    回覆刪除
  2. 不好意思 我想問一下網路跟時間的那邊 init 的部分 我是顯示ipv6 而不是ipv4
    也嘗試過用跑馬燈 但它跟我說
    unindent does not match any outer indentation level
    (unindent與任何外部縮進級別不匹配)

    想請問 我還有甚麼方法 謝謝

    回覆刪除
    回覆
    1. 如果程式碼有做過修改,看你的縮排是不是沒弄好!

      刪除

留言屬名為"Unknown"或"不明"的用戶,大多這樣的留言都會直接被刪除掉,不會得到任何回覆!

發問問題,請描述清楚你(妳)的問題,別人回答前不會想去 "猜" 問題是什麼?

不知道怎麼發問,請看 [公告] 部落格提問須知 - 如何問問題 !