2010年12月26日 星期日

Arduino 筆記 – Lab9 在 2x16 LCD 上顯示 "Hello World" 訊息

實驗目的

練習使用 HD44780 相容的文字型 LCD(Liquid crystal display),在 2x16 LCD 上顯示 "Hello World” 訊息。

2x16 LCD 簡介

image

(圖片來源: arduino.cc)

HD44780 相容的 2x16 LCD 可以顯示兩行訊息,每行 16 個字元,它可以顯示英文字母、希臘字母、標點符號以及數學符號,除了顯示訊息外,它還有其它功能,包括訊息捲動(往左和往右捲動)、顯示游標和 LED背光等。

image

(圖片來源: 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 即可)

image

電路圖

image

程式碼

要在 LCD 上顯示訊息,會涉及初始化 LCD 、下指令以及傳送資料給 LCD 等工作,Arduino LiquidCrystal Library 已經把這些工作簡化了,所以你不需要知道這些低階的指令。底下的程式在 2x16 LCD 上第一行顯示 "hello, world!” 訊息,並在第二行不斷更新 Arduino 重開之後經過的秒數,使用的是 4-bit 模式(HelloWorld.pde):

如果訊息沒有顯示在螢幕上,或者是模糊朦朧的,首先應該做的事是檢查可變電阻以調整對比。

註:這支是 Arduino 內建的範例程式,點選 File > Examples > LiquidCrystal > HelloWorld 就可以找到。

範例照片/影片

動動腦
  1. 接一顆光敏電阻或可變電阻,然後寫一支程式讀取光敏電阻或可變電阻的讀值,並將讀到的數值顯示在 LCD 上。
  2. 寫一支 SerialLCD 程式,程式的邏輯是: 接受來自 Serial Port 的資料(從 PC 或筆電端送出),然後把資料顯示在 LCD 上。
  3. 承上題,把 SerialLCD 變成一個網路型的 LCD,讓電腦透過網路就可以把資料丟到 LCD 上顯示。
延伸閱讀

6 意見:

ada80508 提到...

你好:
我目前正在試著寫SerialLCD
遇到一些問題,想請問一下
我試著將LCD 和 Serial程式做結合
發現LCD上可以顯示數值,但是使用UART傳值
沒有發生任何事情

Cooper Maa 提到...

Hi, SerialLCD 是指底下這個網頁說的 UART 通訊的 LCD 嗎?
http://www.arduino.cc/playground/Learning/SerialLCD

請問你接腳是怎麼接的?
可以順便貼一下你的程式碼嗎?

ada80508 提到...

SerialLCD
必須使用具有Serial功能的LCD是嗎?
我是用一般的LCD
here-->http://arduino.cc/forum/index.php/topic,121407.0.html

Cooper Maa 提到...

有關這段程式:

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 試試

ada80508 提到...

OK 我試試看

我比較想知道
SerialLCD做是不是比較方便?

Cooper Maa 提到...

SerialLCD 是走 UART,接線比較簡單

另外,我知道還有 I2C/SPI LCD,接線也是比標準接法簡單。我前兩天有寫一篇 I2C LCD 的筆記,不妨參考看看: http://coopermaa2nd.blogspot.tw/2012/09/i2c-16x2-lcd.html

程式碼的話,差別不多