PCF8574Tを使ったLCD制御

#概要
PCF8574Tを使ってLCDを制御する。
ライブラリの中身まで説明しているサイトが見つからなかったため覚書として記録。
Arduinoのライブラリを使わない方向け。


#参考サイト
・LCDの使い方
http://mitt.la.coocan.jp/pic/pic5_17.html
http://elm-chan.org/docs/lcd/hd44780_j.html
・LCD + PCF8574Tモジュール　購入先
https://www.amazon.co.jp/gp/product/B07NNFFCJD/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&psc=1

#PCF8574TとLCDの配線
| LCD | DB7 | DB6 | DB5 | DB4 | ※注1 | E | R/W | RS |
|:--------:|:--:|:---:|:--:|:--:|:-----:|:-----:|:-----:|:-----:|
| PCF8574T | P7 | P6 | P5 | P4 | P3 | P2 | P1 | P0 |

※注1：バックライトON/OFF制御用FETのGATEに接続、以降「Y」

#LCDの初期化手順(4bitモード)
##大まかな流れ
1. 一旦8bitモードに設定（3回繰り返す）
2. 4bitモードに設定
3. 2行表示モードに設定
4. ディスプレイOFF，カーソルOFF，ブリンクOFFに設定
5. ディスプレイのクリア
6. エントリーモード設定（初期化完了)

##送信データ
###一旦8bitモードに設定（3回繰り返す）
0x30 -> 0x34 -> 0x30

| LCD | DB7 | DB6 | DB5 | DB4 | - | E | R/W | RS |
|:--------:|:--:|:---:|:--:|:--:|:-----:|:-----:|:-----:|:-----:|
| PCF8574T | P7 | P6 | P5 | P4 | P3 | P2 | P1 | P0 |
| コマンド | 0 | 0 | 1 | 1 | Y | X | 0 | 0 |

###4bitモードに設定
0x20 -> 0x24 -> 0x20

| LCD | DB7 | DB6 | DB5 | DB4 | - | E | R/W | RS |
|:--------:|:--:|:---:|:--:|:--:|:-----:|:-----:|:-----:|:-----:|
| PCF8574T | P7 | P6 | P5 | P4 | P3 | P2 | P1 | P0 |
| コマンド | 0 | 0 | 1 | 0 | Y | X | 0 | 0 |

###2行表示モードに設定
0x20 -> 0x24 -> 0x20
0x80 -> 0x84 -> 0x80

| LCD | DB7 | DB6 | DB5 | DB4 | - | E | R/W | RS |
|:--------:|:--:|:---:|:--:|:--:|:-----:|:-----:|:-----:|:-----:|
| PCF8574T | P7 | P6 | P5 | P4 | P3 | P2 | P1 | P0 |
| コマンド | 0 | 0 | 1 | 0 | Y | X | 0 | 0 |
| コマンド | 1 | 0 | 0 | 0 | Y | X | 0 | 0 |

###ディスプレイON，カーソルON，ブリンクONに設定
0x00 -> 0x04 -> 0x00
0xF0 -> 0xF4 -> 0xF0

| LCD | DB7 | DB6 | DB5 | DB4 | - | E | R/W | RS |
|:--------:|:--:|:---:|:--:|:--:|:-----:|:-----:|:-----:|:-----:|
| PCF8574T | P7 | P6 | P5 | P4 | P3 | P2 | P1 | P0 |
| コマンド | 0 | 0 | 0 | 0 | Y | X | 0 | 0 |
| コマンド | Blink | Cursor | Display | 1 | Y | X | 0 | 0 |

###ディスプレイのクリア
0x00 -> 0x04 -> 0x00
0x10 -> 0x14 -> 0x10

| LCD | DB7 | DB6 | DB5 | DB4 | - | E | R/W | RS |
|:--------:|:--:|:---:|:--:|:--:|:-----:|:-----:|:-----:|:-----:|
| PCF8574T | P7 | P6 | P5 | P4 | P3 | P2 | P1 | P0 |
| コマンド | 0 | 0 | 0 | 0 | Y | X | 0 | 0 |
| コマンド | 0 | 0 | 0 | 1 | Y | X | 0 | 0 |

###エントリーモード設定（初期化完了)
0x00 -> 0x04 -> 0x00
0x60 -> 0x64 -> 0x60

| LCD | DB7 | DB6 | DB5 | DB4 | - | E | R/W | RS |
|:--------:|:--:|:---:|:--:|:--:|:-----:|:-----:|:-----:|:-----:|
| PCF8574T | P7 | P6 | P5 | P4 | P3 | P2 | P1 | P0 |
| コマンド | 0 | 0 | 0 | 0 | Y | X | 0 | 0 |
| コマンド | S | I/D | 1 | 0 | Y | X | 0 | 0 |

###カーソルをホームに移動(下位4bit送信時にバックライトON)
0x00 -> 0x04 -> 0x00
0x28 -> 0x2C -> 0x28

| LCD | DB7 | DB6 | DB5 | DB4 | - | E | R/W | RS |
|:--------:|:--:|:---:|:--:|:--:|:-----:|:-----:|:-----:|:-----:|
| PCF8574T | P7 | P6 | P5 | P4 | P3 | P2 | P1 | P0 |
| コマンド | 0 | 0 | 0 | 0 | Y | X | 0 | 0 |
| コマンド | Don't care | 1 | 0 | 0 | Y | X | 0 | 0 |


#文字の表示
###カーソルを1行目の1列目に移動
0x88 -> 0x8C -> 0x88
0x08 -> 0x0C -> 0x08

| LCD | DB7 | DB6 | DB5 | DB4 | - | E | R/W | RS |
|:--------:|:--:|:---:|:--:|:--:|:-----:|:-----:|:-----:|:-----:|
| PCF8574T | P7 | P6 | P5 | P4 | P3 | P2 | P1 | P0 |
| コマンド | 1 | 0 | 0 | 0 | Y | X | 0 | 0 |
| コマンド | 0 | 0 | 0 | 0 | Y | X | 0 | 0 |

###カーソルを2行目の1列目に移動
0xC8 -> 0xCC -> 0xC8
0x08 -> 0x0C -> 0x08

| LCD | DB7 | DB6 | DB5 | DB4 | - | E | R/W | RS |
|:--------:|:--:|:---:|:--:|:--:|:-----:|:-----:|:-----:|:-----:|
| PCF8574T | P7 | P6 | P5 | P4 | P3 | P2 | P1 | P0 |
| コマンド | 1 | 1 | 0 | 0 | Y | X | 0 | 0 |
| コマンド | 0 | 0 | 0 | 0 | Y | X | 0 | 0 |

###数字の1を出力
0x38 -> 0x3C -> 0x38
0x18 -> 0x1C -> 0x18

| LCD | DB7 | DB6 | DB5 | DB4 | - | E | R/W | RS |
|:--------:|:--:|:---:|:--:|:--:|:-----:|:-----:|:-----:|:-----:|
| PCF8574T | P7 | P6 | P5 | P4 | P3 | P2 | P1 | P0 |
| コマンド | 0 | 0 | 1 | 1 | Y | X | 0 | 1 |
| コマンド | 0 | 0 | 0 | 1 | Y | X | 0 | 1 |

###数字の2を出力
0x38 -> 0x3C -> 0x38
0x28 -> 0x2C -> 0x28

| LCD | DB7 | DB6 | DB5 | DB4 | - | E | R/W | RS |
|:--------:|:--:|:---:|:--:|:--:|:-----:|:-----:|:-----:|:-----:|
| PCF8574T | P7 | P6 | P5 | P4 | P3 | P2 | P1 | P0 |
| コマンド | 0 | 0 | 1 | 1 | Y | X | 0 | 1 |
| コマンド | 0 | 0 | 1 | 0 | Y | X | 0 | 1 |