I2C接続LCDで初期化の設定などでよく使う制御コマンドについてまとめました。
この記事を読めば、I2C接続LCDを使用する上で最初に行わなければならない初期化の設定ができるようになると思います。
また、別記事の「I2C接続LCDを動かす(表示データの指示方法)」の内容と組み合わせれば表示した文字に駅の電光掲示板のようなアニメーションをつけることが出るようになると思います。
記事の最後にサンプルプログラムをつけておきますので参考にしていただければと思います。
- 初期化で使う制御コマンド
- アニメーションに使う制御コマンド
- サンプルプログラム
初期化で使う制御コマンド
1.Function Set(機能設定)
・各bit説明
データ転送のデータ幅8bit or 4bit ,表示行数,フォントタイプ、命令テーブルの設定
7bit | 6bit | 5bit | 4bit | 3bit | 2bit | 1bit | 0bit |
0 | 0 | 1 | DL | N | DH | 0 | IS |
DL・・・データ転送のデータ幅を設定 通常は「1」の8ビット・モード
0:4ビット・モード
1:8ビット・モード
N…表示行数の設定
0:1行表示
1:2行表示
DH…フォントタイプの設定
0:通常フォントを使用
1:大フォントを使用
IS…命令テーブルの設定
0:命令テーブル1を選択
1:命令テーブル2を選択
表示行数,フォントタイプの設定について
今回使用しているLCDは2行16列となっており、N=0とすると上の行のみを使用するようになります。2行表示のLCDにわざわざ1行のみ使用する設定を行っても意味はありません。この設定はDHの設定で大フォントを選択したときに使用します。
IS(命令テーブルの設定)について
IS=0の命令デーブル1はSet CGRAM Address(CGRAMアドレス設定)となっています。あまり使わないので説明は省略します。
IS=1の命令テーブル2では、通信クロックやコントラストなどの設定を行います。
・Internal OSC frequency(内部クロック周波数)
7bit | 6bit | 5bit | 4bit | 3bit | 2bit | 1bit | 0bit |
0 | 0 | 0 | 1 | BH | F2 | F1 | F0 |
BS・・・内部発振回路の設定で通常は「0」を指定
0:1/5バイアス
1:1/4バイアス
F2~F0…内部発振回路の周波数の設定で通常はF2=1,F1~0=0を指定
・Power/ICONControl/Contrast set(パワー/アイコン制御/コントラスト設定)
7bit | 6bit | 5bit | 4bit | 3bit | 2bit | 1bit | 0bit |
0 | 1 | 0 | 1 | Ion | Bon | C5 | C4 |
Ion・・・アイコンの表示設定 今回の製品はアイコンが設定されていないため「0」
0:アイコンの表示をOFF
1:アイコンの表示をON
Bon…内部で電圧を上げるブースター回路の設定
0:ブースタ回路をOFF
1:ブースタ回路をON
今回のLCDは5V駆動ですが、内部で電圧を上げるブースター回路を使用することで電源電圧が3.3Vだった場合でも使用することができます。
C5~4…コントラストを設定
・Contrast set(コントラスト設定)
7bit | 6bit | 5bit | 4bit | 3bit | 2bit | 1bit | 0bit |
0 | 1 | 1 | 1 | C3 | C2 | C1 | C0 |
先の「Power/ICONControl/Contrast set」のC5~4と含めたC5~0でコントラストの設定ができます。通常はC5=1,C4~0=0の「100000」で設定します。
・Follower control(フォロワ回路制御)
7bit | 6bit | 5bit | 4bit | 3bit | 2bit | 1bit | 0bit |
0 | 1 | 1 | 0 | Fon | Rab2 | Rab1 | Rab0 |
Fon・・・フォロワ回路ON/OFFの設定
0:フォロワ回路をOFF
1:フォロワ回路をON
Rab2~0…フォロワ回路の増幅度を設定
液晶コントラスト制御関係の回路設定を行います。通常はFon=1,Rab2=1,Rab1~0=0 で設定します。
2.Display ON/OFF Control(表示ON/OFFコントロール)
LCD電源のON/OFFとカーソル(入力位置)の表示設定を行います。
7bit | 6bit | 5bit | 4bit | 3bit | 2bit | 1bit | 0bit |
0 | 0 | 0 | 0 | 1 | D | C | B |
D・・・LCD電源ON/OFFの設定
0:ディスプレイをOFF
1:ディスプレイをON
C・・・カーソル表示ON/OFFの設定
0:カーソル表示をOFF
1:カーソル表示をON
B・・・ブリンク表示ON/OFFの設定
0:ブリンクをOFF
1:ブリンクをON
カーソルOFF_ブリンクOFF
カーソルON_ブリンクOFF
カーソルOFF_ブリンクON
3.Clear Display(表示をクリア)
LCDの表示箇所の全域に「半角スペース」を書込みます。また、カーソル(入力位置)を初期位置(左上)に戻します。
7bit | 6bit | 5bit | 4bit | 3bit | 2bit | 1bit | 0bit |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
4.プログラム例
液晶の初期化のプログラム例を下記に示します。参考にしていただければと思います。下記プログラムでLCDは「2.Display ON/OFF Control」にある「カーソルOFF ブリンクOFF」の動きをします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
#include <Wire.h> void setup() { Wire.begin();//i2c初期化 init_LCD();//液晶初期化 } void loop() { //「Word」を入力 char moji[] ="Word"; for(int i = 0; i < 4; i++) { writeData(moji[i]); delay(1000); } writecommand(0b00000001);//表示をクリア delay(1000); } //データ書き込み void writeData(byte data){ Wire.beginTransmission(0x3E); Wire.write(0x40); Wire.write(data); Wire.endTransmission(); delay(1); } //コマンド書き込み void writecommand(byte command){ Wire.beginTransmission(0x3E); Wire.write(0x00); Wire.write(command); Wire.endTransmission(); delay(20); } //液晶初期化 void init_LCD() { delay(100); writecommand(0b00111001);//39 Function Set(機能設定) 8bitモード,2桁表示,通常フォント,コマンドグループ2の設定へ移行 delay(20); writecommand(0b00010100);//14 Internal OSC frequency(内部クロック周波数) 内部発振回路設定 通常0 , 内部発振回路周波数 通常100 delay(20); writecommand(0b01010010);//52 Power/ICONControl/Contrast set(パワー/アイコン制御/コントラスト設定) アイコン表示OFF,ブースタ回路OFF(電源5V),コントラスト設定↓ delay(20); writecommand(0b01110000);//70 Contrast set(コントラスト設定) C5~C0:100000 delay(20); writecommand(0b01101100);//6C Follower control(フォロワ回路制御)コントラストを制御する電子回路(オペアンプ増幅回路)の設定 回路適用 通常は1,増幅度 通常は100 delay(20); writecommand(0b00000001);//01 Clear Display(表示をクリア) delay(20); writecommand(0b00001100);//0C Display ON/OFF Control(表示ON/OFFコントロール) ディスプレイ電源ON,カーソル表示OFF,ブリンクOFF delay(20); writecommand(0b00000010);//02 Return Home(表示シフトを初期位置に戻る) } |
アニメーションに使う制御コマンド
液の電光掲示板のように表示した文字が横にスライドしていくような演出をしたいときに使うコマンドを紹介します
1.Set DDRAM Address(DDRAMアドレス設定)
入力位置を任意の場所に設定します。
7bit | 6bit | 5bit | 4bit | 3bit | 2bit | 1bit | 0bit |
1 | 入力位置Address |
入力位置Address(初期位置)
上記の入力位置Addressは7bit目除いての16進数表記になります。実際のプログラムでは7bit目と6~0bitを分けて書いた方が便利です。要するに入力Address「01」を指示したい時は
0b10000000+0b00000001=0x80+0x01
と入力するわけです。こうすることでプログラム内でも入力位置Addressがわかりやすくなります。本記事でのプログラムはこのように書いております。
2.Entry Mode Set(エントリ・モード設定)
表示データを書込んだ後のカーソルの移動方向を設定します。また,表示データの書込みを行った後に,表示をシフトするかどうかを設定します。
7bit | 6bit | 5bit | 4bit | 3bit | 2bit | 1bit | 0bit |
0 | 0 | 0 | 0 | 0 | 1 | I/D | S |
I/D・・・カーソルの移動方向を設定
0:カーソルを左に移動
1:カーソルを右に移動
S・・・カーソルと共に表示をシフトするかどうかを設定
0:表示のシフトは行わない
1:表示をカーソルと共にシフトする(方向はI/Dと同じ)
3.Return Home(初期位置に戻る)
カーソルを初期位置「入力位置Address=00」に戻し,表示のシフトも元に戻す。「Clear Display」とは違い、表示内容はクリアにならない。
7bit | 6bit | 5bit | 4bit | 3bit | 2bit | 1bit | 0bit |
0 | 0 | 0 | 0 | 0 | 0 | 1 | – |
4.アニメーション制作
上の3項目の制御コマンドを使えば下にあるようなアニメーションか作れるようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
#include <Wire.h> void setup() { Wire.begin();//i2c初期化 init_LCD();//液晶初期化 } void loop() { writecommand(0x80+0x10);//カーソル座標「10」に設定 writecommand(0b00000111);//04 Entry Mode Set(エントリ・モード設定) カーソル移動右,表示シフトする //「Word」を入力 char moji[] ="Word"; for(int i = 0; i < 4; i++) { writeData(moji[i]); delay(300); } //「スペース」を12回入力 for(int r = 0; r < 12; r++) { writeData(' '); delay(300); } writecommand(0x80+0x0F);//カーソル座標「0F」に設定 writecommand(0b00000101);//04 Entry Mode Set(エントリ・モード設定) カーソル移動左,表示シフトする //「スペース」を12回入力 for(int l = 0; l < 12; l++) { writeData(' '); delay(300); } writecommand(0b00000001);//表示をクリア delay(500); writecommand(0b00000010);//表示のシフトを元に戻す } //データ書き込み void writeData(byte data){ Wire.beginTransmission(0x3E); Wire.write(0x40); Wire.write(data); Wire.endTransmission(); delay(1); } //コマンド書き込み void writecommand(byte command){ Wire.beginTransmission(0x3E); Wire.write(0x00); Wire.write(command); Wire.endTransmission(); delay(20); } //液晶初期化 void init_LCD() { delay(100); writecommand(0b00111001);//39 Function Set(機能設定) 8bitモード,2桁表示,通常フォント,コマンドグループ2の設定へ移行 delay(20); writecommand(0b00010100);//14 Internal OSC frequency(内部クロック周波数) 内部電源回路設定 通常0 , 内部発振回路周波数 通常100 delay(20); writecommand(0b01010010);//52 Power/ICONControl/Contrast set(パワー/アイコン制御/コントラスト設定) アイコン表示OFF,ブースタ回路OFF(電源5V),コントラスト設定↓ delay(20); writecommand(0b01110000);//70 Contrast set(コントラスト設定) C5~C0:100000 delay(20); writecommand(0b01101100);//6C Follower control(フォロワ回路制御)コントラストを制御する電子回路(オペアンプ増幅回路)の設定 そのまま delay(20); writecommand(0b00000001);//01 Clear Display(表示をクリア) delay(20); writecommand(0b00001110);//0C Display ON/OFF Control(表示ON/OFFコントロール) ディスプレイ電源ON,カーソル表示OFF,ブリンクOFF delay(20); writecommand(0b00000010);//02 Return Home(表示シフトを初期位置に戻る) } |
カーソルや表示のシフトについては文字やプログラムでは分かりにくいかもしれません。下記にプログラムと表示箇所を示した資料を用意しましたので参考になればと思います。
サンプルプログラム
アニメーションのサンプルプログラムです。参考にしていただければと思います。
1.左から右へ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
#include <Wire.h> void setup() { Wire.begin();//i2c初期化 init_LCD();//液晶初期化 } void loop() { writecommand(0x80+0x10);//カーソル座標「10」に設定 writecommand(0b00000111);//04 Entry Mode Set(エントリ・モード設定) カーソル移動右,表示シフトする //「ヨロシクオネガイイタシマス」を入力 char moji[] ="\xd6\xdb\xbc\xb8\xb5\xc8\xb6\xde\xb2\xb2\xc0\xbc\xcf\xbd"; for(int i = 0; i < 14; i++) { writeData(moji[i]); delay(500); } //「スペース」を12回入力 for(int r = 0; r < 18; r++) { writeData(' '); delay(500); } delay(3000); writecommand(0b00000001);//表示をクリア delay(500); writecommand(0b00000010);//表示のシフトを元に戻す } //データ書き込み void writeData(byte data){ Wire.beginTransmission(0x3E); Wire.write(0x40); Wire.write(data); Wire.endTransmission(); delay(1); } //コマンド書き込み void writecommand(byte command){ Wire.beginTransmission(0x3E); Wire.write(0x00); Wire.write(command); Wire.endTransmission(); delay(20); } //液晶初期化 void init_LCD() { delay(100); writecommand(0b00111001);//39 Function Set(機能設定) 8bitモード,2桁表示,通常フォント,コマンドグループ2の設定へ移行 delay(20); writecommand(0b00010100);//14 Internal OSC frequency(内部クロック周波数) 内部発振回路設定 通常0 , 内部発振回路周波数 通常100 delay(20); writecommand(0b01010010);//52 Power/ICONControl/Contrast set(パワー/アイコン制御/コントラスト設定) アイコン表示OFF,ブースタ回路OFF(電源5V),コントラスト設定↓ delay(20); writecommand(0b01110000);//70 Contrast set(コントラスト設定) C5~C0:100000 delay(20); writecommand(0b01101100);//6C Follower control(フォロワ回路制御)コントラストを制御する電子回路(オペアンプ増幅回路)の設定 回路適用 通常は1,増幅度 通常は100 delay(20); writecommand(0b00000001);//01 Clear Display(表示をクリア) delay(20); writecommand(0b00001110);//0C Display ON/OFF Control(表示ON/OFFコントロール) ディスプレイ電源ON,カーソル表示OFF,ブリンクOFF delay(20); writecommand(0b00000010);//02 Return Home(表示シフトを初期位置に戻る) } |
2.左右の行き来を3回
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
#include <Wire.h> void setup() { Wire.begin();//i2c初期化 init_LCD();//液晶初期化 } void loop() { writecommand(0x80+0x10);//カーソル座標「10」に設定 writecommand(0b00000111);//04 Entry Mode Set(エントリ・モード設定) カーソル移動右,表示シフトする //「Word」を入力 char moji[] ="Word"; for(int i = 0; i < 4; i++) { writeData(moji[i]); delay(300); } //往復回数指定 for(int j = 0; j < 3; j++) { writecommand(0x80+0x14);//カーソル座標「14」に設定 writecommand(0b00000111);//04 Entry Mode Set(エントリ・モード設定) カーソル移動右,表示シフトする //「スペース」を12回入力 for(int r = 0; r < 12; r++) { writeData(' '); delay(300); } writecommand(0x80+0x0F);//カーソル座標「0F」に設定 writecommand(0b00000101);//04 Entry Mode Set(エントリ・モード設定) カーソル移動左,表示シフトする //「スペース」を12回入力 for(int l = 0; l < 12; l++) { writeData(' '); delay(300); } } writecommand(0b00000001);//表示をクリア delay(500); writecommand(0b00000010);//表示のシフトを元に戻す } //データ書き込み void writeData(byte data){ Wire.beginTransmission(0x3E); Wire.write(0x40); Wire.write(data); Wire.endTransmission(); delay(1); } //コマンド書き込み void writecommand(byte command){ Wire.beginTransmission(0x3E); Wire.write(0x00); Wire.write(command); Wire.endTransmission(); delay(20); } //液晶初期化 void init_LCD() { delay(100); writecommand(0b00111001);//39 Function Set(機能設定) 8bitモード,2桁表示,通常フォント,コマンドグループ2の設定へ移行 delay(20); writecommand(0b00010100);//14 Internal OSC frequency(内部クロック周波数) 内部電源回路設定 通常0 , 内部発振回路周波数 通常100 delay(20); writecommand(0b01010010);//52 Power/ICONControl/Contrast set(パワー/アイコン制御/コントラスト設定) アイコン表示OFF,ブースタ回路OFF(電源5V),コントラスト設定↓ delay(20); writecommand(0b01110000);//70 Contrast set(コントラスト設定) C5~C0:100000 delay(20); writecommand(0b01101100);//6C Follower control(フォロワ回路制御)コントラストを制御する電子回路(オペアンプ増幅回路)の設定 そのまま delay(20); writecommand(0b00000001);//01 Clear Display(表示をクリア) delay(20); writecommand(0b00001110);//0C Display ON/OFF Control(表示ON/OFFコントロール) ディスプレイ電源ON,カーソル表示OFF,ブリンクOFF delay(20); writecommand(0b00000010);//02 Return Home(表示シフトを初期位置に戻る) } |