📟
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