1602 LCD在我學習Arduino或 Raspberry Pi 的過程中,經常會用到,不論是顯示日期時間、溫濕度、計數器等,只要會需要顯示的,都可以用到這個元件。到目前已經做了上百個相關的實作,再回過頭來看一下這篇文章,覺得內容有點不足,利用最近重新複習的機會,更新一下照片,再補充一些內容到本篇文章,包括如何使用I2C匯流排控制1602,並加上幾個例子使用LCD做出跑馬燈的效果。[2020.09.04]。
練習使用 HD44780相容(或稱1602)液晶顯示 LCD(Liquid crystal display),在 2x16 的顯示幕印出 "Hi,Ceiling Test!", 並測量可變電阻的數值,也同時學習使用 analogRead() 函式及 LiquidCrystal Library。執行結果如下圖:
這是改用I2C轉接板後的照片,接線明顯少很多。
[1602顯示器接腳說明]
LCD顯示器若無背光則會有14個Pin,若有背光則會有16個,而接腳位置大多如下:
LCD接腳編號 說明
1 VSS (接地)
2 VDD (5V電源輸入)
3 VO 或稱 Vee:調整對比,需接一個1k的可變電阻
4 Register Select(RS):1: D0 – D7 當作資料解釋,0: D0 – D7 當作指令解釋
5 READ/WRITE(RW): 1: 從 LCD 讀取資料,0: 寫資料到 LCD
6 Enable
7 DB0
8 DB1
9 DB2
10 DB3
11 DB4
12 DB5
13 DB6
14 DB7
15 A(+) 背光:可接330 Ohm電阻到電源
16 K(-) 背光:接地
看過一些
HD44780相容的範例, Arduino對LCD的控制有兩個重要的Library,一個是LiquidCrystal,另一個是LCD4Bit,LCD4Bit是改良自LiquidCrystal,所以也提供了較多有趣的function及控制,最重要的是LCD4Bit使用的接腳較少,且可以控制多行顯示。使用 4-bit 模式主要的好處是節省 I/O 腳位,通訊的時候只會用到 4 個高位元 (D4-D7)。
[材料]
麵包板 x 1
Arduino UNO 控制板 x 1
HD44780 相容 LCD x 1 (本實做使用 16 pin 有背光 LCD) I2C/介面 LCD1602轉接板
旋轉式可變電阻10K歐姆 x 1
電阻330歐姆 x 1
連接線 x n條
[接線圖]
LCD 1602與Arduino接線說明:
LCD1602 Arduino
1. VSS GND
2. VDD +5V
3, V0 接可變電阻Output -
4. RS 12
5. R/W 11
6. Enable 10
11. D4 5
12. D5 4
13. D6 3
14. D7 2
15. A 接330歐姆電阻,電阻另一端接+5V -
16. K 接GND -
I2C轉接板與Arduino連接說明:
LCD1602含(轉接板) Arduino
VCC +5V
GND GND
SDA SDA
SCL SCL
[程式一]
直接將LCD 1602接在Arduino上,使用LiquidCrystal的函數庫控制LCD,讀取可變電阻的數值後,顯示在LCD的第二行:
// 引用 LiquidCrystal Library
#include <LiquidCrystal.h>
// 建立 LiquidCrystal 的變數 lcd
// LCD 接腳: RS, R/W, Enable, D4, D5, D6, D7
// Arduino 接腳: 12, 11, 10, 5, 4, 3, 2
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
void setup() {
// 設定 LCD 的行列數目 (2 x 16)
lcd.begin(16, 2);
// 設定類比串列速率
Serial.begin(9600);
// 列印 "Hello World" 訊息到 LCD 上
lcd.print("Hi, Ceiling Test!");
}
void loop() {
// 將游標設到 column 0, line 1,(line 1 是第2列(row))
lcd.setCursor(0, 1);
// 讀取A0的類比值
int sensorValue = analogRead(A0);
// 將類比的數值顯示在第二列
lcd.print(sensorValue);
// 顯示電阻值在串列視窗
Serial.println(sensorValue);
delay(2000); // delay in between reads for stability
}
[結果一]
analogRead()這個函式讀取的值是 10 bit,也就是一個位於0到1023之間的值
analogRead()大約每秒鐘讀取10,000次
LCD顯示的數值會一直改變,因為用類比訊號讀取時,會有稍稍電流的變化而影響讀取值。
VIDEO
[程式二]
使用I2C介面轉換板與LCD 1602連接,透過LiquidCrystal_I2C函數庫控制LCD。這個程式是寫一個類似跑馬燈的字串,可以左右來回顯示:
#include <LiquidCrystal_I2C.h> // 引用 LiquidCrystal_I2C Library
// 設定 LCD 位址為 0x27,有 16 個字元 2 列
LiquidCrystal_I2C lcd(0x27,16,2);
int row=0;
void setup()
{
lcd.init(); // 初始化 lcd
lcd.backlight(); // 設定背板為亮
}
void loop()
{
lcd.clear();
lcd.setCursor(0,row);
lcd.print("hello!");
for(int i=0;i<10;i++)
{
lcd.scrollDisplayRight(); //往右移一格顯示
delay(200);
}
// 判斷目前行數, 是0行,將Row + 1,往下跳一行
if(row == 0){
row = row + 1;
lcd.clear();
lcd.setCursor(10,1);
lcd.print("hello!");
delay(200);
}
for(int i=0;i<10;i++)
{
lcd.scrollDisplayLeft(); //往左移一格顯示
delay(200);
}
// 判斷目前行數, 是1行,將Row 改為0行
if(row == 1){
row = 0;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("hello!");
delay(200);
}
}
[結果二]
VIDEO
[參考資料]
請問可以顯示出值,可是可變電阻很難調(調到清楚很容易就跑掉),可以怎麼解決?謝謝!
回覆刪除可以換成精密型的可變電阻
刪除想請問您1602 I2C LCD 要如何設定
回覆刪除張貼留言