ゆるく楽しむプログラミング

LCD1602 / LCD2004

 ビギナーキット/スタータキットに同梱されている事の多い
定番LEDモジュール LCD1602です。

1602は16文字×2行の表示サイズを表していて、
同じコントーラを使っている
20文字×4行表示の 2004 も存在します。

表示サイズが違うだけで互換性がありますので
ココでは同じものとして扱います。

マイコンとの接続

ピン名 機能 詳細
VSS GND  
VDD +5V  
VO コントラスト VDDを分圧して入力、入力電圧によってLCDのコントラストが変わる
RS コマンド/データ LOWの時 制御コマンド 、 HIGHの時 メモリーに書き込むデータ 
RW 書込/読込 LOWの時 読込。読込を行わない場合はGNDに接続 
E イネーブル信号 HIGHからLOWに変化した時に D7~D0 がレジスタに読み込まれる 
D7~D4 データ上位4Bit  
D3~D0 データ下位4Bit 4Bitモードで動作する場合、使用しない 
A バックライト アノード バックライトLEDのアノード側 
K バックライト カソード バックライトLEDのカソード側 

LiquidCrystalライブラリを使用する場合 
LCD1602は ArduinoIDEで標準サポートされており、
LCD1602用のライブラリ(LiquidCrystal)が使用できます。
LiquidCrystalライブラリを使用する場合のディフォルトの接続はサンプルスケッチの冒頭に記載されていて、その通りに配線すると
← のようになります。

※ピン番号は変更できます。

8Bit モードで使用する場合 4Bit モードで使用する場合
 I2C-パラレル変換モジュールを使用する場合 

LCDに接続した状態で販売されている事が多いですが
I2Cからパラレルに変換するユニットです。

このユニットと併用する事でLCD1602をI2C接続で使用できます。

変換モジュールの型格は FC-113 と思われます。
I2Cアドレスは0x27のモノと0x3Fのモノが存在するようです。

コマンド送信手順

LCD1602/LCD2004には4Bitモードと8Bitモードの二つの動作モードがあります。
8BitモードはD0~D7の8本の信号線を使用して コマンド/データ を送信するモード
4BitモードはD4~D7の4本の信号線を使用してコマンド/データ を送信するモードです。

RSがLOWならコマンド、HIGHならデータ
RWがLOWなら書き込み、HIGHなら読み込み です。

8Bitモード 4Bitモード
D0~D7はEがHIGHからLOWに変化したタイミングで送信されます。 D4~D7はEがHIGHからLOWに変化したタイミングで送信されます。
4Bitづつ2回に分けて送信します。
1回目に上位4Bit、2回目に下位4Bitが送信されます。
 I2C接続 
I2Cインターフェイスユニットに送信した1Byteのデータは、LCD1602の各端子に下図のように対応します。
接続方法が異なるだけで、コマンドの操作手順は4Bitモードと同じです。
 
起動時の初期化シーケンス 
① 電元ON
② 15mS Wait - 電源が安定するまでの待ち時間
③ 0x30 を送信 - Function Set (8Bit)
④ 4.1mS Wait
⑤ 0x30 を送信 - Function Set (8Bit)
⑥ 100μS Wait
⑦ 0x30 を送信 - Function Set (8Bit)
⑧ 0x38 を送信 - 8Bit Mode / 2Line Display / 5x8 CharacterModell
① 電元ON
② 15mS Wait - 電源が安定するまでの待ち時間
③ 0x3,0x0 を送信 - Function Set (8Bit)
④ 4.1mS Wait
⑤ 0x3,0x0 を送信 - Function Set (8Bit)
⑥ 100μS Wait
⑦ 0x3,0x0 を送信 - Function Set (8Bit)
⑧ 0x2,0x8 を送信 - 4Bit Mode / 2Line Display / 5x8 CharacterModell

コマンド一覧

LCD制御コマンド RS=LOW / RW=LOW
動作 D7 D6 D5 D4 D3 D2 D1 D0 16進表記 補足説明 処理時間
CLEAR 0 0 0 0 0 0 0 1 01h 20h(ブランンク)で埋める 1.52ms
HOME 0 0 0 0 0 0 1 0 02h 書き込み位置を00h(DDRAMの先頭アドレス)に設定 1.52ms
ENTRY MODE 0 0 0 0 0 1 I/D S 04h~07h カーソルの移動方向設定
07h 左にシフト
06h 右にシフト
37μs
Display ON/OFF 0 0 0 0 1 D C B 08h~0Fh D=1 Display ON
C=1 カーソル表示
B=1 カーソル点滅
37μs
Display Shift 0 0 0 1 S/C R/L 0 0 10h~1Fh S/C=1 表示をシフト(スクロール)
R/L=1 右にシフト
37μs
Function Set 0 0 1 DL N F 0 0 20h~2Fh DL=1 8Bit mode
N=1 2行表示
F=1 5x11ドット表示モデル
37μs
Set CGRAM address 0 1 AC5 AC4 AC3 AC2 AC1 AC0 40h~7Fh ユーザー定義文字用メモリに書き込む先頭アドレス設定
アドレスはAC5~AC0で指定
37μs
Set DDRAM address 1 AC6 AC5 AC4 AC3 AC2 AC1 AC0 80h~FFh キャラクタ表示用メモリに書き込む先頭アドレス設定
アドレスはAC6~AC0で指定
37μs

書き込みコマンド RS=HIGH / RW=LOW
動作 D7 D6 D5 D4 D3 D2 D1 D0 16進表記 補足説明 処理時間
Write data D7 D6 D5 D4 D3 D2 D1 D0 FFh~00h 直前に
Set CGRAM addressと
Set DDRAM addressどちらが実行されたかによって書き込み先が変わる
37μs

Busyチェック RS=LOW / RW=HIGH
動作 D7 D6 D5 D4 D3 D2 D1 D0 16進表記 補足説明 処理時間
Read Busy BF AC6 AC5 AC4 AC3 AC2 AC1 AC0 BF=1 Busy
AC6~AC0=Read dataの読込みアドレス
0μs

読込みコマンド RS=HIGH / RW=HIGH
動作 D7 D6 D5 D4 D3 D2 D1 D0 補足説明 処理時間
Read Busy D7 D6 D5 D4 D3 D2 D1 D0 CGRAM/DDRAMから1Byte読込み 37μs

DDRAMのアドレス

LCD1602 / LCD2004 は同じコントローラを使用しており、LCD1602も 20文字×4行分のDDRAMを持っています。
00h~ と40h~ のメモリーは独立していて、スクロール動作を行った場合などに1,3行目のデータが2,4目にシフトする事はありません。



ユーザー定義キャラクタ

キャラクタLCDで使用するフォントデータはROMに定義されているので変更できませんが
CGRAMを参照するユーザー定義キャラクタが8キャラクタ分用意されています。
キャラクタコード 00h~07h , 08h~0Fh で参照できます。
※00h~と08h~は同じCGRAMアドレスを参照しますので、同じフォントになります。

8Byteで1キャラクタ、8個分でCGRAMのアドレスは00h~3Fhになります。


サンプルスケッチ

8Bitモード HelloWorld
4Bitモード HelloWorld
I2C接続 HelloWorld
以上の スケッチを公開しています。

YuruPuro/LCD1602-4BitMode.ino

解説動画