Semorphe

液晶顯示

不用電腦也看得到板子在說什麼。 · ⏱ 約 25 分鐘

你會學到三件事

  1. LCD 是一塊有行有列的畫布
  2. setCursor 決定接下來寫在哪裡
  3. 「先移游標、再寫字」,這個順序不能反

開始之前

序列埠很好用,而它需要一條線接著電腦。

做成品的時候你要的是:拔掉電腦,它還看得到。

接線(並列式 LiquidCrystal):RS→12、E→11、D4→5、D5→4、 D6→3、D7→2,另外接電源和一顆調對比的可變電阻。

🟢 先把編輯器打開,跟著下面一起做:跟著做

一、宣告

宣告的時候要說它接在哪幾支腳:

1LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
12115432宣告字元液晶lcd(並列式)使用命名空間std引入函式庫LiquidCrystal.h1

括號裡是六支腳的號碼,順序是 RS, E, D4, D5, D6, D7。

⚠️ 順序錯的話畫面會是亂碼或空白,而不會報錯。

和第 8 課的 Servo s; 一樣,這是一個物件,它有自己的動作。

積木盤上這一顆寫著「宣告字元液晶 …(…)」。

二、告訴它多大

在 setup 裡說它有幾行幾列:

1lcd.begin(16, 2);
變數lcd162執行begin(對,)1

16 行寬、2 列高,是最常見的規格(也有 20×4 的)。

⚠️ 這一行在 setup() 裡,而且要在任何 print 之前。

積木上它寫著「設定液晶 … 為 … 行 … 列」。

三、先移游標,再寫字

寫字之前要先說寫在哪一格:

1lcd.setCursor(0, 0);2lcd.print("Hello");
變數lcd00變數lcd"Hello"執行print(對)執行setCursor(對,)12

setCursor(第幾行, 第幾列):

這兩顆在積木上寫著「把液晶 … 的游標移到第 … 行第 … 列」 與「在液晶 … 上顯示 …」。

       0  1  2  3  4  5 ... 15
列 0   H  e  l  l  o
列 1

⚠️ 兩個都從 0 開始,又是那件事。 所以 16×2 的螢幕,合法的位置是行 0~15、列 0~1。

⚠️ 順序不能反。 print 之後再 setCursor 是沒有意義的: 游標是「接下來寫在哪」,不是「剛剛寫在哪」。

四、⚠️ 覆蓋不會清乾淨

LCD 不會自己清空。在同一個位置寫 100 再寫 5,會變成 500, 因為只有第一格被蓋掉。

兩種解法:

🔎 這一段是試一下——打了看結果就好,不要留在程式裡。

1lcd.clear();                 // 全部清掉(會閃一下)2lcd.print("5   ");           // 或者自己補空格蓋掉
變數lcd變數lcd"5   "執行print(對)清空12

每次都 clear() 會讓畫面閃爍,所以顯示會變的數字時, 補空格通常比較好看。

完成的樣子

這一課的參考做法——程式碼每一行的號碼,就印在對應的那塊積木上。

1LiquidCrystal lcd(12, 11, 5, 4, 3, 2);2 3void setup() {4    lcd.begin(16, 2);5    lcd.setCursor(0, 0);6    lcd.print("Hello");7}8 9void loop() {10}
1211543216200"Hello"在液晶lcd上顯示把液晶lcd的游標移到第行第列設定液晶lcd為行列定義函式 回傳型別void(無回傳)loop定義函式 回傳型別void(無回傳)setup宣告字元液晶lcd(並列式)使用命名空間std引入函式庫LiquidCrystal.h134956

換你了

把第 5 課的光感應值顯示在第二列,每秒更新一次 (⚠️ 用第 10 課的 millis(),不要用 delay)。

記得處理「從 3 位數變 2 位數」的殘影問題。

到編輯器做這一題:練習:把光感應值顯示在第二列(用 millis 不用 delay)

做一個

在 LCD 上顯示 分:秒,從 0 開始跑。用 millis 不准用 delay。

🔴 秒數要補零:1:05 不是 1:5。那一行你得自己寫。 ⚠️ 而不要每一圈都重寫整個畫面,會閃。只在數字真的變了的時候才寫。

到編輯器做這一題:做一個:一個會跑的碼錶

這一課你做了什麼

如果卡住了

你看到 多半是因為
整片空白 對比沒調(轉那顆可變電阻),或背光沒接
一整排黑方塊 沒收到資料——begin 漏了,或腳位順序錯
亂碼 六支腳的順序錯了
數字有殘影 覆蓋不會清乾淨。補空格或 clear()
畫面一直閃 每次 loop 都 clear() 了。改成只在值變了才更新
在編輯器打開這一課 →