定番液晶モジュール SC1602B/Dを
PICでI2C接続化する実験
8ビットパラレル接続LCDをI2C接続化してみる
これはPICキット用を意識した、インターフェイス変換基板です。
パラレルインターフェイスのSC1602B/DをI2C接続化します。
秋月等にI2C接続の16桁2行のLCDが存在しますが、基本的に3.3V仕様な事、
PICは3.3Vでも動作するので、大きな問題は無いのですが、
5V、および3.3Vの2系統の電源を使うのは、できれば避けたい
5V動作とするには変換基板が必要で面倒な事、LCD自体ちょっと高価な事、
当局在庫に安価に購入したSC1602Dが多数ある事、
PICキットの14ピンCPUモジュールでも使用したい事、
以上の理由もあります。
今回使用したのはSC1602Dですが、SC1602Bでも動作します。
ただし、電源ピンの違いに注意が必要です
参考文献
電子工作のためのPIC16F活用ハンドブック 後閑 哲也 著 技術評論社
AE-AQM1602A資料 秋月電子
これはPICキット用を意識した、インターフェイス変換基板です。
パラレルインターフェイスのSC1602B/DをI2C接続化します。
秋月等にI2C接続の16桁2行のLCDが存在しますが、基本的に3.3V仕様な事、
PICは3.3Vでも動作するので、大きな問題は無いのですが、
5V、および3.3Vの2系統の電源を使うのは、できれば避けたい
5V動作とするには変換基板が必要で面倒な事、LCD自体ちょっと高価な事、
当局在庫に安価に購入したSC1602Dが多数ある事、
PICキットの14ピンCPUモジュールでも使用したい事、
以上の理由もあります。
今回使用したのはSC1602Dですが、SC1602Bでも動作します。
ただし、電源ピンの違いに注意が必要です
参考文献
電子工作のためのPIC16F活用ハンドブック 後閑 哲也 著 技術評論社
AE-AQM1602A資料 秋月電子
SC1602D ピン配置
裏面から見た
アノード ⑮ ⑯ カソード
DB6 ⑬ ⑭ DB7
DB4 ⑪ ⑫ DB5
DB2 ⑨ ⑩ DB3
DB0 ⑦ ⑧ DB1
R/W ⑤ ⑥ E
VO ③ ④ RS
VSS ① ② VDD
↑ LCDの比較
画像上がSC1602D、下がSC1602B
SC1602D液晶モジュールのハードウエア概要
インターフェイス ピン アサイン
ピン番号 シンボル レベル 説明
01 VSS 0V グランドに接続(注1)
02 VDD 5V 電源+(注1)
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) (注2)
16 K 0V バックライトLED電源- (注2)
注1)電源ピン番号
SC1602Bは1ピンがVDD、2ピンがVSSで、要注意
注2)SC1602Bではこの15,16ピンはありません
よって、今回はこのピンを使用しません。
基板上でVDDからLEDに電源供給しますが、その方法は下記を参照の事
インターフェイス ピン アサイン
ピン番号 シンボル レベル 説明
01 VSS 0V グランドに接続(注1)
02 VDD 5V 電源+(注1)
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) (注2)
16 K 0V バックライトLED電源- (注2)
注1)電源ピン番号
SC1602Bは1ピンがVDD、2ピンがVSSで、要注意
注2)SC1602Bではこの15,16ピンはありません
よって、今回はこのピンを使用しません。
基板上でVDDからLEDに電源供給しますが、その方法は下記を参照の事
↑ SC1602Bの背面
画像左端でバックライトLEDの処理します
↑ SC1602Dの背面
画像の様にJ3を導通
R9として、4.7Ωをハンダ付け
これにより、15,16ピンは使えません
↑ SC1602D コネクタ接続部
15,16ピンは接続されていません。
SC1602Bをこのまま接続OKです。
SC1602B/Dのバックライト電源処理
この処理により、液晶側の電源と共用できます。
SC1602Bの場合
SC1602Bの背面左側にバックライトLEDの配線部分があります。
左記画像を参考にしてください。
ここの、J3をハンダで導通させます
R9に10Ω程度をハンダ付けします。(注1)
SC1602Dの場合
このモジュールはLED用のピンが存在しますので、そこから電源供給できますが、
以下の処理により、SC1602Bと同様に使用できます。
ただし、15,16ピンは使用できません。無接続としてください。
SC1602Dの背面左側にバックライトLEDの配線部分があります。
ここの、J3をハンダで導通させます
R9に10Ω程度をハンダ付けします。(注2)
できれば隣のR8を除去すると安心です
注1)
秋月の同封説明書ではR9は10Ω~100Ωを接続となっており、
100Ωの抵抗2本が添付されています。
この抵抗を使用すると、電流が少なく、暗いです・・・
注2)
10Ωと書きましたが、これではLED電流70mA位でちょっと暗いです
当局はR9に4.7Ωを使用し、100mA(5V)程度流しています。
この処理により、液晶側の電源と共用できます。
SC1602Bの場合
SC1602Bの背面左側にバックライトLEDの配線部分があります。
左記画像を参考にしてください。
ここの、J3をハンダで導通させます
R9に10Ω程度をハンダ付けします。(注1)
SC1602Dの場合
このモジュールはLED用のピンが存在しますので、そこから電源供給できますが、
以下の処理により、SC1602Bと同様に使用できます。
ただし、15,16ピンは使用できません。無接続としてください。
SC1602Dの背面左側にバックライトLEDの配線部分があります。
ここの、J3をハンダで導通させます
R9に10Ω程度をハンダ付けします。(注2)
できれば隣のR8を除去すると安心です
注1)
秋月の同封説明書ではR9は10Ω~100Ωを接続となっており、
100Ωの抵抗2本が添付されています。
この抵抗を使用すると、電流が少なく、暗いです・・・
注2)
10Ωと書きましたが、これではLED電流70mA位でちょっと暗いです
当局はR9に4.7Ωを使用し、100mA(5V)程度流しています。
SC1602 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)イニシャライス(8bitモード)
1)パワーオン・ウエイト 40ms以上
2)Function Set
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 0 1 1 1 0 x x
8ビットバスモード、2行モード、ノーマルフォント
3)ウエイト 37us以上
4)Function Set
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 0 1 1 1 0 x x
5)ウエイト 37us以上
6)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
ディスプレイOFF、カーソルOFF、カーソルブリンクOFF
7)ウエイト 37us以上
8)Clear Display
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 0 0 0 0 0 0 1
8)ウエイト 1.52ms以上
9)Entry Mode Set カーソルのインクリメント方向、表示シフトの設定
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 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)イニシャライス(8bitモード)
1)パワーオン・ウエイト 40ms以上
2)Function Set
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 0 1 1 1 0 x x
8ビットバスモード、2行モード、ノーマルフォント
3)ウエイト 37us以上
4)Function Set
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 0 1 1 1 0 x x
5)ウエイト 37us以上
6)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
ディスプレイOFF、カーソルOFF、カーソルブリンクOFF
7)ウエイト 37us以上
8)Clear Display
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 0 0 0 0 0 0 1
8)ウエイト 1.52ms以上
9)Entry Mode Set カーソルのインクリメント方向、表示シフトの設定
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 0 0 0 0 1 1 0
右方向インクリメント、表示シフト無
今回製作するインターフェイス変換基板回路
秋月のA基板に入出力ピンを設置し、PIC16F1828を介入しただけです。
入力側ピンはI2C+RDYの3ピンです。
出力側ピンは8ビットパラレルと制御用3ピン、コントラスト用2ピンです。
その他に電源ピンがあります。
LCDモジュールとは、8bitパラレルデータ通信としました。
回路そのものは単純な配線作業となってしまい、面白い所は1つも無いです・・・
回路図にはありませんが、基板にはICSP回路とそのピンを設置しています。
使用したLCDはSC1602Dで、モジュールにLED用抵抗を取り付けましたので、
SC1602Dの15,16ピンは配線されていません。
それどころか、基板出力ピンにもありません。
SC1602Bは電源ピンが逆なのを変更すれば、OKです。
PIC16F1828 I/Oピン使用マップ
RA0:未使用
RA1:未使用
RA2:SC1602 RSピン
RA3:ジャンパピン
RA4:SC1602 R/Wピン
RA5:SC1602 Eピン
RB4:I2C SDAピン、プルアップ済
RB5:RDYピン、デジタル出力
RB6:I2C SCLピン、プルアップ済み
RB7:LED駆動出力、スレーブアドレス受信で発光し、ストップ受信で消灯します。
RC0-7:SC1602 DB0-DB7ピンで8bitバスとして使用
秋月のA基板に入出力ピンを設置し、PIC16F1828を介入しただけです。
入力側ピンはI2C+RDYの3ピンです。
出力側ピンは8ビットパラレルと制御用3ピン、コントラスト用2ピンです。
その他に電源ピンがあります。
LCDモジュールとは、8bitパラレルデータ通信としました。
回路そのものは単純な配線作業となってしまい、面白い所は1つも無いです・・・
回路図にはありませんが、基板にはICSP回路とそのピンを設置しています。
使用したLCDはSC1602Dで、モジュールにLED用抵抗を取り付けましたので、
SC1602Dの15,16ピンは配線されていません。
それどころか、基板出力ピンにもありません。
SC1602Bは電源ピンが逆なのを変更すれば、OKです。
PIC16F1828 I/Oピン使用マップ
RA0:未使用
RA1:未使用
RA2:SC1602 RSピン
RA3:ジャンパピン
RA4:SC1602 R/Wピン
RA5:SC1602 Eピン
RB4:I2C SDAピン、プルアップ済
RB5:RDYピン、デジタル出力
RB6:I2C SCLピン、プルアップ済み
RB7:LED駆動出力、スレーブアドレス受信で発光し、ストップ受信で消灯します。
RC0-7:SC1602 DB0-DB7ピンで8bitバスとして使用
入力側 I2Cインターフェイスのプログラム
これはI/OポートBで、PIC内部のMSSPモジュールを使用します。
これをI2Cスレーブモードで構成していきます。
割り込み発生も含めた受信処理をハードウエアで行ってくれるので楽です。
RDYピンは今の所使用していません。、
送信されてくるデータは、「AQM1602」と同じシークェンスとして処理します。
つまり、1バイトのLCDデータやインストラクションコマンドは、
コマンドワードと言う2バイトデータで送信されてきます。
コマンドワードは、コントロールバイトとデータバイトで構成されます。
I2C受信処理
ここは割込みルーチン内ですべて処理します。
割込み原因の確認とその受信処理を行いますが、結果は「MODE」フラグに反映させます。
また、I2Cアドレス受信でRB7のLEDを点灯、I2C_STOP受信で消灯させます。
I2Cアドレス受信割込み、
I2Cデータ受信割込み、
I2C_STOP検出割込み、
以上の3種の割込みを利用し、MODEフラグに反映しています。
メインプログラム
ここでは、通常ひたすら「MODE」フラグのチェックをしてしています。
フラグの変化を頼りに、受信したI2Cデータの処理を開始し始めます。
受信したコマンドワードは、LCDコマンドとLCDデータに分離し、それぞれLCDに送信します。
基本設定として、LCDは16桁2行モードで初期設定しています。
このままで良ければ、ホストCPUからは、LCD初期設定は不要です。
ただ、ホストCPUは本変換基板の立ち上がりシークェンス終了まで待つ必要があります。
受信コマンドライン処理について
1コマンドワードずつ処理し、連続コマンドだとしてもコマンドを溜め込みません。
LCDへのコマンド送信後のウェイトは外しています。
よって、ホストCPU側が必要なLCDコマンド間のウェイトを考慮する格好としました。
当初はFIFOバッファに受信したLCDコマンドやデータを溜め込み、
ウエイト無の連続送信をされても、対処できるように考えていたのですが、
これらは面倒なのでやめました・・・
AQM1602を使用しているつもりで送信しても、今の所は大丈夫な様です。
と言うか、拡張コマンドは無視してくれるようです。
これはI/OポートBで、PIC内部のMSSPモジュールを使用します。
これをI2Cスレーブモードで構成していきます。
割り込み発生も含めた受信処理をハードウエアで行ってくれるので楽です。
RDYピンは今の所使用していません。、
送信されてくるデータは、「AQM1602」と同じシークェンスとして処理します。
つまり、1バイトのLCDデータやインストラクションコマンドは、
コマンドワードと言う2バイトデータで送信されてきます。
コマンドワードは、コントロールバイトとデータバイトで構成されます。
I2C受信処理
ここは割込みルーチン内ですべて処理します。
割込み原因の確認とその受信処理を行いますが、結果は「MODE」フラグに反映させます。
また、I2Cアドレス受信でRB7のLEDを点灯、I2C_STOP受信で消灯させます。
I2Cアドレス受信割込み、
I2Cデータ受信割込み、
I2C_STOP検出割込み、
以上の3種の割込みを利用し、MODEフラグに反映しています。
メインプログラム
ここでは、通常ひたすら「MODE」フラグのチェックをしてしています。
フラグの変化を頼りに、受信したI2Cデータの処理を開始し始めます。
受信したコマンドワードは、LCDコマンドとLCDデータに分離し、それぞれLCDに送信します。
基本設定として、LCDは16桁2行モードで初期設定しています。
このままで良ければ、ホストCPUからは、LCD初期設定は不要です。
ただ、ホストCPUは本変換基板の立ち上がりシークェンス終了まで待つ必要があります。
受信コマンドライン処理について
1コマンドワードずつ処理し、連続コマンドだとしてもコマンドを溜め込みません。
LCDへのコマンド送信後のウェイトは外しています。
よって、ホストCPU側が必要なLCDコマンド間のウェイトを考慮する格好としました。
当初はFIFOバッファに受信したLCDコマンドやデータを溜め込み、
ウエイト無の連続送信をされても、対処できるように考えていたのですが、
これらは面倒なのでやめました・・・
AQM1602を使用しているつもりで送信しても、今の所は大丈夫な様です。
と言うか、拡張コマンドは無視してくれるようです。
出力側 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の命令ではなく、アッセンブラ疑似命令です
↑ 試運転中
画像上がI2C送信用実験基板
下の基板が今回の変換基板
基板間はシンプルなI2C接続だが、
変換基板とLCDとの接続は・・・
変換基板のプログラム
PIC16F1828_SC1602_I2C_01.asm
PIC16F1828_SC1602_I2C_01.hex
使用方法 Ver1.0
基本的にはAQM1602の操作方法に準拠した制御方法です。
I2Cマスタ送信については、別項「PICでAQM1602を使ってみた」等を参照して下さい
秋月電子のAQM1602操作マニュアル等も参照して下さい。
LCDの違いによる関係上、AQM1602用専用コマンドは実行できません。
送信制御はAQM1602、実行LCDはSC1602である事を意識する必要があります。
現在の所、本変換基板からの送信(マスタへの返信)は未対応です。
今後の対応とさせて頂きます。
VDDは5Vで、SDA,SCLラインは基板上で10KΩでのプルアップがされています。
バックライトで100mA以上電流消費しますので、200mA程度の電源が必要です。
コントラストは基板上のVRで調整し、コマンドでの対応はしていません。
本基板立ち上がり時に、LCDの初期設定を行っています。
初期設定値は、16桁、2行、ノーマルサイズフォント、となっています。
また、8bitバスモードになっていますので、これを設定変更しないで下さい。
本基板の初期設定時間が終了するまで、マスタ側は送信を待つ必要があります。
待ち時間は正確には調べていませんが、1秒程度待てば大丈夫です。
マスタCPU側のデータとコマンドの送信方法
スレーブアドレスに続くコマンドワードは「コントロールバイト+データバイト」で構成
コントロールバイトの構成
bit7 CO
CO=1:連続コマンドワード
CO=0:最終コマンドワード
bit6 R/S
R/S=1:続くデータバイトはLCD表示データ
R/S=0:続くデータバイトはLCDインストラクションコード
bit5 =0
bit4 =0
bit3 =0
bit2 =0
bit1 =0
bit0 =0
例1)LCDコマンドの「Clear Display」送信
①I2C_START
②I2Cアドレス「7CH」を送信
③コントロールバイト「00H」を送信
④データバイト「01H」を送信
⑤I2C_STOP
例2)LCD1行目左側に「CQ」と表示
①I2C_START
②I2Cアドレス「7CH」送信
③コントロールバイト「80H」送信(CO=1、RS=0)
④データバイト「80H」送信(Set DDRAM Adress)
⑤コントロールバイト「C0H」送信(CO=1、RS=1)
⑥データバイト「43H」送信(キャラクタコードC)
⑦コントロールバイト「00H」送信(CO=0、RS=0)
⑧データバイト「81H」送信(Set DDRAM Adress)
⑨コントロールバイト「40H」送信(CO=0、RS=1)
⑩データバイト[51H」送信(キャラクタコードQ)
⑪I2C_STOP
基本的にはAQM1602の操作方法に準拠した制御方法です。
I2Cマスタ送信については、別項「PICでAQM1602を使ってみた」等を参照して下さい
秋月電子のAQM1602操作マニュアル等も参照して下さい。
LCDの違いによる関係上、AQM1602用専用コマンドは実行できません。
送信制御はAQM1602、実行LCDはSC1602である事を意識する必要があります。
現在の所、本変換基板からの送信(マスタへの返信)は未対応です。
今後の対応とさせて頂きます。
VDDは5Vで、SDA,SCLラインは基板上で10KΩでのプルアップがされています。
バックライトで100mA以上電流消費しますので、200mA程度の電源が必要です。
コントラストは基板上のVRで調整し、コマンドでの対応はしていません。
本基板立ち上がり時に、LCDの初期設定を行っています。
初期設定値は、16桁、2行、ノーマルサイズフォント、となっています。
また、8bitバスモードになっていますので、これを設定変更しないで下さい。
本基板の初期設定時間が終了するまで、マスタ側は送信を待つ必要があります。
待ち時間は正確には調べていませんが、1秒程度待てば大丈夫です。
マスタCPU側のデータとコマンドの送信方法
スレーブアドレスに続くコマンドワードは「コントロールバイト+データバイト」で構成
コントロールバイトの構成
bit7 CO
CO=1:連続コマンドワード
CO=0:最終コマンドワード
bit6 R/S
R/S=1:続くデータバイトはLCD表示データ
R/S=0:続くデータバイトはLCDインストラクションコード
bit5 =0
bit4 =0
bit3 =0
bit2 =0
bit1 =0
bit0 =0
例1)LCDコマンドの「Clear Display」送信
①I2C_START
②I2Cアドレス「7CH」を送信
③コントロールバイト「00H」を送信
④データバイト「01H」を送信
⑤I2C_STOP
例2)LCD1行目左側に「CQ」と表示
①I2C_START
②I2Cアドレス「7CH」送信
③コントロールバイト「80H」送信(CO=1、RS=0)
④データバイト「80H」送信(Set DDRAM Adress)
⑤コントロールバイト「C0H」送信(CO=1、RS=1)
⑥データバイト「43H」送信(キャラクタコードC)
⑦コントロールバイト「00H」送信(CO=0、RS=0)
⑧データバイト「81H」送信(Set DDRAM Adress)
⑨コントロールバイト「40H」送信(CO=0、RS=1)
⑩データバイト[51H」送信(キャラクタコードQ)
⑪I2C_STOP
↑ プラケースに収納
現在はプラケースにLCDと基板を収納しています。
画像右側にICSP用の穴も開いており、プログラムの更新もこのままで可能です。
更新した変換基板プログラム
PIC16F1828_SC1602_I2C_03.asm
マスタ側デモプログラム
XC8で記述されてます
MSSPマスタ関数
AQM1602制御関数も必要です
XC8_16F1705_I2C_SC1602_demo01.c
MSSP02b.h
MSSP02b.c
AQM1602v2.h
AQM1602v2.c
感想
親CPUからのブログラミングは、初期設定が不要なので、程良い操作性になりました。
PICキットでの使用では、CPU基板の使用ピン数の節約になるので、GOODです。
また、数少ない5V系I2Cモジュールとして使用できる意味もあります。
しかし、LCD&I2C制御にPIC1個をまるまる使用するのに、対象LCDがSC1602では、
当局の心情としては少々不満です・・・
つまり、グラフィックLCDを対象とすれば、とりあえず満足できそうです。
まあ、今回は実験的なものですので、I2Cスレーブ動作確認でOKとします。
プログラム構想時もスレーブ動作ばかり考えてましたしね。
製作コストも低く回路も簡単なのですが、配線が多いので、やっぱり面倒なのが欠点かな
結局、16桁2行のLCDでしかないし・・・
この辺はグラフィックLCDとすると、面倒意識が改善されるとは思いますが。
プログラム自体は暫定版みたいな感じなので、少しずつ改善していきます。
プログラムの変更は、このページに追記していきます。
追記 2017年10月
お詫びです <m(__)m>
SC1602D/Bの違いはLED用ピンのある無だけでは無く、
電源ピン番号の+-が逆でした・・・
事が事だけに本文を改変しています。
SC1602Dが売られていない原因が解ったような気がします
追記 2019年11月
プログラムの更新を行い、バージョンが上がりました。
プログラムはアッセンブラのままで、使用PICも変更ありません。
変更点
1)MSSP処理の「I2Cスレーブモード」がVer0.2となりました
①スレーブ送信(返信)に対応
②送受信にてマスタに対してクロックストレッチを行うようにした
そのためマスタ側はコマンド間のウエイトを意識する必要が無くなった
2)8bitバス用LCD処理ASMプログラムも送受対応とした
4bit版とほぼ同じ機能となっています。
その他見直しの際見つけたバグも対処しました
デモ・プログラム
送受信を使用した関数の実行
外字登録とその外字の表示
使用基板はPICキット14ピンCPU基板
使用PICは16F1705です
I2Cバスは、
RC0=SCL
RC1=SDA
と、いつもと同じ構成になっています。
親CPUからのブログラミングは、初期設定が不要なので、程良い操作性になりました。
PICキットでの使用では、CPU基板の使用ピン数の節約になるので、GOODです。
また、数少ない5V系I2Cモジュールとして使用できる意味もあります。
しかし、LCD&I2C制御にPIC1個をまるまる使用するのに、対象LCDがSC1602では、
当局の心情としては少々不満です・・・
つまり、グラフィックLCDを対象とすれば、とりあえず満足できそうです。
まあ、今回は実験的なものですので、I2Cスレーブ動作確認でOKとします。
プログラム構想時もスレーブ動作ばかり考えてましたしね。
製作コストも低く回路も簡単なのですが、配線が多いので、やっぱり面倒なのが欠点かな
結局、16桁2行のLCDでしかないし・・・
この辺はグラフィックLCDとすると、面倒意識が改善されるとは思いますが。
プログラム自体は暫定版みたいな感じなので、少しずつ改善していきます。
プログラムの変更は、このページに追記していきます。
追記 2017年10月
お詫びです <m(__)m>
SC1602D/Bの違いはLED用ピンのある無だけでは無く、
電源ピン番号の+-が逆でした・・・
事が事だけに本文を改変しています。
SC1602Dが売られていない原因が解ったような気がします
追記 2019年11月
プログラムの更新を行い、バージョンが上がりました。
プログラムはアッセンブラのままで、使用PICも変更ありません。
変更点
1)MSSP処理の「I2Cスレーブモード」がVer0.2となりました
①スレーブ送信(返信)に対応
②送受信にてマスタに対してクロックストレッチを行うようにした
そのためマスタ側はコマンド間のウエイトを意識する必要が無くなった
2)8bitバス用LCD処理ASMプログラムも送受対応とした
4bit版とほぼ同じ機能となっています。
その他見直しの際見つけたバグも対処しました
デモ・プログラム
送受信を使用した関数の実行
外字登録とその外字の表示
使用基板はPICキット14ピンCPU基板
使用PICは16F1705です
I2Cバスは、
RC0=SCL
RC1=SDA
と、いつもと同じ構成になっています。