Raspberry PiでLCDディスプレイに文字を表示する:カーソルとブリンカー
前々回でRaspberry Piに接続したLCDディスプレイに無事文字を表示させる事が出来ました:
今回はLCDディスプレイが持つサブ機能であるカーソルとブリンカーについて見ていきます。
尚、具体的な実装については前々回の文字表示で作ってきた命令送信の仕組みを使うだけになりますので、今回はコードは省略致します。
カーソルやブリンカーのON/OFF
LCDディスプレイの文字表示部分には下線となるカーソルやブリンカーを表示する事が出来ます:
Display ON/OFF Control命令で表示周りのON/OFFを切り替えます。
Dはディスプレイ表示のON/OFF切り替えで、0にすると表示が消え、1で表示されます:
Cはカーソル表示のON/OFFで、0が非表示、1が表示です:
WORLD!の右にカーソルが出ていますね。カーソルは点滅せずずっと表示されます。
BはブリンカーのON/OFFです。0で非表示、1で表示です:
動画にあるようにONにすると先程カーソルがあった個所にブリンカーが表示されます。こちらは一定周期で点滅します。
カーソルやブリンカーは常に現在のAC(アドレスカウンター)の位置になります。上の場合WORLD!を入力し終わった直後なので「!」の右側位置に来ている訳です。開発時には意図的にカーソルやブリンカーを表示させる事で文字表示位置を確認できるので便利です。
カーソル位置の移動
Cursor or Display Shift命令を発行すると、現在のカーソル位置を意図的に1つ移動させる事が出来ます:
この命令はカーソルだけでなくディスプレイ表示位置そのものもシフトさせる事が出来ます。
S/Cはディスプレイを動かすかカーソルを動かすかを指定します。0ならカーソル、1ならディスプレイです。
R/Lは移動方向です。0を指定すると左方向に、1だと右方向に一つ移動します。
カーソルの位置=書き込み位置
カーソルを移動するというのは文字を書き込むアドレスを変更していると同じです。その為移動後アドレスを指定せずに文字を送信すると、現在のカーソル位置に文字が表示され、カーソル(アドレス)は一つ右に移動します。
下の動画は最初0x00の位置に「HELLO」を表示後、カーソルを右に3つ移動させ、アドレス指定せずに「WORLD!」を続けて書き込んだ様子です:
カーソルの位置から書き込まれたのが分かりますね。
ディスプレイ移動は紙をずらすイメージ
一方でディスプレイの移動は、例えるなら文字列を書いた紙を指定の方向に移動するイメージです。右に1つずらすと文字列全体が右に動きます。この時、ここが重要な点ですが、ベースとなるアドレスが指す表示位置自体も右にズレます!下の動画を見て頂ければ意味がわかるかなと思います:
最初HELLOは0x00の位置に表示しています。ここでディスプレイを右に動かすとこの基点も移動してしまいます。そのためHELLO全体も右へシフト。ディスプレイ移動の影響は2行目にも及ぶので、2行目の0x40基点も同時に右へシフト。結果0x40に指定したWORLD!も左端ではなく動いた位置に表示されます。正に紙をずらすイメージですよね。
ホーム位置にリセット
Return Home命令を発行すると、動かしたカーソル位置(アドレス)やずらしたディスプレイ位置が初期位置に戻ります。カーソルは0x00の左上位置に、そしてディスプレイのずれはゼロになるので0x00が左上位置にリセットされます。
この命令は実行に1.53msと結構時間がかかります。実行後は十分なインターバルを取ってください。これが不十分で次の命令を発行するとLCDの動作がおかしくなってしまいますので注意です。
Clear Display命令も似たような働きをしてくれますが、Clear DisplayはDDRAMに書き込んだ文字も全消去してしまうのに対し、Return Homeは文字は消さずに残しておいてくれます。
終わりに
今回はLCDのカーソルとブリンカーを操作する命令について見て来ました。カーソルとブリンカー、両方とも同時に表示する事は出来ますが、実用する際はどちらか一方を使う事になるのかなと思います。どういう時に使うかと言うと、外部機器や人の入力を待っている間などです。逆に機器の状態などをLCDに表示する際はOFFにするのが一般的です。
ディスプレイを移動するとアドレスの基点自体もズレました。これをうまく利用すると16文字を超える文字列をユーザーに読ませる事が出来ます。1行のバッファは0x00~0x3Fまで64文字ありますので、長い文字列を書き込んだ後にディスプレイを右に移動させてスクロールすればいいんです。良くそういう表示方法も目にしますよね。LCD、工夫次第で色々できて楽しいですね。
ではまた(^-^)/