液晶モジュール SC1602DSLBをPICで使ってみた
標記のモジュール「SC1602DSLB」をオークションで安価に入手しました。
秋月で販売している物とは、ちょっと型番が違うようですが・・・
まずは制御実験をしてみようと言う事になりました。
参考文献
電子工作のためのPIC16F活用ハンドブック 後閑 哲也 著 技術評論社
AE-AQM1602A資料 秋月電子
秋月で販売している物とは、ちょっと型番が違うようですが・・・
まずは制御実験をしてみようと言う事になりました。
参考文献
電子工作のための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電源-
一般的な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
(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行です。
例によって、汎用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の命令ではなく、アッセンブラ疑似命令です
(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と比較すると、遥かに視認性は良いです。
シリアルインターフェイスの同機能LCDに比較して、アクセスルーチンは簡素になります。
しかし、製作時は配線数が多くなり面倒くさ、大した事は無いのですが・・・
SC1602Bと今回のSC1602Dは、どこがどう違うのか不明です。
プログラムはSC1602Dの詳細な資料が入手できなかったので、
SC1602Bの資料を参考に作ってみましたが、とりあえず動作はしているようです。
LCDアクセスルーチンにおいては、BUSYフラグをチェックするのが面倒だったのと、
ただの実験レベルと言う事もあり、余裕のウェイトを噛ましています。
実際に使用する場合は、ウェイト時間をかなり削る事が可能です。
バックライトは暗くは無いのですが、消費電流はかなり多めで、電池駆動には難があります。
文字は小さめで、すぐ近くに居る分は良く見えますが、少し離れると解読困難になります。
これは他のLCDでも同じで、LEDディスプレイとは比較になりません。
無線機等の周波数表示には、とても使う気になりません。
しかし、バックライト無のLCD、AQM1602Aと比較すると、遥かに視認性は良いです。