パーツ解説

PICで128×64グラフィックLCDを使ってみる

投稿日:2020-08-28 更新日:

今回は AliExpress で買った 128×64 のグラフィックLCD を使ってみました。使用した PIC は PIC16F18857 です。

400円ぐらいで安かったのはいいですが、データシートや型番が不明なので調査が必要です。

裏面のパーツを参考にネットで同じものを探してみると、どうやら ST7920 という IC が使われているようです。

接続方法は 8bitパラレル、4bitパラレル、SPI の3種類があるようですが、まずは 8bitパラレルでやってみます。

接続方法はこんな感じです。

Schematic

V0ピンはコントラスト設定用のピンで可変抵抗を繋げるのですが、この LCD の裏面には元から可変抵抗がついているので何も繋がなくて大丈夫でした。

ちなみにこの可変抵抗は端で止まったりしないで1回転するので、気を付けて丁度よい所を探しましょう。

LCDback_VR

次にデータの送信関数はこのようになります。

LCD の DB0~DB7 を PIC の RA0~RA7 に接続することで PORTA レジスタで丸ごとアクセスできます。

遅延はデータシートでは 72us となっていましたが、半分の 36us でも動きました。

 

ところで、コマンドの一覧を見てみると、キャラクタLCD で見慣れたコマンドがたくさん並んでいます。

どうやらこの LCD はグラフィックLCD だけじゃなくて、キャラクタLCD としても使えるようです。しかも中国語の2バイト文字も対応しているらしい。

というわけで、グラフィックを表示させる前に文字を表示させることにします。

レジスタのアドレスと表示位置の関係は下図のようになっています。各アドレスは2バイトになっていて、半角の場合は上位と下位のそれぞれにデータを入力できます。

Address map

2バイト文字の文字コードはこちらのものが使用できました。平仮名もあるので大抵の日本語は表示できると思います。

ただし、あくまでも中国語の文字コードなので、中国語で使われていない漢字はなかったりします。

実際に表示させてみました。

CharacterTest

プログラムはこちら(クリックで表示)

PIC を使っていて日本語を扱うのは初めてなのでなかなか面白いですね。まあこれ以上使わないんですけど。

 

続いてグラフィック機能を確認しましょう。グラフィック機能に関するコマンドは Extended Instruction として提供されているようです。

Instruction Table

 

表示データはこのようになっています。

GDRAM Address map

この IC は 128×64 ではなく 256×64 のセグメントに対応しているのですが、ここで気を付けなければならない点があります。

256×64 のセグメントのうち、実際に LCD に表示されるのは下図の部分になります。最初ここに気付かなくて嵌りました。

Corresponding between GDRAM and LCD

アドレスを設定する関数はこのようにしました。

 

さて、このデータ形式ですが、実は白黒BMPファイルのデータをほぼそのまま使用することができます。(ただし BMPファイルは下から上に記録されることと白黒が逆転することに注意)BMPファイルのフォーマットはこちらに詳しく載っています。

ペイントなどでサイズを 128×64 に設定し、名前を付けて保存のところでファイルの種類をモノクロビットマップに設定します。

How to Save as Binary BMP

なお、BMPファイルのデータをコピーするには Stirling などのバイナリエディタが必要になります。

 

実際に画像を表示させてみました。

Graphic test

プログラムはこちらです。

 

追記:

4bitパラレルでもやってみましたが、描画速度は変わりませんでした。どちらにせよ LCD にデータを送信するときの遅延が描画速度の決定要因になるようです。

8bitパラレルの場合との相違点はデータの送信関数と初期化ぐらいです。その他はそのままで使用できます。

 

SPI も試してみたのですが、残念ながら上手くいきませんでした。

それほどピンの数に困っている訳でもないので、今回の実験はここまでとしました。

-パーツ解説

執筆者:


  1. らーめん より:

    はじめまして。私も中華LCD入手してST7920検索でここに参りました

    >ただし、あくまでも中国語の文字コードなので、中国語で使われていない漢字はなかったりします。

    の下にあるはずのコード、自分で考えろ!と怒られそうですが教えて下さい。
    よろしくお願いします。文系でCは独学なのでよく分かってません勉強にさせて頂きます。

    • きっちー より:

      コメントありがとうございます。分かりにくくて申し訳ありませんが、「プログラムはこちら」をクリックすると表示されると思います。

comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

PICでジェスチャーセンサーを使ってみる[APDS-9960]

今回は以前から気になっていた秋月電子で販売されているこちらのジェスチャーセンサー APDS-9960 を使ってみました。ネットの情報も少なく、Arduinoのライブラリを使うだけしか書いてなかったりし …

【PIC】aitendo の 122×32 グラフィックLCDを使ってみた

今回は aitendo で 122×32 のグラフィックLCD が 299円(税抜)とかなり安かったので買ってみました。商品ページはこちらです。 グラフィックLCD については以前に記事を書 …

aitendoのI2CキャラクタLCDが安くて便利

ブレッドボード上で情報を表示したり簡易的なデバッグをしたりするのに便利なのがキャラクタLCD です。 今回は aitendo で販売されているこちらの LCD を使ってみました。 ちなみに以前秋月電子 …

ロータリーエンコーダの使い方

今回は PIC で ロータリーエンコーダ を使ってみたので、使い方や制御するためのポイントを紹介します。   目次1 ロータリーエンコーダとは2 信号3 チャタリング4 実験5 あとがき ロ …

PICで7セグドライバTM1630を使ってみた

今回は秋月電子で販売されている7セグメントLEDドライバ TM1630 を使用してみました。 TM16301つで7セグ5桁または8セグ4桁をダイナミック点灯で制御することができます。※カソードコモンじ …