↑ SC1602D パラレル接続LCD


標記のモジュール「SC1602DSLB」をオークションで安価に入手しました。
秋月で販売している物とは、ちょっと型番が違うようですが・・・
まずは制御実験をしてみようと言う事になりました。


参考文献
電子工作のためのPIC16F活用ハンドブック 後閑 哲也 著 技術評論社
AE-AQM1602A資料 秋月電子

SC1602D ピン配置

裏面から見た

 アノード ⑮  ⑯ カソード
   DB6 ⑬  ⑭ DB7
   DB4 ⑪  ⑫ DB5
   DB2 ⑨  ⑩ DB3
   DB0 ⑦  ⑧ DB1
  R/W ⑤  ⑥ E
    VO ③  ④ RS
   VSS ①  ② VDD



液晶モジュールのハードウエア概要

一般的なSC1602Bとはどこが違うのか不明です。
制御は概ねBタイプと同じとは思いますが・・・

インターフェイス ピン アサイン
ピン番号 シンボル レベル   説明
 01    VSS   0V     グランドに接続
 02    VDD   5V     電源+
 03    Vo    --      コントラスト調整
 04    RS    H/L    レジスタ選択
                     H=データレジスタ
                     L=制御レジスタ
 05    R/W  H/L    R/W選択(モジュールに対して)
                     H=読み出し
                     L=書込み
 06    E     H/L    信号イネーブル(0.22us/plus)
                     L→H→Lでモジュール側がコマンド読込・実行する
 07    DB0   H/L    データビット0
 08    DB1   H/L    データビット1
 09    DB2   H/L    データビット2
 10    DB3   H/L    データビット3
 11    DB4   H/L    データビット4
 12    DB5   H/L    データビット5
 13    DB6   H/L    データビット6
 14    DB7   H/L    データビット7
                     4bitモードの場合、DB4~DB7を使用する
                     また、DB0~DB3は無接続とする
 15    A     4.2V    バックライトLED電源+(標準140mA)
 16    K     0V      バックライトLED電源-
LCDモジュール ソフトウェア概要


(1)LCDコントロール コマンド
  1)Clear Display
    RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
     0    0   0   0   0   0   0   0   0   1
  2)Return Home
    RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
     0    0   0   0   0   0   0   0   1   x
  3)Entry Mode Set カーソルのインクリメント方向、表示シフトの設定
    RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
     0    0   0   0   0   0   0   1  I/D   S
    I/D:Increment/decrement of DDRAM address(cursor or blink)
       I/D=1:右、I/D=0:左
    S:Shift of entire display
       S=1:表示シフトON、S=0:表示シフトOFF
  4)Display ON/OFF 液晶表示およびカーソルのON/OFF
    RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
     0    0   0   0   0   0   1   D   C   B
    D:Display ON/OFF control bit
       D=1:ディスプレイON、D=0:ディスプレイOFF
    C:Cursor ON/OFF control bit
       C=1:カーソルON
    B:Cursor Blink ON/OFF control bit
       B=1:カーソル ブリンクON
  5)Cursor or Display Shift
    RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
     0    0   0   0   0   0  S/C R/L  x   x
    S/C:Screen/Cursor select bit
       S/C=1:R/Lビットによる表示シフト
       S/C=0:R/Lビットによるカーソル移動
    R/L:Right/Left
       R/L=1:右移動
       R/L=0:左移動
  7)Function Set
    RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
     0    0   0   0   1   DL  N   DH  x   x
    DL:Interface data length control bit
       DL=1:8ビットバスモード
       DL=0:4ビットバスモード
    N:Display line number contorol bit
       N=1:2行表示モード
       N=0:1行表示モード
    DH:Double height font type control bit
       DH=1:N=0の時5×16ドットのフォントサイズとなる(N=1は不可)
       DH=0:ノーマルサイズ(5×8ドット)のフォントとなる
  8)Set CGRAM Address
    RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
     0    0   0   1  AC5 AC4 AC3 AC2 AC1 AC0
  9)Set DDRAM Address
    RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
     0    0   1 AC6  AC5 AC4 AC3 AC2 AC1 AC0
 10)Write DATA
    RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
     1    0  D7  D6  D5  D4  D3  D2  D1  D0
 11)Read DATA
    RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
     1    1  D7  D6  D5  D4  D3  D2  D1  D0
 12)Read Busy Flag and Address
    RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
     0    1  BF AC6  AC5 AC4 AC3 AC2 AC1 AC0
    BF=1:Busy
    BF=0:Idle


(2)イニシャライス(4bitモード)
  1)パワーオン・ウエイト 40ms       インストラクション
  2)RS R/W DB7 DB6 DB5 DB4 Function Set
     0    0   0   0   1   1  8bitモード
  3)ウエイト 5ms
  4)RS R/W DB7 DB6 DB5 DB4 Function Set
     0    0   0   0   1   1  8bitモード
  5)ウエイト 100us
  6)RS R/W DB7 DB6 DB5 DB4 Function Set
     0    0   0   0   1   1  8bitモード
  7)ウエイト 40us
  8)RS R/W DB7 DB6 DB5 DB4 Function Set
     0    0   0   0   1   0  4bitモード
  9)ウエイト 40us
 10)RS R/W DB7 DB6 DB5 DB4 Function Set
     0    0   0   0   1   0  4bitモード
    RS R/W DB3 DB2 DB1 DB0 N=0(1行表示モード)
     0    0   1   0   0   0  DH=0(ノーマルフォントサイズ)
  9)ウエイト 40us
 10)RS R/W DB7 DB6 DB5 DB4 Display ON/OFF
     0    0   0   0   0   0  D=0(ディスプレイ オフ)
    RS R/W DB3 DB2 DB1 DB0 C=0(カーソル オフ)
     0    0   1   0   0   0  B=0(カーソル ブリンク オフ)
  9)ウエイト 40us
 10)RS R/W DB7 DB6 DB5 DB4 Entry Mode Set
     0    0   0   0   0   0  I/D=1(右方向インクリメント)
    RS R/W DB3 DB2 DB1 DB0 S=0(表示シフト無)
     0    0   0   1   1   0






↑ 汎用20ピンCPU基板


今回のI/Oポート設定

 PIC 側 : LCD側
 RC2 : E(nable)
 RC1 : R/W
 RC0 : RS

 RB7 : DB7
 RB6 : DB6
 RB5 : DB5
 RB4 ; DB4




↑ 今回の実験での全体構成



↑ LCDへの接続中継基板
CPU基板とLCDモジュールの間に挟み、
接続し易くするのと、コントラスト調整が目的



↑ 2列のピンヘッダをLCD基板にはんだ付け
それに、2列のピンソケットにて接続しています
実験回路

例によって、汎用PIC基板に中継基板を介して接続しただけです。
SPIやI2Cと違って使用するポート数が多いのが難点です。
よって、PICは16F1828の20ピンを使用しました。
LCDモジュールとは、4bitパラレルデータ通信とします。
処理の遅いLCDモジュールを8bitバスでデータ転送する理由は皆無です。
リシアル通信の方が合理的ですが、部品箱在庫があるから使うに過ぎません・・・
まあ、5V動作品の品種が少なくなっている事と、多ピンPICが安価なので問題は無いですが。

何を表示させるかネタ切れです・・・
表示モードは16桁2行です。

↑ PicKit3にて書き込み
実際に表示動作をさせてみます



↑ 実際の表示です
バックライトは100mA程流しています



PIC16F1828 ソースファイル

16F1828_SC1602D_01.asm

LCD表示ルーチンのプログラミング


(1)コマンドバイトおよびデータバイト
  LCDへのコマンドおよびデータに関しては、それぞれ1バイトで構成されています。

 1)コントロールビット
   RSビット:送信する1バイトは、RS=0でLCDのコントロールコマンド、RS=1でデータ
   R/Wビット:送受信のどちらかを決めますが、書込みばかりなので、通常「0」のまま
           回路図ではPICに接続されていますが、GNDに落としたままでもOKです
   Eビット:今現在提示しているビット列(8or4)をLCDにラッチさせるためのパルスを生成
        ラッチパルスは正論理で220ns以上の長さがあればOK

 2)実際の送信コード(抜粋)(注2)
  a)クリアディスプレイ コントロールコマンドのみの1バイトコード
    クリアディスプレイ コマンド送信:01H、RS=0
       16桁2行すべてが20H(SP)で置き換わります
  b)文字表示 コントロールコマンド+表示データの2バイトコード
   ①Set DDRAM addressコマンド送信:80H~8FH:RS=1 (注3)
       DDRAMアドレス(表示位置)を指定するコマンド
       この命令の後、RS=0として、表示するアスキーコードを送信
       C0H~CFHは2行目のアドレス(2行モードの場合)
   ②データ送信:XXH、RS=1、表示させるASCIIコードを送信
       20H~7FHは英文字コード、A1H~DFHはカナ文字コード、
       その他のアドレスは色々・・・

    注2)これらの詳細は前記コントロールコマンドを参照して下さい
       この2つのコードは今回のLCDイニシャライズ ルーチン適用後、
       使用可能なコードの内の2つです。
    注3)80Hが1行目の最右側、8FHが1行目の最左側
       C0Hは2行目の最右側、CFHが2行目の最左側

 3)4bitモードでの1byte書込み
  ①Enable=0、RS=0(制御レジスタ選択)、R/W=0(書込み)
  ②上位4bit分のデータをDB4-DB7にセット
  ③RS=1(データレジスタ選択)、コマンドの場合はRS=0のまま
  ④Enable線にラッチパルス(パルス幅220ns以上)
  ⑤下位4bit分のデータをDB4-DB7にセット
  ⑥Enable線にラッチパルス(パルス幅220ns以上)
  ⑦Busyチェックの代わりにウェイト

 4)8bitモードでの書込み (注4)
  ①Enable=0、RS=0(制御レジスタ選択)、R/W=0(書込み)
  ②コマンドをDB4-DB7にセット、当然下位4bitは設定できず値不定となる
  ③コマンドのみでの使用なのでRS=0のまま
  ④Enable線にラッチパルス(パルス幅220ns以上)
  ⑤Busyチェックの代わりにウェイト

  注4)これはLCDイニシャライズルーチンの②③④でのみ使用

(2)表示ルーチン

 1)INIT_LCD:LCD初期化 以下の順番で処理 ソース参照

  ①パワーオン・ウエイト 15ms以上待つ、初期は8bitモードとなっている
  ②コマンド送信:30H、データ長は8ビットモード指定
  ③コマンド送信:30H、データ長は8ビットモード指定
  ④コマンド送信:20H、8ビットモードのまま4ビットモード指定
  ⑤コマンド送信:28H、4bitモード、2行表示、5×8ドット
  ⑥コマンド送信:0CH、LCD表示ON、カーソルOFF、カーソルブリンクOFF
  ⑦コマンド送信:01H、クリアディスプレイ
  ⑧コマンド送信:02H、INC/DEC右方向、DDRAMアクセス自動INC/DECしない

 2)CLRLCD:クリアディスプレイ

 3)PUTW:Wレジスタのアスキーコード一文字を画面に表示
       表示位置アドレスは、変数「DSP_ADR」に設定

 4)PUTL1:LABELで指定された文字列を1行目に表示(注3)
        LABELのアドレスは変数MSAD0、MSAD1に収納してコール
  例)
        MOVLW  LOW LABEL (注4)
        MOVWF  MSAD0
        MOVLW  HIGH LABEL (注4)
        MOVWF  MSAD1
        CALL    PUTL1
        ----
  LABEL  DT ”ABCDEF”
         DW 00H
     

 5)PUTL2:LABELで指定された文字列を2行目に表示(注3)

 注3)LABELについて
    文字列は16文字までで、文字列の最後に00Hを付加する事(エンドコード)

 注4)HIGH、LOWはPICの命令ではなく、アッセンブラ疑似命令です



感想

シリアルインターフェイスの同機能LCDに比較して、アクセスルーチンは簡素になります。
しかし、製作時は配線数が多くなり面倒くさ、大した事は無いのですが・・・
SC1602Bと今回のSC1602Dは、どこがどう違うのか不明です。
プログラムはSC1602Dの詳細な資料が入手できなかったので、
SC1602Bの資料を参考に作ってみましたが、とりあえず動作はしているようです。

LCDアクセスルーチンにおいては、BUSYフラグをチェックするのが面倒だったのと、
ただの実験レベルと言う事もあり、余裕のウェイトを噛ましています。
実際に使用する場合は、ウェイト時間をかなり削る事が可能です。

バックライトは暗くは無いのですが、消費電流はかなり多めで、電池駆動には難があります。
文字は小さめで、すぐ近くに居る分は良く見えますが、少し離れると解読困難になります。
これは他のLCDでも同じで、LEDディスプレイとは比較になりません。
無線機等の周波数表示には、とても使う気になりません。
しかし、バックライト無のLCD、AQM1602Aと比較すると、遥かに視認性は良いです。

戻る  実験・製作の記録TOPへ戻る