📟
LCDモジュールの使い方
配線が多すぎるためできれば I2C 版を使いたい
部品
1602 LCD モジュール。
配線
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 する。
ライブラリ
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
としても通った。
参照
Discussion