實驗目的
練習使用 HD44780 相容的文字型 LCD(Liquid crystal display),在 2x16 LCD 上顯示 "Hello World” 訊息。
2x16 LCD 簡介
(圖片來源: arduino.cc)
HD44780 相容的 2x16 LCD 可以顯示兩行訊息,每行 16 個字元,它可以顯示英文字母、希臘字母、標點符號以及數學符號,除了顯示訊息外,它還有其它功能,包括訊息捲動(往左和往右捲動)、顯示游標和 LED背光等。
(圖片來源: LCD 101)
LCD 總共有 14 支接腳,如果內建背光的話是 16 支,這些腳位的功能整理於下表:
腳位編號 | 名稱 | 說明 |
1 | Vss | 接地 (0V) |
2 | Vdd | 電源 (+5V) |
3 | Vo 或稱 Vee | 對比(0-5V), 可接一顆 1k 電阻,或利可變電阻調整適當的對比 |
4 | RS | Register Select: 1: D0 – D7 當作資料解釋 0: D0 – D7 當作指令解釋 |
5 | R/W | Read/Write mode: 1: 從 LCD 讀取資料 0: 寫資料到 LCD 因為很少從 LCD 這端讀取資料,可將此腳位接地以節省 I/O 腳位。 |
6 | E | Enable |
7 | D0 | Bit 0 LSB |
8 | D1 | Bit 1 |
9 | D2 | Bit 2 |
10 | D3 | Bit 3 |
11 | D4 | Bit 4 |
12 | D5 | Bit 5 |
13 | D6 | Bit 6 |
14 | D7 | Bit 7 MSB |
15 | A+ | 背光(串接 330R 電阻到電源) |
16 | K- | 背光(GND) |
日立 HD44780 相容的 LCD 有 4-bit 和 8-bit 兩種使用模式,使用 4-bit 模式主要的好處是節省 I/O 腳位,通訊的時候只會用到 4 個高位元 (D4-D7),D0-D3 這四支腳位可以不用接。每個送到 LCD 的資料會被分成兩次傳送 – 先送 4 個高位元,然後才送 4 個低位元。
材料
- 麵包板 x 1
- Arduino 主板 x 1
- HD44780 相容 LCD x 1 (本文所用的為 14 pin 無背光 LCD)
- 旋轉式可變電阻 x 1
- 單心線 x N
接線
- 將 LCD 的 RS, Enable, D4, D5, D6, D7 依序接到 12, 11, 5, 4, 3, 2 等腳位上
- 將 LCD 的 Vss 及 R/W 接到 GND,Vdd 接到 +5V
- 可變電阻中間腳位接到 LCD 的 Vo,剩下的兩支腳位,一支接到 5V,另外一支接到 GND (註:也可以不使用可變電阻,只要在 LCD 的 Vo 上串接一顆 1k ohm 電阻連到 GND 即可)
電路圖
程式碼
要在 LCD 上顯示訊息,會涉及初始化 LCD 、下指令以及傳送資料給 LCD 等工作,Arduino LiquidCrystal Library 已經把這些工作簡化了,所以你不需要知道這些低階的指令。底下的程式在 2x16 LCD 上第一行顯示 "hello, world!” 訊息,並在第二行不斷更新 Arduino 重開之後經過的秒數,使用的是 4-bit 模式(HelloWorld.pde):
如果訊息沒有顯示在螢幕上,或者是模糊朦朧的,首先應該做的事是檢查可變電阻以調整對比。
註:這支是 Arduino 內建的範例程式,點選 File > Examples > LiquidCrystal > HelloWorld 就可以找到。
範例照片/影片
動動腦
- 接一顆光敏電阻或可變電阻,然後寫一支程式讀取光敏電阻或可變電阻的讀值,並將讀到的數值顯示在 LCD 上。
- 寫一支 SerialLCD 程式,程式的邏輯是: 接受來自 Serial Port 的資料(從 PC 或筆電端送出),然後把資料顯示在 LCD 上。
- 承上題,把 SerialLCD 變成一個網路型的 LCD,讓電腦透過網路就可以把資料丟到 LCD 上顯示。
延伸閱讀
- How to control a HD44780-based Character LCD
- ladyada – Wiring up a character LCD to Arduino
- LCD 101
- Scroll: scroll text left and right.
- Autoscroll: shift text right and left.
6 意見:
你好:
我目前正在試著寫SerialLCD
遇到一些問題,想請問一下
我試著將LCD 和 Serial程式做結合
發現LCD上可以顯示數值,但是使用UART傳值
沒有發生任何事情
Hi, SerialLCD 是指底下這個網頁說的 UART 通訊的 LCD 嗎?
http://www.arduino.cc/playground/Learning/SerialLCD
請問你接腳是怎麼接的?
可以順便貼一下你的程式碼嗎?
SerialLCD
必須使用具有Serial功能的LCD是嗎?
我是用一般的LCD
here-->http://arduino.cc/forum/index.php/topic,121407.0.html
有關這段程式:
while (Serial.available() > 0)
{
incomingByte = Serial.read(); // # 1
Serial.print("I received: ");
Serial.println(incomingByte, DEC);
lcd.write(Serial.read()); // # 2
}
建議改成這樣:
while (Serial.available() > 0)
{
incomingByte = Serial.read(); // # 1
Serial.print("I received: ");
Serial.println(incomingByte, DEC);
lcd.write(incomingByte); // # 2
}
不然的話,你可以用 LiquidCrystal library 內建的 SerialDisplay 試試
OK 我試試看
我比較想知道
SerialLCD做是不是比較方便?
SerialLCD 是走 UART,接線比較簡單
另外,我知道還有 I2C/SPI LCD,接線也是比標準接法簡單。我前兩天有寫一篇 I2C LCD 的筆記,不妨參考看看: http://coopermaa2nd.blogspot.tw/2012/09/i2c-16x2-lcd.html
程式碼的話,差別不多
張貼留言