📟

LCDモジュールの使い方

2023/01/09に公開


配線が多すぎるためできれば I2C 版を使いたい

部品

1602 LCD モジュール。

https://akizukidenshi.com/catalog/g/gP-01675/

https://www.amazon.co.jp/dp/B07WTMXRTQ

https://www.amazon.co.jp/gp/product/B083DT6181

配線

LCD 側 Arduino 側
VSS GND
VDD 5V
V0 5V 可変抵抗10KΩを経由すること
RS D7
RW GND
E D8
D4 D9
D5 D10
D6 D11
D7 D12
A 5V バックライト用
K GND バックライト用
  • GPIOは最低でも8本必要になる
  • 可変抵抗値でコントラストが変わる
  • バックライトが不要なら接続しなくてもよい

コード

#include <LiquidCrystal.h>

LiquidCrystal lcd(7, 8, 9, 10, 11, 12); // RS, E, D4, D5, D6, D7 に対応する番号

void setup() {
  lcd.begin(16, 2); // 画面サイズ
}

void loop() {
  lcd.home();
  lcd.print("COUNT:");
  lcd.print(millis());
}
  • 左上 (0, 0)
  • 右下 (15, 1)
  • 内部カーソルを持っている
  • (15, 0) のあとで表示しても折り返さない

カタカナを表示する方法

// OK
lcd.write('ア');
lcd.write('イ');

// NG
lcd.print("ア");
lcd.write("ア");
lcd.write("アイ");
lcd.write("アイ");

半角カナを文字単位で write する。

ライブラリ

https://github.com/arduino-libraries/LiquidCrystal

Arduino IDE に最初から入っている。

ライブラリの使い方

基本
Method 意味
begin(cols, rows) 画面サイズで初期化。最初に1回だけ呼ぶ
clear 消して左上に移動する
setCursor(col, row) 任意の位置に移動する
write(str) 文字列を表示する
print(str) 文字列を表示する (Serial.print に類似)
特殊
Method 意味
home 左上に移動する
cursor カーソル(_)を表示する
blink カーソル(■)を点滅する
autoscroll カーソル位置は固定で画面を流す
leftToRight カーソルは右に動くとする (初期値)
scrollDisplayLeft ←にずらす
scrollDisplayRight →にずらす
createChar 独自のフォントを定義する
しない系
Method 意味
noCursor カーソル(_)を表示しない
noBlink カーソル(■)を点滅しない
noDisplay 全体を表示しない (バックライトは点いたまま)
noAutoscroll autoscroll をしない
忘れてよい
Method 意味
display 全体を表示する(初期値)
rightToLeft カーソルは左に動く

電光掲示板風に流す方法

lcd.autoscroll();
lcd.setCursor(16, 0); // X は画面外を指している
lcd.leftToRight();    // ← 初期値なので指定しなくてもよい

lcd.print("a");
lcd.print("b");
lcd.print("c");
右から文章が出てくる
・・・・・・・・・・・・・・・a
・・・・・・・・・・・・・・ab
・・・・・・・・・・・・・abc

謎の挙動

左から文字を流すのはなぜかうまくいかない。

lcd.autoscroll();
lcd.setCursor(-1, 0);
lcd.rightToLeft();

lcd.print("c");
lcd.print("b");
lcd.print("a");

上のコードは左側から abc が流れてくるはずだが何も表示されない。開始位置を lcd.setCursor(0, 0) とすると abc とは表示される。しかし、0桁目が何も表示されない上 ab と c の行が分断されたりとおかしな挙動をする。開始位置を lcd.setCursor(1, 0) も行が分断する。開始位置を lcd.setCursor(2, 0) だとうまくいくが左側に3桁分のスペースが空く。フォークされた Adafruit_LiquidCrystal を使ってみても同じ挙動だった。正しく行うなら scrollDisplayRight を自分で呼んだ方がよさそう。

rightToLeft の動作

lcd.rightToLeft();
lcd.setCursor(2, 0);
lcd.print("abc");
cba・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・

左上に cba と表示される。

独自のフォントの定義と表示

byte box[] = {
  0b11111,
  0b10001,
  0b10001,
  0b10001,
  0b10001,
  0b10001,
  0b10001,
  0b11111,
};

lcd.createChar(0, box);  // 定義
lcd.write(byte(0));      // 表示

0〜7 まで登録できる。box がグローバル変数である必要はない。byte(0) の表記は見たことがないが (byte)0 としても通ったので同じことのようだ。int(0)(int)0 としても通った。

参照

https://github.com/arduino-libraries/LiquidCrystal/blob/master/docs/api.md

Discussion