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轉接板後的照片,接線明顯少很多。
看過一些HD44780相容的範例,Arduino對LCD的控制有兩個重要的Library,一個是LiquidCrystal,另一個是LCD4Bit,LCD4Bit是改良自LiquidCrystal,所以也提供了較多有趣的function及控制,最重要的是LCD4Bit使用的接腳較少,且可以控制多行顯示。使用 4-bit 模式主要的好處是節省 I/O 腳位,通訊的時候只會用到 4 個高位元 (D4-D7)。
I2C轉接板與Arduino連接說明:
練習使用 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顯示的數值會一直改變,因為用類比訊號讀取時,會有稍稍電流的變化而影響讀取值。
[程式二]
使用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); } }
[結果二]
[參考資料]
- Arduino.cc :Examples > Libraries > LiquidCrystal
請問可以顯示出值,可是可變電阻很難調(調到清楚很容易就跑掉),可以怎麼解決?謝謝!
回覆刪除可以換成精密型的可變電阻
刪除想請問您1602 I2C LCD 要如何設定
回覆刪除張貼留言