2015年3月25日 星期三

Arduino 液晶顯示器測試

四五年前在露天跟陳生電子買了一塊 8051/AVR 開發板套件 (深圳 DOFLY 產品), 裡面有附一個 1602 液晶模組, 但那塊板子我從來都沒有開機過, 所以也不知道液晶模組能不能用. 上週末跟柏益買的麵包板寄來了, 直到昨晚才終於動手來測試看看是否堪用, 否則最近採購零件時就要列入清單了.

市面上這種 1602 液晶模組據書上講大都是相容於 Hitachi HD44780 晶片, 因此功能與使用方式差不多, 但可能模組接腳會有些不同. 通常都是有背光功能的 16 針腳包裝, 有些則只有 14 腳, 那就是沒有背光功能的, 少了背光電源輸入針腳 A, K. 我手上這塊 1602A 是 16 針腳的, 長相如下 :



這背面兩坨黑點, 右邊較大的 U1 我猜應該就是 HD44780 相容晶片, 而左邊較小的 U2 可能是液晶區段驅動器 IC. 腳位編號從背面看最右邊是腳 1 (VSS), 最左邊是腳 16 (K), 腳位名稱有打印在電路板上. 為了以後查考方便, 我將 1602 模組接腳定義列在下面 :

接腳功能接 Arduino 
1 (VSS)電源負極GND
2 (VCC)電源正極5V
3 (Vo)調整對比可變電阻中腳
4 (RS)D0~D7放入資料暫存器 (1) 或指令資料暫存器 (0)腳位 2
5 (RW)讀取 (1) 或寫入 (0) LCDGND (寫入)
6 (E)可寫入 (1) 或不可寫入 (0) LCD腳位 3
7 (D0)資料位元 0不接
8 (D1)資料位元 1不接
9 (D2)資料位元 2不接
10 (D3)資料位元 3不接
11 (D4)資料位元 4腳位 4
12 (D5)資料位元 5腳位 5
13 (D6)資料位元 6腳位 6
14 (D7)資料位元 7腳位 7
15 (A+)背光電源正極5V
16 (-K)背光電源負極GND

接腳 2 正極電源 (VCC) 有時稱為 VDD, 記得以前學校電子學 FET 場效應電晶體慣用 VDD (因為接汲極 Drain 之故), 而雙極電晶體則用 VCC (因為接集極 Collection 之故), 反正不管 VCC 或 VDD, 就是接電源正極 (+5V). 書上有提到有些 LCD 模組的 VCC(+5V) 與 VSS(GND) 腳位可能顛倒, 要特別注意, 接錯可能對零件造成損傷.

OK, 下面就紀錄這次測試情形, 首先準備材料如下 :
  1. 麵包板 *1
  2. 10K 可變電阻 *1
  3. 公對公杜邦線 *15
用 Fritzing 畫的接線圖如下 :



這是我的 LCD 模組的接法, 從正面看從左到右是腳 1~ 腳 16, 有些 LCD 模組接腳安排可能不同, 要注意. 麵包板最上面兩排是電源, 上正下負, 所以分別連接 Arduino 的 GND 與 5V, 整個橫列都是共通的, 所以 1602 的 1 腳接 GND, 2 腳接 5V, 背光的 A 接 5V, K 接 GND.

初次使用 fritzing 令我驚艷, 這麼好用的工具竟然是 open source, 實在太棒了. 直接在接點上點一下就可以接線, 若要畫垂直線, 只要按住 shift, 再點接線, 就可以移動線條調整為如上的四四方方接線圖, 若按住 ctrl, 則可調整為曲線.

測試程式取自葉難 "Arduino 範例分析與實作設計" 的程式碼 5.11 :

#include <LiquidCrystal.h>
#define RS 2
#define E 3
#define D4 4
#define D5 5
#define D6 6
#define D7 7


LiquidCrystal lcd(RS,E,D4,D5,D6,D7);  //建立 LCD 物件


void setup() {  //初始設定 (一次性)
  lcd.begin(16,2);  //定義 LCD 為 2 列 16 行顯示器

  lcd.clear();  //清除螢幕
  lcd.setCursor(0,0);   //游標移到左上角
  lcd.print("Hello World!");   //在第一列印出 Hello World!
  }

void loop() {  //無限迴圈
  lcd.setCursor(0,1);  //游標移到第 2 列第 1 行
  lcd.print(millis()/1000);   //印出秒數
  }


可見程式上傳執行時, setup() 會在第一列顯示 Hello World!, 然後進入無限迴圈, 在第二列顯示經過的秒數. 按 UNO 板上的 RESET 鈕又會歸零重新開始計時.

剛送電時 LCD 顯示全藍底色, 但程式上傳後還是一樣, 沒有顯示 Hello World, 原來還要調整可變電阻, 這樣對比才會變大. 其實我覺得根本不需要可變電阻, 直接把 1602 的 Vo 接地即可, 這樣對比最強 (Vo 接 VCC 對比最小), 加可變電阻調對比是多此一舉. 這麼一來整個測試只用到 Arduino 與 1602 模組兩個元件, 真是厲害.

經過這個測試證實這塊 LCD 模組在購入數年後仍然可用. 但這實驗占用了 Arduino 四個輸出腳, 若結合其他感測器或許會不夠用, 這時可以採用 I2C 模組來將佔用腳數降至 2 個, 即 Arduino 輸出給 I2C 模組, 再由 I2C 模組驅動 LCD 模組, 所以將 I2C 模組列入下次採購項目.

相關產品市調如下 :

# LCD 1602 LCM 液晶顯示模組 I2C IIC 介面 5V 16x2 16*2 藍底 白字 $140
# LCD 1602 A 3.3V 藍底白字液晶顯示模組 Arduino專用 #69  
# LCD 1602 I2C 轉接板 1602液晶顯示器 IIC 界面接口 $39

其次來測試 LCD 文字跑馬燈效果, 利用 scrollDisplayLeft() 與 scrollDisplayRight() 可以將原先用 print() 輸出的文字向左或向右移動一格. 下列程式參考了 "Arduino 一試就上手" 7-7 節 :

程式 :

#include <LiquidCrystal.h>
#define RS 2
#define E 3
#define D4 4
#define D5 5
#define D6 6
#define D7 7

LiquidCrystal lcd(RS,E,D4,D5,D6,D7);  //建立 LCD 物件

void setup() {  //初始設定 (一次性)
  lcd.begin(16,2);  //定義 LCD 為 2 列 16 行顯示器
  lcd.print("Hello World! This is a scroll test.");   //在第一列印出 Hello World!
  delay(1000); //延遲1秒
  }

void loop() {  //無限迴圈
  lcd.scrollDisplayLeft();  //往左捲動
  delay(400);   //延遲0.4秒
  }



參考資料 :

Fritzing 麵包板:LED 閃爍電路

3 則留言 :

五餅二魚水族倉庫 提到...

請問你有用過 LCD I2C 介面嗎 ?, 最近卡在這裡

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // 設定 LCD I2C 位址
LiquidCrystal_I2C lcd(0x27, 16,2)

為何有兩種寫法,要用哪一種 ?

Tony Huang 提到...

Sorry, 我沒有 I2C 的 1602, 這可能是函式庫不同問題, 有的程式庫須宣告LCD的腳位, 參考 :

http://www.mobile01.com/topicdetail.php?f=368&t=4618137&p=2

朱小農 提到...

我用0x3F,就可以使用
device:Arduino UNO