LCDやOLEDのキャラクタディスプレイは電子工作で良く使われます。フォントデータを内蔵していて使いやすい表示器で,マイコンからI2Cシリアル接続するものも多く見られます。
Arduinoなどでは各ディスプレイに適合するライブラリが充実していてすぐに使えますが,PICAXEやメモリの少ないマイコンで使うには自作プログラムが,,,ということで,いろいろとやっている概略のメモです。
1.キャラクタディスプレイのベース,パラレルインターフェイス
16文字2行の1602型とか20文字4行の2004型などの多くはレジェンドICである日立のHD44780(互換)LCDコントローラの様式で制御されているようです。
HD44780は8bitデータバス(4bitモードもあり)のパラレルインターフェイスでマイコンに接続するコントローラで,I2Cシリアル通信機能を追加したディスプレイでも最終的な制御は同じと考えて良いと思います。
1602型のキャラクタディスプレイを8bitと4bitデータバスでPICAXE-20M2に接続したところです。
![](https://stat.ameba.jp/user_images/20210715/17/pta55/71/11/j/o1200040114972456049.jpg?caw=800)
→ PICAXEに元祖パラレルインターフェースで液晶キャラクタディスプレイをつないでみる
→ PICAXEに4bitパラレルインターフェースで液晶キャラクタディスプレイをつないでみる
8本のデータバス(4bitモードでは上位4bitを使用)と少なくても2本のコントロール線(RS,E)が必要です。
・RS(レジスタセレクト):データが制御コマンドか表示データかに振り分ける
・E(イネーブル):有効なデータを取り込むゲート
![](https://stat.ameba.jp/user_images/20210715/17/pta55/19/51/j/o1047080314972456052.jpg?caw=800)
(SC1602Bのデータシートより一部転載)
パラレルインターフェイスでの動作は速く,またプログラムはシンプルに書けます。
PICAXEのBASICでの例です。
![](https://stat.ameba.jp/user_images/20210715/17/pta55/e1/64/j/o1173074714972456057.jpg?caw=800)
ただ,上の写真でもわかるように6-10本の接続は小さなマイコンにとってはなかなかの負担で,他に使えるPinが少なくなります(^^;;;;;;。
そこで小さなマイコンからでも2本の接続線で通信できるI2C機能が追加されたものがあります。
I2Cシリアル通信ではパラレルでは結線したRSやEというコントロール信号を別のラインにはできないので,データと同じラインで送ることになり,その方法は私の手持ちでは2種類あります。
以下に種類別にメモします。
2.I2C通信でコントロールバイトを先導して送る方式
内蔵のコントロールICがあらかじめI2C機能を持っているタイプのLCDやOLEDキャラクタディスプレイで使われている方式です。
このタイプはまず1byteのコントロールバイトを送り,次に続くデータが制御コマンドか表示データかを知らせます。
PICAXEに接続しているところです。
![](https://stat.ameba.jp/user_images/20210715/19/pta55/f2/91/j/o1101059814972512401.jpg?caw=800)
→ PICAXEでGroveのRGBバックライト液晶モジュールを使う
→ 有機EL(OLED)のキャラクタディスプレイを使ってみた
→ リアルタイムクロックを小さなキャラクタ液晶ディスプレイ(LCD)に表示してみた
コントロールバイトとデータ(制御コマンドか表示データ)の送り方です。
RSがコントロールバイトの第6bitに含まれているのが見えます(^^)。
このbitが0なら次の1byteは制御コマンド,1なら表示データです。
![](https://stat.ameba.jp/user_images/20210715/19/pta55/6f/69/j/o0895049714972512402.jpg?caw=800)
(DFROBOT LCD1602 RGB BacklightModule から一部改編)
最初のスレーブアドレスはI2Cのお約束で,初期設定されたものが自動的に出ます。この機種では0x7C(8bit表記),0x3E(7bit表記)なのが分かります。
上記の図で一番の問題点はコントロールバイトの第7bitの「Co」です。
私なりの解釈では
・Co(Continue)が0ならこのコントロールバイトが最後の指示で,ストップコンディションが来るまで他のコントロールバイトは来ず,ずっとこのコントロールバイトの指示が有効なデータの連続です。
・Coが1ならこのコントロールバイトの指示は次の1byteのデータだけに有効で,その後には別のコントロールバイトが続きます。
ということではないか,,,と思います。
ですから,Co=1の時の例にCommand Word という名前をつけるのが良く分かりません。Co=1でもRSが1なら表示データを1byte送れるはずです。私のcommandという言葉の解釈が制御とばかり思うからかもしれませんけど,,,。
多分,Co=1の時はこの2byteで完結する,ひとかたまりの1wordですよ,という意味なのでしょうね。
ま,ともかくコントロールバイトの指示に従って,データは制御コマンドか表示データに分類されてそれぞれの働きをします。インストラクションはHD44780互換です。
![](https://stat.ameba.jp/user_images/20210715/19/pta55/ca/a1/j/o0971076314972512406.jpg?caw=800)
(JHD1313データシートから一部改編)
PICAXEのBASICでReal Time Clockから日時を読み出して,LCDに表示している例です。面倒なのでCoは常に0にしています(^^;;;
なお,PICAXEのhi2cout()では最後にストップコンディションが出るようです。
ArduinoならWire.endTransmission() で出るのでしょうね。
![](https://stat.ameba.jp/user_images/20210715/19/pta55/ac/27/j/o0995107714972512410.jpg?caw=800)
制御コマンドはwaitが必要なものもあるので,Arduinoなどの速さがある場合は1個ずつ送るのが確かでしょうね。
PICAXEは遅いので,特に表示データなどは1ストリームで送っても良いはずです,,。
3.I2C通信で上位4bitをデータ,下位4bitをコントロール信号にして送る方式
パラレルインターフェイスのLCDの製品にI2C通信のシリアル・パラレル変換のモジュールを追加したタイプで使われている方式です。
PICAXEで2004型のLCDを動かしたところです。
![](https://stat.ameba.jp/user_images/20210715/21/pta55/f0/88/j/o1200031514972568479.jpg?caw=800)
→ I2C接続の20x4キャラクタ液晶ディスプレイをライブラリのないPICAXEで動かしてみた
データ(制御コマンドか表示データ)とコントロール信号の送り方です。
LCDコントローラの4bitモードを使い,上位4bitをデータ,下位4bitをコントロール信号に使用しています。
![](https://stat.ameba.jp/user_images/20210715/21/pta55/8f/fd/j/o1207054014972568484.jpg?caw=800)
制御コマンドも表示データも8bitを上位下位の順に,また上位,下位それぞれにE(Enable)の上げ下げを行うので1byteのデータを送るのに4回,4byteの送信が必要です。
それでもLCD自体,さほど高速な機器ではないので,十分すぎるスピードは出ますが,自作プログラムではデータ送信の過程が少々面倒です(^^;;;;;;;;
インストラクションはこれもHD44780互換ですが,初期設定でHD44780の4bitモードの設定には定石がありますので要注意です。
PICAXEのBASICで1byte データを上位下位4bitずつ送信している部分です。
hi2cout()でI2C送信が4回行われています。
![](https://stat.ameba.jp/user_images/20210715/21/pta55/a3/65/j/o0880052114972568487.jpg?caw=800)
手持ちのパラレルインターフェイスのLCDに追加のI2Cモジュールを自作するなら,I2C通信で8bitX2のパラレル出力のICが120円ぐらいであるので,そちらの方がもう少しスマートにコントロールできるかもしれませんね(^^)。
以上,手持ちのキャラクタディスプレイを使ってみたメモです。
キャラクタディスプレイは仕組みがある程度分かっているとPICAXEでも使えますし,また小さなマイコンでも必要な機能だけに絞れば使えるという利点もあるかもしれません。
Arduinoなら豊富なライブラリを使えば,特に時間や労力を割く部分ではないのでしょうが,ま,趣味なので(^^;;;;;;;;
Arduinoなどでは各ディスプレイに適合するライブラリが充実していてすぐに使えますが,PICAXEやメモリの少ないマイコンで使うには自作プログラムが,,,ということで,いろいろとやっている概略のメモです。
1.キャラクタディスプレイのベース,パラレルインターフェイス
16文字2行の1602型とか20文字4行の2004型などの多くはレジェンドICである日立のHD44780(互換)LCDコントローラの様式で制御されているようです。
HD44780は8bitデータバス(4bitモードもあり)のパラレルインターフェイスでマイコンに接続するコントローラで,I2Cシリアル通信機能を追加したディスプレイでも最終的な制御は同じと考えて良いと思います。
1602型のキャラクタディスプレイを8bitと4bitデータバスでPICAXE-20M2に接続したところです。
![](https://stat.ameba.jp/user_images/20210715/17/pta55/71/11/j/o1200040114972456049.jpg?caw=800)
→ PICAXEに元祖パラレルインターフェースで液晶キャラクタディスプレイをつないでみる
→ PICAXEに4bitパラレルインターフェースで液晶キャラクタディスプレイをつないでみる
8本のデータバス(4bitモードでは上位4bitを使用)と少なくても2本のコントロール線(RS,E)が必要です。
・RS(レジスタセレクト):データが制御コマンドか表示データかに振り分ける
・E(イネーブル):有効なデータを取り込むゲート
![](https://stat.ameba.jp/user_images/20210715/17/pta55/19/51/j/o1047080314972456052.jpg?caw=800)
(SC1602Bのデータシートより一部転載)
パラレルインターフェイスでの動作は速く,またプログラムはシンプルに書けます。
PICAXEのBASICでの例です。
![](https://stat.ameba.jp/user_images/20210715/17/pta55/e1/64/j/o1173074714972456057.jpg?caw=800)
ただ,上の写真でもわかるように6-10本の接続は小さなマイコンにとってはなかなかの負担で,他に使えるPinが少なくなります(^^;;;;;;。
そこで小さなマイコンからでも2本の接続線で通信できるI2C機能が追加されたものがあります。
I2Cシリアル通信ではパラレルでは結線したRSやEというコントロール信号を別のラインにはできないので,データと同じラインで送ることになり,その方法は私の手持ちでは2種類あります。
以下に種類別にメモします。
2.I2C通信でコントロールバイトを先導して送る方式
内蔵のコントロールICがあらかじめI2C機能を持っているタイプのLCDやOLEDキャラクタディスプレイで使われている方式です。
このタイプはまず1byteのコントロールバイトを送り,次に続くデータが制御コマンドか表示データかを知らせます。
PICAXEに接続しているところです。
![](https://stat.ameba.jp/user_images/20210715/19/pta55/f2/91/j/o1101059814972512401.jpg?caw=800)
→ PICAXEでGroveのRGBバックライト液晶モジュールを使う
→ 有機EL(OLED)のキャラクタディスプレイを使ってみた
→ リアルタイムクロックを小さなキャラクタ液晶ディスプレイ(LCD)に表示してみた
コントロールバイトとデータ(制御コマンドか表示データ)の送り方です。
RSがコントロールバイトの第6bitに含まれているのが見えます(^^)。
このbitが0なら次の1byteは制御コマンド,1なら表示データです。
![](https://stat.ameba.jp/user_images/20210715/19/pta55/6f/69/j/o0895049714972512402.jpg?caw=800)
(DFROBOT LCD1602 RGB BacklightModule から一部改編)
最初のスレーブアドレスはI2Cのお約束で,初期設定されたものが自動的に出ます。この機種では0x7C(8bit表記),0x3E(7bit表記)なのが分かります。
上記の図で一番の問題点はコントロールバイトの第7bitの「Co」です。
私なりの解釈では
・Co(Continue)が0ならこのコントロールバイトが最後の指示で,ストップコンディションが来るまで他のコントロールバイトは来ず,ずっとこのコントロールバイトの指示が有効なデータの連続です。
・Coが1ならこのコントロールバイトの指示は次の1byteのデータだけに有効で,その後には別のコントロールバイトが続きます。
ということではないか,,,と思います。
ですから,Co=1の時の例にCommand Word という名前をつけるのが良く分かりません。Co=1でもRSが1なら表示データを1byte送れるはずです。私のcommandという言葉の解釈が制御とばかり思うからかもしれませんけど,,,。
多分,Co=1の時はこの2byteで完結する,ひとかたまりの1wordですよ,という意味なのでしょうね。
ま,ともかくコントロールバイトの指示に従って,データは制御コマンドか表示データに分類されてそれぞれの働きをします。インストラクションはHD44780互換です。
![](https://stat.ameba.jp/user_images/20210715/19/pta55/ca/a1/j/o0971076314972512406.jpg?caw=800)
(JHD1313データシートから一部改編)
PICAXEのBASICでReal Time Clockから日時を読み出して,LCDに表示している例です。面倒なのでCoは常に0にしています(^^;;;
なお,PICAXEのhi2cout()では最後にストップコンディションが出るようです。
ArduinoならWire.endTransmission() で出るのでしょうね。
![](https://stat.ameba.jp/user_images/20210715/19/pta55/ac/27/j/o0995107714972512410.jpg?caw=800)
制御コマンドはwaitが必要なものもあるので,Arduinoなどの速さがある場合は1個ずつ送るのが確かでしょうね。
PICAXEは遅いので,特に表示データなどは1ストリームで送っても良いはずです,,。
3.I2C通信で上位4bitをデータ,下位4bitをコントロール信号にして送る方式
パラレルインターフェイスのLCDの製品にI2C通信のシリアル・パラレル変換のモジュールを追加したタイプで使われている方式です。
PICAXEで2004型のLCDを動かしたところです。
![](https://stat.ameba.jp/user_images/20210715/21/pta55/f0/88/j/o1200031514972568479.jpg?caw=800)
→ I2C接続の20x4キャラクタ液晶ディスプレイをライブラリのないPICAXEで動かしてみた
データ(制御コマンドか表示データ)とコントロール信号の送り方です。
LCDコントローラの4bitモードを使い,上位4bitをデータ,下位4bitをコントロール信号に使用しています。
![](https://stat.ameba.jp/user_images/20210715/21/pta55/8f/fd/j/o1207054014972568484.jpg?caw=800)
制御コマンドも表示データも8bitを上位下位の順に,また上位,下位それぞれにE(Enable)の上げ下げを行うので1byteのデータを送るのに4回,4byteの送信が必要です。
それでもLCD自体,さほど高速な機器ではないので,十分すぎるスピードは出ますが,自作プログラムではデータ送信の過程が少々面倒です(^^;;;;;;;;
インストラクションはこれもHD44780互換ですが,初期設定でHD44780の4bitモードの設定には定石がありますので要注意です。
PICAXEのBASICで1byte データを上位下位4bitずつ送信している部分です。
hi2cout()でI2C送信が4回行われています。
![](https://stat.ameba.jp/user_images/20210715/21/pta55/a3/65/j/o0880052114972568487.jpg?caw=800)
手持ちのパラレルインターフェイスのLCDに追加のI2Cモジュールを自作するなら,I2C通信で8bitX2のパラレル出力のICが120円ぐらいであるので,そちらの方がもう少しスマートにコントロールできるかもしれませんね(^^)。
以上,手持ちのキャラクタディスプレイを使ってみたメモです。
キャラクタディスプレイは仕組みがある程度分かっているとPICAXEでも使えますし,また小さなマイコンでも必要な機能だけに絞れば使えるという利点もあるかもしれません。
Arduinoなら豊富なライブラリを使えば,特に時間や労力を割く部分ではないのでしょうが,ま,趣味なので(^^;;;;;;;;