今回は aitendo で 122×32 のグラフィックLCD が 299円(税抜)とかなり安かったので買ってみました。商品ページはこちらです。
グラフィックLCD については以前に記事を書きましたが、それとは制御IC が異なり使用方法も全然違ったので、別の記事として書くことにしました。
以前のグラフィックLCD についての記事はこちら↓
目次 [非表示]
制御IC SED1520
この LCD に使われている制御IC は SED1520 というものです。
ちなみに商品ページの説明欄には “SED1502” と書いてありますが多分誤植です。紛らわしいことに “SED1502” という IC も実在するのですが、リンク先のデータシートが SED1520 でそれを参考にしたら動作しました。
この LCD の制御チップ SED1502 のデータ構造は次のようになっています。
まず122×32 を左右に半分ずつ分けて、2つの同一の IC で制御しています。
片方の IC に着目すると、8行ずつがページとしてまとめられていて、各ページの各列が 1Byte のコラムとなっています。
ビットマップファイルの場合、データは左下から横方向に並んでいるので、この LCD に表示させるにはデータを変換する必要があります。
一見するとこのようなデータ構造は使いにくいと思うのですが、高さが8pt の文字を表示させようと思ったときには便利なようです。
接続・ピン説明
LCD 基板からは 18本のピンが出ていて、各ピンの役割は次のようになっています。
続いて各ピンについて説明します。
VDD, VSS : 電源(5V)
VO : コントラスト調整。半固定抵抗を接続。
RES : リセット。PIC の MCLR に接続。詳しくは後述します。
E1, E2 : 通信の Enable。先述のように制御IC が2つあるのでそれぞれに対応しています。
R/W : Read/Write。読取り不要の場合は GND に接続。
A0 : データ/コマンド選択。
DB0 ~ DB7 : データ。8bit 専用で4bitモードはないようです。
LED-A, K : バックライト電源。メインの電源と違って 3.3V なので注意。
リセットピンについて、aitendo の商品ページの説明では無接続になっていましたが、無接続では動作しませんでした。
データシートを見てみると次のような記述があります。
The SED1520 Series uses 8 bits of bi-directional data bus (D0–D7) to transfer data. The reset pin is capable of selecting MPU interface; setting the polarity of RES to either “H” or “L” can provide direct interface of the SED1520 with a 68 or 80 family MPU (see Table 1 below).
リセットの極性 (active L / active H) によって MPU の種類を選択し、通信方法も異なるようです。68系とか 80系といのはよく分かっていないのですが、aitendo のピンの説明は 68系のものだったので、それに従うことにしました。(Table 1 の”↑”は同上という意味だと思います。)
気を付けたいのは、active L = idle H なので H か L のどちらかに接続するとしたら H に接続するということです。
PIC の MCLR は active L なので、そこに接続しておけば PIC のリセットと同時に LCD もリセットできます。
通信方法
続いて SED1520 との通信方法を見ていきます。データシートの 86系のタイミングチャートは次のようになっています。
立上がりか立下がりかは置いといて、E にパルスを入力したときにデータが送信されるということみたいです。E は idle L にしておけば良さそうです。
なお、今回は読取りは行いません。
コマンド
基本的な動作をさせるために必要なコマンドを紹介します。全部のコマンドを知りたい方はデータシートを参照してください。
Display ON/OFF
D 0:OFF 1:ON
リセット直後はディスプレイが OFF になっているので、自分で ON にしてやる必要があります。2つの制御 IC にそれぞれコマンドを送る必要があるので注意してください。
Set Page Address
A1, A0 ページ番号(0 ~ 3)
先程説明したページを指定するコマンドです。
Column Address
A6~A0 コラム番号 (0 ~ 79)
コラムを指定するコマンドです。A6~A0 の 7bit ありますが、79 が上限のようです。この LCD では 0 ~ 60 を指定することになります。
コラムアドレスはデータを送信する毎にインクリメントされるので、初めにコラムを指定したら連続してデータを送信することができます。ただし、ページはインクリメントされないので注意してください。
どうでも良いことではありますが、コマンドの名前がページのものと異なるのが気になりますね。
ライブラリ
以上のことを踏まえてこの LCD を制御するためのライブラリを作りました。
大体見れば分かるかと思いますが、ポイントとしてはコマンドは両方の IC に送信するのに対して、データは適切な方にのみ送信します。
そのために現在のアドレスを保持する変数を用意しています。
また、LCD の表示の端まで来たらページをインクリメントするようにしています。
Sed_Init() 関数ではアドレスを左上に設定しているだけで、中身に何かデータが入っているかもしれないので、まっさらにしたい場合は0を 488回書き込んでください。
動作テスト
今回は PIC16F1579 を使って LCD に画像を表示させてみたいと思います。
122×32 のモノクロBMP画像としてこんな画像を用意してみました。
データを変換するプログラムを作って、このデータをあらかじめ変換しておきます。
変換したデータを表示するプログラムを書いてみた結果このようになりました。
ちゃんと表示されたと思いきや、右のトランジスタの絵が切れてますね。
どうやらセグメントがそもそも16行x2段に分割されているようです。それを知らずに買ってしまったのでちょっと残念です。
ですが今回はとりあえず表示することができたので良しとしましょう。
回路図は次のようになります。
※見やすさのために A0, E1, E2, DB0~DB7 の配線は省略しました。
プログラムは以下の通りです。
▼SED1520ライブラリ
今回の記事は以上となります。ご覧いただきありがとうございました。