ちょっとTea Time !? グラフィックLCDの憂鬱・・・ 2019.10.10

秋月で購入したグラフィックLCD(TG12864B)グラフィックイコライザの検討などで使いましたが、かなり便利です。
でも、秋月のは1400円とちょっとお高いです。もっと安いものがないかな〜と探していたら
AMAZONで459円のものを見つけました。送料は本体に比べると高い気もしますが、それでも
送料込みで約660円ですから、秋月の1/2で買えます。これがつかえると、財布にもやさしそうなので
ちょっと買ってみることにしました。これが、結構めんどくさいことのはじまり・・・・・

で、関東からの出張から久しぶりに帰るとブツが届いていました。

AMAZONでみつけた128×64のグラフィックLCDです。送料込みで約660円と安価です。

届いたのは中華からの直送便でした。本来は9月末到着予定でししたが、ほぼ10日遅れです。
で、早速あけてみて秋月のLCDと比較しました。

微妙にちがう?
外形やネジ位置、端子位置は同じですが、表示器のサイズが微妙に違います。
まあ、このくらいの違いならいいか・・・・。

左が秋月のLCD、右側が今回購入したLCD液晶表示器のサイズが微妙に違います。


左が秋月のLCD、右側が今回購入したLCD裏の作りはメーカによってまちまちですね。

で、ピンの配置を確認すると

決定的に違うところがある・・・・

今回、AMAZONから買ったLCDは完全にピンコンパチ品と思い込んでいましたが、よく見るとピンの名前が2箇所全然違います。
秋月でCS1,CS2とあるところが、それぞれPSBとNC(無接続)になっています。CS1とCS2は制御素子をアクティブにする重要な端子なのですが、
これがないということは全然違う制御素子をつかっているのかも・・・と不安が脳裏をよぎります。


秋月のLCDです。CS1,CS2があり2つの制御素子のチップセレクト(CS)になっています。


AMAZONで買ったLCDです。秋月のCS1,CS2の部分がPSB,NCになっています。

とりあえず・・・・
 今回買ったLCDにピンを半田付けして、元のLCDを交換して動くかどうか試してみました。
まあ、予想通りというかがっかりというか、まったくうんともすんとも動きません。
こりゃ、一から調べないといけないようです。

制御ICはST7920らしい
いろいろとネットで調べてみると、どうやらAMAZONで買ったLCDの制御ICはST7920というもののようです。
秋月のLCDの制御とはかなり違うことがわかりました。
何が違うかといえば、まずインターフェイスが違います。

秋月LCD(TG12864B) AMAZONのLCD(型番不明)
接続インターフェイス 8ビットパラレルのみ ・8ビットパラレル
・4ビットパラレル
・シリアル(SPI)

これだけみれば、今回買ったもののほうが俄然つかいやすいです。シリアルインターフェイスがつかえたら
接続の本数がぐっとへらせられます。秋月のTG12864Bだと8ビットパラレルなので全部で14本のIOが必要になりますが、
シリアルインターフェイスなら3本ですみますから、PICもピン数の少ないもの(パッケージの小さいもの)が使えます。

ただ、内部の構造がまるっきりちがいます。一番大きな違いは、表示エリアのメモリーマップです。

秋月のLCDのマップは下図のように、書き込みデータバイトが縦列に展開されます。
このためキャラクター表示をするには便利で高速に書き込めます。

秋月のLCDのマップ。キャラクターを表示するには、とても便利なマップになっています。

一方、ST7920の場合は、書き込みデータバイトが横軸に展開されます。これは、横線を書く場合には
とても便利な構造ですが、キャラクター表示をさせるには、ものすごく面倒です。
 既存のキャラクターのデータをつかう場合には、行列を入れ替える必要があります。
そのための処理に結構な時間がかかります。


ST7920のメモリーマップです。キャラクター表示をさせるにはとても面倒です。

でも、シリアル転送は魅力!
ソフトの作成は秋月LCDに比べると、面倒なものになりそうですが、それでもシリアル転送ができる点は魅力です。
当然、シリアル転送だと速度的には落ちてしまいますが、どの程度の速度で表示ができそうか、一度ソフトを組んでみることにしました。

ただシリアル転送では一つ課題があり、LCDのマップデータが読み出せません。書き込みオンリーになってしますので、
マイコン側(PIC)にイメージを持つ必要があります。その容量は128×64=8192Bitなので1kByteでいいのですが、
PIC16Fシリーズでは1kB以上のメモリーをもつものがほとんどないので、PIC18Fをつかうことになります。
ということで、PIC18F26K22をつかってのテストです。これは約4kBのメモリーがつかえます。

一画面フルに書き換えると約0.5秒
 やはり、内部の処理やシリアルでの転送に時間がかかるので1画面すべての文字(21×8=168文字)を表示
させると、約0.5秒程度かかります。ソフトの改造で早くはなりそうですが、まあこんなもんでしょう。
一画面を丸々書き換えることはほとんどなく、特定の部分のみ書き換えを考えると、
たとえば整数5桁を表示させると15ms程度(5/168*0.5=0.015)ですから、普通に使う分には問題はなさそうです。


シリアル転送での表示テストです。表示速度は2回/秒程度でした。

時間があれば、パラレル転送も試してみましょう!

しかし、世の中の128×64のLCDの制御チップて、秋月のLCDに使われているものか、ST7920なのか
どちらなんだろう?あんがい、こちらの方がデファクトスタンダードなのかもしれません。


<備忘録>

 このST7920ですが、イニシャライズにはすこしコマンドを並べる必要があります。
 グラフィックモードで使用する場合のイニシャル方法は下記の通りです。これは完全に小生の備忘録です。

ST7920_init() {
  delay_ms(100);
  ST7920_inst_write(0x30);delay_us(100);
  ST7920_inst_write(0x30);delay_us(40);
  ST7920_inst_write(0x0c);delay_us(100);
  ST7920_inst_write(0x01);delay_ms(10);
  ST7920_inst_write(0x06); delay_ms(10);
  ST7920_inst_write(0x34); delay_ms(10);
  ST7920_inst_write(0x36);delay_ms(10);
}