ようやくハードウェアの階層まで降りてこれそう。
前回の記事
ある程度背景を説明したので、ようやくハードウェアレベルの話が始められそうです。
が、その前に…。
まえがき(いまさら?)
本シリーズの内容はPLCD1602以外にも当てはまる話も含まれますが、話が発散するので以降はPLCD1602の~みたいな書き方をします。 が、そこは適宜読み替えてください(仕様が共通しているものは他のものにも置き換えられるという話です。しかし、適宜読み替えられる人には別にこの情報必要なくない?というツラミ)
また、用語もPLCD1602/AQM1602Y-RN-GBW/ST7032i固有の名称を使うことがありますが、これも適宜読み替えてください。
あと、それなりにカッチリ書くつもりですがある程度表記ゆれや曖昧な点があるところはご容赦を。 実行の際には自己責任でよろしくお願いしますね(いつものやつ)
文字コードと字形の対応
さて、外部から字形を8つまで登録できる(外字)という話までは書きました。が、そもそもこの液晶ディスプレイはどうやってあらかじめ登録されている文字(プリセットの文字)と外字を区別しているの?という話をしていきます。
実際には、液晶の表示領域の16x2文字のそれぞれに対してどの文字コードを指定するかという観点では両者に差異はなく、「違う文字なのでアドレスが違う」というだけです(後で説明します)
登録した字とプリセットの字は文字コードとして連続した領域にあるので、登録した字を使いたいなという時はそのアドレスを指定すればプリセットの文字列と同じように使えるのです。
実は公開されているサンプルコードにヒント/答えが載っている
書きそびれていましたが、実は(?)製造元のクレイン電子さんのページにはArduino UNOでそのまま動かせるサンプルコードが載っています。
コードを実行したときのPLCDの表示例の写真が載っていますが、これの上段は登録された外字が使われていていろんな記号が表示されています。
これらの文字についてはサンプルコード中段のsetup CGRAM
で字形を登録して、それを表示しています。
このサンプルコードを実行するとわかりますが、右下の文字がぐるぐると順に変わっていきます。これはloop()
の中のfor文の処理で登録されている字形を順に表示しています。
これが、先の「プリセットの文字と外字については文字の表示について扱い上の差異はない」ということです。
ところでこのサンプルコードですが、MITでライセンス付与されているので使いまわしがきくのも何気にありがたいですね。
…ということで、これを下地にコードを書いていくと良いのではないかと思います。ただし、データシートはちゃんと読んで各コードの意味が何かは把握しておきましょう(自戒)
え、それも書けばいい…?じゃあいずれ書きます…。
各ROM/RAMについて
さて、サンプルコードは「同じ座標で表示する文字を置き換える」ことは出来ますが、これだと動画のように1dotずつ横に文字をスクロールすることはできませんね。
しかし、次のようにやれば文字を1文字ずつ横にシフトしていくのは可能そうです。
- 文字座標を指定(サンプルコードの
//Set Cursor
の部分)して文字を書く(plcd_data()
) - 同じ文字を文字座標を左にずらして再度文字を書く
これを繰り返せば、1文字単位ですが文字がスクロールして見えるはずです。これらの関数についてはI2Cとは何ぞやという話が必要なので、これもまたいずれ書きますか…。
では、動画のように1dotずつシフトするにはどうすればよいでしょうか?そのためには外字として登録している字形情報がPLCD(正確にはコントローラ)内でどのように扱われているのかを知る必要があります。
ようやく、ハードウェアの話っぽくなってきました(ワクワク
と、その前に写真を一枚。これがPLCDの実物で、すべてのdotを■に表示するようにしています。2段構成で横に16字分の領域、各字の間には1dotくらいの領域があり(上下はもうちょっと広い)、各字の領域は横に5dot、縦に8dotの領域があります。文字単位といった場合はこの5x8dotの領域1つ、列といった場合は2つに分かれた上下のそれぞれの単位、を指します。あとは雰囲気で…。
CGROM
ST7032のデータシートをご覧ください(いきなりセミナー形式かな?) なお、データシートは秋月の液晶のページからダウンロードできます。
このページにはブロック図(Block Diagram)が載っていますが、この中にCGROMとうブロックが見つかります。
ブロック図というのはこの場合、コントローラチップ(ST7032)の中の機能毎にまとまった部分をブロック(□)であらわし、データのやり取りがどの機能ブロック間で行われているかということを図示しているものです。といっても見てもよくわからんな…。
CGROMについてはp.16に字を生成するROMであることが記されています。ROMとはRead Only Memoryの略で読み取りのみの記憶領域なので、ここに登録された文字の字形は変更できません。
もう一つ、ブロック図には似た名称のCGRAMというのがあります。
CGRAM
これがつまるところ外字登録領域です。ユーザが作った字形はCGRAMというRAM(書き換え可能なメモリ)領域に書き込まれます。 これはCGROMの領域を一部間借りして使っているため、元々そこのCGROMのアドレスに登録されている字は使えません(代わりにCGRAMで作った字形が使われます)
このCGROMとCGRAMの領域についてはOPR1,2の設定に依存します(データシートのAppendix. のTable A2)が、秋月電子通商 AQM1602Y-RN-GBWのFAQを見ると、
OPR1=0、OPR2=0固定で出荷されており変更できません。
との記載があります。
データシートのp.57などを見るとこれらは端子としては出ているようで、それを秋月の方でGNDにつないでいるということでしょうから、他の型番の液晶を使う場合はこの設定にも注意しましょう。
DDRAM
さて、CGRAMとCGROMはひとまとまりになっているので、文字を指定する場合は文字コードにてそれらを区別することなく連続的に指定できます(PLCD1602のサンプルコード、右下で文字が変化する部分もそうなっていますね)
液晶の各文字領域に対してどの字形を表示するかを指定にするには、
- どの文字座標か?
- どの文字コードか?
をそれぞれ指定する必要があります。
画面の文字座標それぞれに対して、文字コードを保持するDisplay data RAM(DDRAM)のアドレスを紐づけることで、ある画面の座標の文字を更新したければ対応するDDRAMが持っている文字コードを変更すればよいわけで、実際にとあるDDRAMを更新すれば、それに対応した画面の文字座標の文字図形が更新されます。
画面上の文字を置き換える場合はその文字座標を指定しますが、これはアドレスカウンタ(AC)が持ちます。ACは文字を書きこむと1つ後ろにずれます。サンプルコードのfor文中で文字書き込みの前にカーソル位置を設定していますが、その座標にデータを書き込むとカーソルが隣に移動してしまうので、元の座標を指定しなおす必要があったわけですね。
余談ですが、コントローラはカーソル位置を点滅させる機能もあります(動画では非表示にしています)
画面の文字座標とDDRAMのアドレスの対応関係はデータシートのp.14以降にありますが、左上がアドレス0となっています。
さらに余談ですが、液晶自体の表示領域は2x16文字が最大ですが、コントローラとしてはもっと広い領域までもつことが出来るようで最大で80文字分をカバーします。ただしモードによってどの文字座標がどのアドレスコードになるかは変わりますので、実際に使用するモードでどのアドレスコードとなるかはデータシートを確認しましょう。これもまたサンプルコードをより詳細に説明する際にやりましょうか…。
ICON
ちなみに、ICONという領域もありますが、これは液晶画面に既にアイコン形状の表示領域があるタイプにのみ使用でき、PLCD1602にはその表示領域がない(16x2の文字表示領域しかない)のでここの値をいじっても何も起こりません(この領域は他に使えないのかと試行錯誤して無理だったので多分使いまわしできない…モッタイナイなぁ)
これの使用例は"ST7032i ICON" で検索エンジンで検索するとでてきますね。
また長くなってきたので今回はこの辺で。次回はようやく文字を1dotずつ移動させる話です。
次の記事