ACM2004Dを使用したI2C接続
PICキット用キャラクタディスプレイユニット
「AQM2004」の製作
PICキットやそれ以外でも使えるI2C接続LCDユニット
これはPICキット用を意識した、4行20桁LCDユニットです。
とは言っても以前に実験的に製作したSC1602I2Cユニットとほぼ同じハードウエア構成です。
しかし表示できる文字数が格段に多く(約2.5倍)なりました。
液晶モジュールは秋月電子で1K円で購入したものです。
これを秋月で売ってるプラケースに収納しました。
PICキットとは電源線も含めて4本のコードで接続すればOKです。
ICSPピンも出ていますので、バージョンアップも簡単にできます。
ホスト側から見えるハードウエアはAQM1602と同じで、低レベルアクセス用プログラムも同じです。
よって、当局内では今回の製作物を「AQM2004}と呼ぶ事にしました。
そう言う意味では、以前製作していたSC1602I2Cユニットも同じ様に命名すれば良いのだが、本家AQM1602と区別が付かないので、思案中です。
ユニットの他にホストCPU基板用のXC8用制御関数群も用意します。
PICキットによる各種実験等にお手軽で便利なLCDモジュールとなってくれると期待しています。
参考文献
SC1602B/DをI2C接続化する実験 JA0QONホームページ
ACM2004D資料 秋月電子HPより
これはPICキット用を意識した、4行20桁LCDユニットです。
とは言っても以前に実験的に製作したSC1602I2Cユニットとほぼ同じハードウエア構成です。
しかし表示できる文字数が格段に多く(約2.5倍)なりました。
液晶モジュールは秋月電子で1K円で購入したものです。
これを秋月で売ってるプラケースに収納しました。
PICキットとは電源線も含めて4本のコードで接続すればOKです。
ICSPピンも出ていますので、バージョンアップも簡単にできます。
ホスト側から見えるハードウエアはAQM1602と同じで、低レベルアクセス用プログラムも同じです。
よって、当局内では今回の製作物を「AQM2004}と呼ぶ事にしました。
そう言う意味では、以前製作していたSC1602I2Cユニットも同じ様に命名すれば良いのだが、本家AQM1602と区別が付かないので、思案中です。
ユニットの他にホストCPU基板用のXC8用制御関数群も用意します。
PICキットによる各種実験等にお手軽で便利なLCDモジュールとなってくれると期待しています。
参考文献
SC1602B/DをI2C接続化する実験 JA0QONホームページ
ACM2004D資料 秋月電子HPより
ACM2004D液晶モジュールのハードウエア概要
接続ピン番号を見る限りSC1602Dと同じです。
インターフェイス ピン アサイン
ピン番号 シンボル レベル 説明
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 信号イネーブル
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 BL+ 4.2V バックライトLED電源+
(標準15mA)
16 BL- 0V バックライトLED電源-
接続ピン番号を見る限りSC1602Dと同じです。
インターフェイス ピン アサイン
ピン番号 シンボル レベル 説明
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 信号イネーブル
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 BL+ 4.2V バックライトLED電源+
(標準15mA)
16 BL- 0V バックライトLED電源-
↑ 変換基板回路図
↑ I2C変換基板
↑ プラケースに基板を装着
↑ LCDモジュールをケースに装着
プラケースのフタに取り付けてます
↑ プラケース・フタ
↑ ねじ止め部分
ネジは金属製のM2.5
スペーサーはプラネジM3のナットです。
ネジがもっと短い方が良かったです
↑ 全て収納
↑ 動作試験中
ホストCPUはPICキットCPU基板にPIC16F18326を挿入
XC8でのデモプログラムを動作せてます
AQM2004ユニットの製作
SC1602I2Cと同じ構成で、ケースは秋月電子のSK-16
基板はC基板にPIC16F1828を乗っけてます。
16F1828は部品箱に余っているので、消費したくて使用しました。
圧電スピーカはSPT08で2個100円で購入してた物で長年部品箱に転がってました
コネクタには普通ピンを使用しています。
LCD部分だけ細ピン使用です。
I2C接続化PIC基板回路
秋月のC基板に入出力ピンを設置した以前製作のSC1602I2Cの回路と同じですが、RDYピンを廃止し圧電スピーカーを接続しています。
入力側ピンはSDA、SCLの2ピンです。
LCD用出力側ピンは8ビットパラレルと制御用3ピン、コントラスト用2ピンで、
その他に電源ピンがあり、計16ピンの接続です・・・ (-_-;)
よってLCDモジュールとは、8bitパラレルデータ通信としてます。
バックライト電源の15,16ピンは33Ωを介して接続、約14mAの電流を流しています。
SC1602用バックライトより桁違いに高光度低消費電力です。
SC1602I2Cと同じ構成で、ケースは秋月電子のSK-16
基板はC基板にPIC16F1828を乗っけてます。
16F1828は部品箱に余っているので、消費したくて使用しました。
圧電スピーカはSPT08で2個100円で購入してた物で長年部品箱に転がってました
コネクタには普通ピンを使用しています。
LCD部分だけ細ピン使用です。
I2C接続化PIC基板回路
秋月のC基板に入出力ピンを設置した以前製作のSC1602I2Cの回路と同じですが、RDYピンを廃止し圧電スピーカーを接続しています。
入力側ピンはSDA、SCLの2ピンです。
LCD用出力側ピンは8ビットパラレルと制御用3ピン、コントラスト用2ピンで、
その他に電源ピンがあり、計16ピンの接続です・・・ (-_-;)
よってLCDモジュールとは、8bitパラレルデータ通信としてます。
バックライト電源の15,16ピンは33Ωを介して接続、約14mAの電流を流しています。
SC1602用バックライトより桁違いに高光度低消費電力です。
↑ バラック状態でデバッグ中
MSSPスレーブモード基本プログラムとLCD低レベルサブルーチンは、SC1602I2Cの物を改変もせずに、そのまま利用しています。
今回は画面拡張に伴う、LCD上位サブルーチン群の作り直しと、MSSPとの接点部分のVCU関数制御部分の拡張を行いました。
AQM2004 内部プログラム
16F1828_ACM2004I2C_v1.asm
AQM2004 ASM版プログラム概要
LCD基板内PICのアッセンブラ・プログラムです。
プログラムは大別すると、
①MSSPスレーブモードVer0.2基本プログラム
割り込みルーチン内と通常ルーチン内とに存在します
スレーブアドレスはメインプログラム最初の「I2C_ADR」に設定
割り込みルーチンでは、MSSPからの割り込み情報を「SLV_FLG]に、
受信1バイトデータを「I2C_DATA]に格納し、②に伝えます
通常ルーチン内のサブルーチンは②から呼び出されて機能します。
②MSSPスレーブモード管制プログラム
MSSPが受信した1バイトデータは「I2C_DATA」に格納されてます
このデータを元に必要な処理実行プログラムを選択・呼び出しします
③LCD制御プログラム
ACM2004制御ルーチン群Ver1です。
の、3集団が存在します。
③はXC8版とほぼ同じ関数群が存在し、②から呼び出されますが、全部使う訳ではありません。
下記以外の関数の紹介は略させて頂きます。
ASM版ACM2004制御サブルーチン群Ver1の使い方
PUTLx
LCDx行目の先頭から文字列を表示
表示開始位置指定はできない
最大20文字で、それ以上の文字は無視される
xは1~4
引 数:MSAD0 文字列格納アドレス下位番地
MSAD1 文字列格納アドレス上位番地
以上16bitでアドレス指定
文字列エンドコードは00Hです。
戻 値:無
PUTL
「VRAM」で指定された位置から文字列を連続表示(注1)
1行に収まらない時は次の行の先頭(最左側)から連続表示する
表示後「VRAM」アドレスは最後尾+1を示す
最大80文字分まで表示され、それ以上は上スクロールされる。
引 数:MSAD0 文字列格納アドレス下位番地
MSAD1 文字列格納アドレス上位番地
以上16bitでアドレス指定
文字列エンドコードは00Hです。
戻 値:無
LNBSL
LCDx行目の最右側に文字を表示
その行にあった文字列は左にスクロール
最左側の文字は破棄される
x=1~4
引数1:Wreg 文字コード
引数2:LINNO 処理する行を指定
0:1行目
1:2行目
2:3行目
3:4行目
戻値:無
LNBSR
LCDx行目の最左側に文字を表示
その行にあった文字列は左にスクロール
最右側の文字は破棄される
x=1~4
引数1:Wreg 文字コード
引数2:LINNO 処理する行を指定
0:1行目
1:2行目
2:3行目
3:4行目
戻値:無
LXBSL
Wregの文字コードを区間最右側に表示
指定区間文字列は左にスクロール
区間最左側の文字は破棄される
引数1:Wreg 文字コード
引数2:BSLST スクロール枠始点のVRAMアドレス
引数3:BSLSP スクロール枠終点のVRAMアドレス
MSLSP>BSLSTである事
戻値:無
LXBSR
Wregの文字コードを区間最左側に表示
指定区間文字列は右にスクロール
区間最右側の文字は破棄される
引数1:Wreg 文字コード
引数2:BSLST スクロール枠始点のVRAMアドレス
引数3:BSLSP スクロール枠終点のVRAMアドレス
MSLSP>BSLSTである事
戻値:無
WRTD
従えるサブルーチンの数が最も多い、今回の主要ルーチンです。
「VRAM」で指定された位置に文字を表示
1行に収まらない時は次の行の先頭(最左側)から連続表示する
表示後「VRAM」アドレスは最後尾+1を示す(注1)
いくつかの制御コードに対応します(注4)
引 数:Wregに文字コード
戻 値:無
PUTW
「VRAM」で指定した位置にWregで指定した文字コードの文字を表示
「WRTD」と機能が似ているが制御コード他処理は一切しない
引数1:Wregに表示させる文字コード
引数2:「VRAM」にLCD表示位置アドレス(注1)
戻 値:無
GETW
「VRAM」で指定した位置の文字コードを取得
引 数:「VRAM」にLCD表示位置アドレス(注1)
戻 値:Wregに取得文字コード
PUTG
Wregで指定した外字文字コード(0~7)の登録をする
引数1:MSAD0 外字ビットデータ格納アドレス下位番地
MSAD1 外字ビットデータ格納アドレス上位番地
以上16bitでアドレス指定
ビットデータは8バイト分必要でエンドコードは不要です。
引数2:Wregに外字文字コード(0~7)を指定
戻 値:無
BEEP1
BEEP音を発音します
引 数:無
戻 値:無
BEEP2
BEEP音を発音します
引 数:無
戻 値:無
補足事項
(注1)VRAMアドレス
LCD表示モードが20桁・4行表示・5×7ビット文字での話になります。
ACM2004の表示位置アドレス
表示モードによってDDRAMアドレスと表示位置の関係が変化する様です。
表示シフトを行わない限り、20桁4行表示では、
1行目は00H~13Hで、最左側から表示
2行目は40H~53Hで、
3行目は14H~27Hで、
4行目は54H~67H、がDDRAMアドレスとなるようです。
命令ビットがbit7=Hですので、
80H+DDRAMアドレスが事実上の表示位置指定値となります。
どちらにしろアドレス指定値が非常に面倒クサなので、
ここで言うLCD表示位置アドレスとは、
LCD表示モードが20桁・4行表示・5×7ビット文字
以上の環境で、
16進 10進
1行目 00H~13H 0~19
2行目 14H~27H 20~39
3行目 28H~3BH 40~59
4行目 3CH~4FH 60~79
とします。
右側の10進数で指定すると解り易いと思います。
「VRAM」広域変数に上記のアドレス値を代入、
それから文字書き込み系の関数を呼び出します。
(注2)CGRAMアドレス
CGRAMはハードウエア的に00H~3FHのアドレスと、
64バイト8文字分存在する様です
命令ビットがbit6=Hですので、
40H+CGRAMアドレスがアクセス指定命令となります。
面倒なので、ここで言うCGRAMアドレスとは、
命令ビットを含んだ40H~7FHとします
外字登録の文字コードとCGRAMアドレス
1文字のビットデータは8つのCGRAMアドレスで構成されます。
1文字に付き、上から00H~07Hのアドレスでビットデータを指定
命令ビットはbit6でそれを加算します。つまり、
文字コード00HのCGRAMアドレスは40H~47H
文字コード01HのCGRAMアドレスは48H~4FH
文字コード06HのCGRAMアドレスは70H~77H
文字コード07HのCGRAMアドレスは78H~7FH
文字コードは00H~07Hまでが存在
文字コード08H~0FHは同じ文字を指定、
つまり文字コード08H~0FHのbit3は無視されます
(注3)CGRAMデータ
登録外字は1文字に付き8バイトのCGRAMデータで構成されています。
1バイトのビットデータは下位5bitが有効です。
横5bit×縦8bit構成のフォントですが、
横5bitの最右側ビットがbit0、最左側がbit4となります。
bit5~7はメモリとして存在しますが、表示はされません。
ビットデータはフォントの上から下に向かってアドレスが進みます。
例1)
文字コード00Hの外字登録
CGRAMアドレス データ 表示パターン
40H 1FH ●●●●●
41H 11H ●○○○●
42H 15H ●○●○●
43H 17H ●○●●●
44H 15H ●○●○●
45H 11H ●○○○●
46H 1FH ●●●●●
47H 00H ○○○○○
(注4)制御コード
今の所、下記の制御コードに対応します。
制御コード
¥a:07H BEL
¥b:08H BS
¥n:0AH LF(復帰改行)
¥f:0CH FF(復帰改行と同じ)
¥r:0DH CR(復帰)
BEEP音について
使用した基板には下記のポートに圧電スピーカーが接続されています
BEEP1はこのポートから約2KHZのパルスを約100ms出力
出力ポート:RB5
改変する場合、ループ定数等を変更して下さい
LCD基板内PICのアッセンブラ・プログラムです。
プログラムは大別すると、
①MSSPスレーブモードVer0.2基本プログラム
割り込みルーチン内と通常ルーチン内とに存在します
スレーブアドレスはメインプログラム最初の「I2C_ADR」に設定
割り込みルーチンでは、MSSPからの割り込み情報を「SLV_FLG]に、
受信1バイトデータを「I2C_DATA]に格納し、②に伝えます
通常ルーチン内のサブルーチンは②から呼び出されて機能します。
②MSSPスレーブモード管制プログラム
MSSPが受信した1バイトデータは「I2C_DATA」に格納されてます
このデータを元に必要な処理実行プログラムを選択・呼び出しします
③LCD制御プログラム
ACM2004制御ルーチン群Ver1です。
の、3集団が存在します。
③はXC8版とほぼ同じ関数群が存在し、②から呼び出されますが、全部使う訳ではありません。
下記以外の関数の紹介は略させて頂きます。
ASM版ACM2004制御サブルーチン群Ver1の使い方
PUTLx
LCDx行目の先頭から文字列を表示
表示開始位置指定はできない
最大20文字で、それ以上の文字は無視される
xは1~4
引 数:MSAD0 文字列格納アドレス下位番地
MSAD1 文字列格納アドレス上位番地
以上16bitでアドレス指定
文字列エンドコードは00Hです。
戻 値:無
PUTL
「VRAM」で指定された位置から文字列を連続表示(注1)
1行に収まらない時は次の行の先頭(最左側)から連続表示する
表示後「VRAM」アドレスは最後尾+1を示す
最大80文字分まで表示され、それ以上は上スクロールされる。
引 数:MSAD0 文字列格納アドレス下位番地
MSAD1 文字列格納アドレス上位番地
以上16bitでアドレス指定
文字列エンドコードは00Hです。
戻 値:無
LNBSL
LCDx行目の最右側に文字を表示
その行にあった文字列は左にスクロール
最左側の文字は破棄される
x=1~4
引数1:Wreg 文字コード
引数2:LINNO 処理する行を指定
0:1行目
1:2行目
2:3行目
3:4行目
戻値:無
LNBSR
LCDx行目の最左側に文字を表示
その行にあった文字列は左にスクロール
最右側の文字は破棄される
x=1~4
引数1:Wreg 文字コード
引数2:LINNO 処理する行を指定
0:1行目
1:2行目
2:3行目
3:4行目
戻値:無
LXBSL
Wregの文字コードを区間最右側に表示
指定区間文字列は左にスクロール
区間最左側の文字は破棄される
引数1:Wreg 文字コード
引数2:BSLST スクロール枠始点のVRAMアドレス
引数3:BSLSP スクロール枠終点のVRAMアドレス
MSLSP>BSLSTである事
戻値:無
LXBSR
Wregの文字コードを区間最左側に表示
指定区間文字列は右にスクロール
区間最右側の文字は破棄される
引数1:Wreg 文字コード
引数2:BSLST スクロール枠始点のVRAMアドレス
引数3:BSLSP スクロール枠終点のVRAMアドレス
MSLSP>BSLSTである事
戻値:無
WRTD
従えるサブルーチンの数が最も多い、今回の主要ルーチンです。
「VRAM」で指定された位置に文字を表示
1行に収まらない時は次の行の先頭(最左側)から連続表示する
表示後「VRAM」アドレスは最後尾+1を示す(注1)
いくつかの制御コードに対応します(注4)
引 数:Wregに文字コード
戻 値:無
PUTW
「VRAM」で指定した位置にWregで指定した文字コードの文字を表示
「WRTD」と機能が似ているが制御コード他処理は一切しない
引数1:Wregに表示させる文字コード
引数2:「VRAM」にLCD表示位置アドレス(注1)
戻 値:無
GETW
「VRAM」で指定した位置の文字コードを取得
引 数:「VRAM」にLCD表示位置アドレス(注1)
戻 値:Wregに取得文字コード
PUTG
Wregで指定した外字文字コード(0~7)の登録をする
引数1:MSAD0 外字ビットデータ格納アドレス下位番地
MSAD1 外字ビットデータ格納アドレス上位番地
以上16bitでアドレス指定
ビットデータは8バイト分必要でエンドコードは不要です。
引数2:Wregに外字文字コード(0~7)を指定
戻 値:無
BEEP1
BEEP音を発音します
引 数:無
戻 値:無
BEEP2
BEEP音を発音します
引 数:無
戻 値:無
補足事項
(注1)VRAMアドレス
LCD表示モードが20桁・4行表示・5×7ビット文字での話になります。
ACM2004の表示位置アドレス
表示モードによってDDRAMアドレスと表示位置の関係が変化する様です。
表示シフトを行わない限り、20桁4行表示では、
1行目は00H~13Hで、最左側から表示
2行目は40H~53Hで、
3行目は14H~27Hで、
4行目は54H~67H、がDDRAMアドレスとなるようです。
命令ビットがbit7=Hですので、
80H+DDRAMアドレスが事実上の表示位置指定値となります。
どちらにしろアドレス指定値が非常に面倒クサなので、
ここで言うLCD表示位置アドレスとは、
LCD表示モードが20桁・4行表示・5×7ビット文字
以上の環境で、
16進 10進
1行目 00H~13H 0~19
2行目 14H~27H 20~39
3行目 28H~3BH 40~59
4行目 3CH~4FH 60~79
とします。
右側の10進数で指定すると解り易いと思います。
「VRAM」広域変数に上記のアドレス値を代入、
それから文字書き込み系の関数を呼び出します。
(注2)CGRAMアドレス
CGRAMはハードウエア的に00H~3FHのアドレスと、
64バイト8文字分存在する様です
命令ビットがbit6=Hですので、
40H+CGRAMアドレスがアクセス指定命令となります。
面倒なので、ここで言うCGRAMアドレスとは、
命令ビットを含んだ40H~7FHとします
外字登録の文字コードとCGRAMアドレス
1文字のビットデータは8つのCGRAMアドレスで構成されます。
1文字に付き、上から00H~07Hのアドレスでビットデータを指定
命令ビットはbit6でそれを加算します。つまり、
文字コード00HのCGRAMアドレスは40H~47H
文字コード01HのCGRAMアドレスは48H~4FH
文字コード06HのCGRAMアドレスは70H~77H
文字コード07HのCGRAMアドレスは78H~7FH
文字コードは00H~07Hまでが存在
文字コード08H~0FHは同じ文字を指定、
つまり文字コード08H~0FHのbit3は無視されます
(注3)CGRAMデータ
登録外字は1文字に付き8バイトのCGRAMデータで構成されています。
1バイトのビットデータは下位5bitが有効です。
横5bit×縦8bit構成のフォントですが、
横5bitの最右側ビットがbit0、最左側がbit4となります。
bit5~7はメモリとして存在しますが、表示はされません。
ビットデータはフォントの上から下に向かってアドレスが進みます。
例1)
文字コード00Hの外字登録
CGRAMアドレス データ 表示パターン
40H 1FH ●●●●●
41H 11H ●○○○●
42H 15H ●○●○●
43H 17H ●○●●●
44H 15H ●○●○●
45H 11H ●○○○●
46H 1FH ●●●●●
47H 00H ○○○○○
(注4)制御コード
今の所、下記の制御コードに対応します。
制御コード
¥a:07H BEL
¥b:08H BS
¥n:0AH LF(復帰改行)
¥f:0CH FF(復帰改行と同じ)
¥r:0DH CR(復帰)
BEEP音について
使用した基板には下記のポートに圧電スピーカーが接続されています
BEEP1はこのポートから約2KHZのパルスを約100ms出力
出力ポート:RB5
改変する場合、ループ定数等を変更して下さい
MSSPスレーブモード Ver0.2のプログラムについて
これはPIC内蔵MSSPモジュールを使用し、スレーブモードを構成しています。
当局版MSSPスレーブモードVer0.2を使用していますが、MSSPマスタ関数等と違って、これと言ったまとまりがありません。
さらにACM2004制御サブルーチン等をスレーブモードプログラムで呼び出します。
よって、どこからどこまでMSSPスレーブ処理プログラムなのか解りずらいと思います。
基本的に、MSSPスレーブモードと看板を?立てている部署と割り込みルーチン、
そして、LV???と言うラベルの付いた複雑分岐した (^_^;) 部署がMSSPスレーブプログラムです。
このモード動作概要は当局HP内「駄実験室(ソフト)」MSSPプログラムバージョン情報のコーナーをご参照ください。
また、動作詳細はASMソースファイル及びコメントを参照して下さい。
出来るだけ細かくコメントしたつもりです。
LCD直接制御モードの場合、ホストプログラムから送信されてくるI2Cデータは、
基本的に「AQM1602」と同じシークェンスとして処理します。
つまり、1バイトのLCDデータ(文字コード等)やLCDインストラクションコマンドは、
コマンドワードと言う2バイトデータで送信されてきます。
コマンドワードは、コントロールバイトとデータバイトで構成されます。
SC1602版同様にコマンドワードを駆使して全ての関数動作がホスト側プログラムで実現可能ですが・・・
今回はSG12864版と同じ要領でLCD直接制御モードの他に拡張モードを追加してみました。
PIC上にはXC8版同様のACM2004のASM版処理関数群がすでに存在するのに、
これをホスト側関数でLCDのI2C処理版をまた作るのは効率が悪いですし、そもそも面倒クサ。
さて・・・ここで紛らわしいので、LCD処理PICをVCUと勝手に呼ぶ事にしました・・・ (^^♪
VCU内関数をVCU関数と呼ぶ事に。
コントロールバイトにVCU関数呼び出しビットを埋め込み、その後データバイトに追加コマンドやデータを付加するだけで、
だるい処理はVCU関数に行なわせ、ホスト側関数は命令するだけで楽ちん・・・、と言った寸法です。
どうせI2CとLCD処理だけでは、軟弱メモリの16F1828とは言え、メモリスペースがいっぱい余ってますしね。
だらだらとASMソースを追加しましたが、それでも今回は半分弱のメモリしか消費できませんでした・・・
MSSPスレーブモード割り込み処理プログラム
ここはMSSPモジュールによる割込みをすべて処理します。
割込み原因の確認とその受信処理を行いますが、結果は「SLV_FLG」変数の各フラグビットに反映させます。
また、自身のI2Cアドレス受信でBUSY・LEDを点灯、STOP受信で消灯させます。
I2Cアドレス受信割込み、
I2Cデータ受信割込み、
I2C_STOP検出割込み、
以上の3種の割込みを利用し、「SLV_FLG」フラグに動作状況を反映しています。
さらにMSSP受信バッファのデータを「I2C_DATA」に格納します。
MSSPスレーブモード通常処理プログラム
ここは、MSSPの初期化やMSSPレジスタ操作を行います。
管制プログラムから呼び出されます
MSSPスレーブモード管制プログラム(メインプログラム)
ここでは、通常ひたすら「SLV_FLG」フラグのチェックをしてしています。
割り込みルーチンによるフラグの変化を頼りに、受信した「I2Cデータ」の処理を開始し始めます。
「I2Cデータ」とはI2Cバス経由で送受信される1バイトです。
ここでは、受信I2Cデータを「CMD_CTRL」と「CMD_DATA」に分別して使用します。
「CMD_CTRL」と「CMD_DATA」の1ペア(2バイト)を「コマンドワード」とします。
「CMD_CTRL」1つと「CMD_DATA」1つ以上を「コマンドライン」とします。
受信したコマンドワードは、LCDコマンドとLCDデータに分離し、それぞれLCDモジュールに送信します。
受信したコマンドラインはVCU関数として処理します。
必要に応じてMSSPスレーブモード通常サブルーチンも呼び出します
基本設定として、LCDは20桁4行モードで初期設定しています。
このままで良ければ、ホストCPUからは、LCD初期設定は不要です、と言うか変更しない方が良いです。
ホストCPUは本ディスプレイ基板の立ち上がりシーケンス終了まで待つ必要があります。
受信コマンド処理について
1コマンドワードずつ、あるいは1VCU関数ずつ処理します。
LCDコマンドや関数処理中は、ホストCPUをクロックストレッチにて待たせますので悪しからず <m(_ _)m>
特にBEEP音発音中が、手抜きプログラムの為、一番長時間待たせます(100ms位)
ここは改善の余地がありそうです・・・
これはPIC内蔵MSSPモジュールを使用し、スレーブモードを構成しています。
当局版MSSPスレーブモードVer0.2を使用していますが、MSSPマスタ関数等と違って、これと言ったまとまりがありません。
さらにACM2004制御サブルーチン等をスレーブモードプログラムで呼び出します。
よって、どこからどこまでMSSPスレーブ処理プログラムなのか解りずらいと思います。
基本的に、MSSPスレーブモードと看板を?立てている部署と割り込みルーチン、
そして、LV???と言うラベルの付いた複雑分岐した (^_^;) 部署がMSSPスレーブプログラムです。
このモード動作概要は当局HP内「駄実験室(ソフト)」MSSPプログラムバージョン情報のコーナーをご参照ください。
また、動作詳細はASMソースファイル及びコメントを参照して下さい。
出来るだけ細かくコメントしたつもりです。
LCD直接制御モードの場合、ホストプログラムから送信されてくるI2Cデータは、
基本的に「AQM1602」と同じシークェンスとして処理します。
つまり、1バイトのLCDデータ(文字コード等)やLCDインストラクションコマンドは、
コマンドワードと言う2バイトデータで送信されてきます。
コマンドワードは、コントロールバイトとデータバイトで構成されます。
SC1602版同様にコマンドワードを駆使して全ての関数動作がホスト側プログラムで実現可能ですが・・・
今回はSG12864版と同じ要領でLCD直接制御モードの他に拡張モードを追加してみました。
PIC上にはXC8版同様のACM2004のASM版処理関数群がすでに存在するのに、
これをホスト側関数でLCDのI2C処理版をまた作るのは効率が悪いですし、そもそも面倒クサ。
さて・・・ここで紛らわしいので、LCD処理PICをVCUと勝手に呼ぶ事にしました・・・ (^^♪
VCU内関数をVCU関数と呼ぶ事に。
コントロールバイトにVCU関数呼び出しビットを埋め込み、その後データバイトに追加コマンドやデータを付加するだけで、
だるい処理はVCU関数に行なわせ、ホスト側関数は命令するだけで楽ちん・・・、と言った寸法です。
どうせI2CとLCD処理だけでは、軟弱メモリの16F1828とは言え、メモリスペースがいっぱい余ってますしね。
だらだらとASMソースを追加しましたが、それでも今回は半分弱のメモリしか消費できませんでした・・・
MSSPスレーブモード割り込み処理プログラム
ここはMSSPモジュールによる割込みをすべて処理します。
割込み原因の確認とその受信処理を行いますが、結果は「SLV_FLG」変数の各フラグビットに反映させます。
また、自身のI2Cアドレス受信でBUSY・LEDを点灯、STOP受信で消灯させます。
I2Cアドレス受信割込み、
I2Cデータ受信割込み、
I2C_STOP検出割込み、
以上の3種の割込みを利用し、「SLV_FLG」フラグに動作状況を反映しています。
さらにMSSP受信バッファのデータを「I2C_DATA」に格納します。
MSSPスレーブモード通常処理プログラム
ここは、MSSPの初期化やMSSPレジスタ操作を行います。
管制プログラムから呼び出されます
MSSPスレーブモード管制プログラム(メインプログラム)
ここでは、通常ひたすら「SLV_FLG」フラグのチェックをしてしています。
割り込みルーチンによるフラグの変化を頼りに、受信した「I2Cデータ」の処理を開始し始めます。
「I2Cデータ」とはI2Cバス経由で送受信される1バイトです。
ここでは、受信I2Cデータを「CMD_CTRL」と「CMD_DATA」に分別して使用します。
「CMD_CTRL」と「CMD_DATA」の1ペア(2バイト)を「コマンドワード」とします。
「CMD_CTRL」1つと「CMD_DATA」1つ以上を「コマンドライン」とします。
受信したコマンドワードは、LCDコマンドとLCDデータに分離し、それぞれLCDモジュールに送信します。
受信したコマンドラインはVCU関数として処理します。
必要に応じてMSSPスレーブモード通常サブルーチンも呼び出します
基本設定として、LCDは20桁4行モードで初期設定しています。
このままで良ければ、ホストCPUからは、LCD初期設定は不要です、と言うか変更しない方が良いです。
ホストCPUは本ディスプレイ基板の立ち上がりシーケンス終了まで待つ必要があります。
受信コマンド処理について
1コマンドワードずつ、あるいは1VCU関数ずつ処理します。
LCDコマンドや関数処理中は、ホストCPUをクロックストレッチにて待たせますので悪しからず <m(_ _)m>
特にBEEP音発音中が、手抜きプログラムの為、一番長時間待たせます(100ms位)
ここは改善の余地がありそうです・・・
ホストCPU側(PICキット等)からの本器へのアクセスについて
ホスト側CPUから見ると、LCD内部レジスタに直接伝わるコマンドと、VCU関数呼び出しコマンドが存在します。
どちらもホスト側関数からは、I2C関数を使用して必要なコマンドとデータを送り、場合によっては受信します。
基本的な関数内プログラムは、どちらもほぼ同じ簡単な記述で済みます。
(1)概要
VCUに設定されているI2Cアドレスは7CH(7bitアドレスでは3EH)で、AQM1602と同じです。
複数のI2C_LCDモニタを使用する場合は、このアドレスを変更すればOKです。
VCU側ASMソースの「COLDST」の最初、「I2C_ADR」の値を変更して下さい
XC8で構成する場合、当局版MSSPマスターモードVer0.2b以上をインクルードして下さい。
AQM2004側電源投入から2秒以上待ってからアクセス開始して下さい。
(2)VCUとのアクセス
VCUとI2Cバス経由で交信しますが、基本的にコマンドバイトおよびデータバイトの組み合わせで構成します。
LCDへのコマンドおよびデータに関しては、それぞれ1バイトのコマンドワードで構成されています。
VCU関数を使用する場合はコマンドバイトに関数番号、データバイトに関数引値を代入して呼び出します。
XC8でのプログラミングの場合、用意された関数を使用する限り、ここの解説は不要です。
(3)LCDのI2C経由直接制御モード
このモードではVCUはホストCPUとLCDとのI2Cによる仲介をしているだけです。
AQM1602とほぼ同じ、当局版SC1602_I2Cと同じ構成です。
よって、XC8版AQM1602v2ライブラリ関数でもとりあえず動作すると思います(実験してないけど・・・)
桁・行が違うけど、ほぼ同じプログラムです。
コマンドバイト(CMD_CTRL)+データバイト(CMD_DATA)の2バイト「コマンドワード」で制御します
1)コマンドバイト(CMD_CTRL)
bit7:CO bit=1で連続コマンドワード、bit=0で最終コマンドワード
bit6:RS bit=1でLCDデータレジスタ選択、bit=0でLCDデータレジスタ選択
bit5-0:常に0
2)データバイト(CMD_DATA)
RS=1の場合
CMD_DATA=00H~FFHが送信されると事前指定のLCDメモリアドレスに書き込まれます
RS=0の場合
CMD_DATA=00H~3FHが各種LCDインストラクション・コードとなります。
ここは変更せず、初期設定値で使用される事をおすすめします <m(__)m>
CMD_DATA=40H~7FHがCGRAMアドレス指定コードとなります。
CMD_DATA=80H~E7HがDDRAMアドレス指定コードとなります。
(4)VCU関数モード
このモードではVCUはホストCPUの命令で自身の内蔵関数を実行します。
ホストCPUはコマンドバイトに関数番号、データバイトに関数引き値を代入して送信します。
XC8版ACM2004ライブラリとほぼ同じ関数が存在しますが、VCU関数としてリンクされているのは、
処理が重いか特殊な関数のみです。
コマンドバイト(CMD_CTRL)+単・複数のデータバイト(CMD_DATA)の「コマンドライン」で制御します
1)コマンドバイト(CMD_CTRL)
bit7:CO bit=1で連続コマンドライン、bit=0で最終コマンドライン
bit6:RS 見てない
bit5:CPU bit=1でVCU関数呼び出しモードとなります、bit=0でLCD直接制御モード
bit4-0:00H~1FHのVCU関数番号
2)データバイト(CMD_DATA)
指定関数の引数で00H~FFHの1バイト。
データの意味や必要バイト数は関数によって違う
(5)VCU関数番号
引き値とはCMD_DATAの事で、たいがい1つだが複数の場合もある
戻し値とはVCUからの返信データの事で、今の所1バイトのみですが複数バイトも可能です。
戻し値がある場合、関数呼び出し後、I2C受信体制に入る必要があります。
記載の関数名はVCU側の問題で大した意味はありません、ホスト側では番号のみで指定します。
番号や機能は、今後の改善時に変更されるかもしれません
00H:予約
01H:SEND_STATUS 各種ステータスやレジスタ値をホストに返信
引き値:00H VCUバージョン情報
01H LCDステータスレジスタ値
02H VCU内VRAMレジスタ現在値
10H VCU内SREG0レジスタ値
11H VCU内SREG1レジスタ値
12H VCU内LREG0レジスタ値
13H VCU内LREG1レジスタ値
14H VCU内LREG2レジスタ値
15H VCU内LREG3レジスタ値
戻し値:引き値で指定した1バイトデータ
02H:CLRLCD LCD画面をクリアする
引き値:00H オールクリア、VRAM=0
01H 1行目クリア、VRAM=0
02H 2行目クリア、VRAM=20
10H 3行目クリア、VRAM=40
11H 4行目クリア、VRAM=60
戻し値:無し
03H:SET_VRAM VCU内VRAMレジスタに値をセット
引き値:00H~4FH
戻し値:無し
04H:VRAM_ADR VCU内VRAMアドレスとLCD内DDRAMアドレスとを同期させる
引き値:00H~4FH
戻し値:無し
05H:WRITE_CHAR 引き値の文字コードを処理する、位置はVRAM値
引き値:00H~FFH 文字コード
戻し値:無し
06H:BEEP 指定のBEEP音を発生させる
引き値:00H BEEP1
01H BEEP2
戻し値:無し
07H:CURSOR カーソル表示ON/OFF
引き値:00H CURSOR OFF
01H CURSOR ON、アンダーバー表示とブリンクをする
戻し値:無し
0DH:RECV_SREG VCU内共用レジスタ、SREG0とSREG1にホストから連続受信
引き値1:SREG0 00H~FFH
引き値2:SREG1 00H~FFH
戻し値:無し
0EH:RECV_LREG VCU内共用レジスタ、LREG0~LREG3にホストから連続受信
引き値1:LREG0 00H~FFH
引き値2:LREG1 00H~FFH
引き値3:LREG2 00H~FFH
引き値4:LREG3 00H~FFH
戻し値:無し
10H:LNBSLR 指定行目最右側に文字を表示、既存文字は左右指定側へスクロールします。
引き値1:00H~FFH
引き値2:左右側および行番号指定
bti7=1:右スクロール
bit7=0:左スクロール
bit6-0:行番号
00H:1行目
01H:2行目
02H:3行目
03H:4行目
戻し値:無し
11H:LXBSL 指定区間枠の最右側に文字を表示、既存文字は左スクロールします。
引き値:00H~FEH 表示文字コード
FFH 区間枠指定データの取り込み命令、1度行うと専用レジスタに保存される
区間枠始点:SREG0レジスタ
区間枠終点:SREG1レジスタ
※事前にSREGxレジスタにデータを設定しておく必要がある
戻し値:無し
12H:LXBSR 指定区間枠の最左側に文字を表示、既存文字は右スクロールします。
引き値:00H~FEH 表示文字コード
FFH 区間枠指定データの取り込み命令、1度行うと専用レジスタに保存される
区間枠始点:SREG0レジスタ
区間枠終点:SREG1レジスタ
※事前にSREGxレジスタにデータを設定しておく必要がある
戻し値:無し
ホスト側CPUから見ると、LCD内部レジスタに直接伝わるコマンドと、VCU関数呼び出しコマンドが存在します。
どちらもホスト側関数からは、I2C関数を使用して必要なコマンドとデータを送り、場合によっては受信します。
基本的な関数内プログラムは、どちらもほぼ同じ簡単な記述で済みます。
(1)概要
VCUに設定されているI2Cアドレスは7CH(7bitアドレスでは3EH)で、AQM1602と同じです。
複数のI2C_LCDモニタを使用する場合は、このアドレスを変更すればOKです。
VCU側ASMソースの「COLDST」の最初、「I2C_ADR」の値を変更して下さい
XC8で構成する場合、当局版MSSPマスターモードVer0.2b以上をインクルードして下さい。
AQM2004側電源投入から2秒以上待ってからアクセス開始して下さい。
(2)VCUとのアクセス
VCUとI2Cバス経由で交信しますが、基本的にコマンドバイトおよびデータバイトの組み合わせで構成します。
LCDへのコマンドおよびデータに関しては、それぞれ1バイトのコマンドワードで構成されています。
VCU関数を使用する場合はコマンドバイトに関数番号、データバイトに関数引値を代入して呼び出します。
XC8でのプログラミングの場合、用意された関数を使用する限り、ここの解説は不要です。
(3)LCDのI2C経由直接制御モード
このモードではVCUはホストCPUとLCDとのI2Cによる仲介をしているだけです。
AQM1602とほぼ同じ、当局版SC1602_I2Cと同じ構成です。
よって、XC8版AQM1602v2ライブラリ関数でもとりあえず動作すると思います(実験してないけど・・・)
桁・行が違うけど、ほぼ同じプログラムです。
コマンドバイト(CMD_CTRL)+データバイト(CMD_DATA)の2バイト「コマンドワード」で制御します
1)コマンドバイト(CMD_CTRL)
bit7:CO bit=1で連続コマンドワード、bit=0で最終コマンドワード
bit6:RS bit=1でLCDデータレジスタ選択、bit=0でLCDデータレジスタ選択
bit5-0:常に0
2)データバイト(CMD_DATA)
RS=1の場合
CMD_DATA=00H~FFHが送信されると事前指定のLCDメモリアドレスに書き込まれます
RS=0の場合
CMD_DATA=00H~3FHが各種LCDインストラクション・コードとなります。
ここは変更せず、初期設定値で使用される事をおすすめします <m(__)m>
CMD_DATA=40H~7FHがCGRAMアドレス指定コードとなります。
CMD_DATA=80H~E7HがDDRAMアドレス指定コードとなります。
(4)VCU関数モード
このモードではVCUはホストCPUの命令で自身の内蔵関数を実行します。
ホストCPUはコマンドバイトに関数番号、データバイトに関数引き値を代入して送信します。
XC8版ACM2004ライブラリとほぼ同じ関数が存在しますが、VCU関数としてリンクされているのは、
処理が重いか特殊な関数のみです。
コマンドバイト(CMD_CTRL)+単・複数のデータバイト(CMD_DATA)の「コマンドライン」で制御します
1)コマンドバイト(CMD_CTRL)
bit7:CO bit=1で連続コマンドライン、bit=0で最終コマンドライン
bit6:RS 見てない
bit5:CPU bit=1でVCU関数呼び出しモードとなります、bit=0でLCD直接制御モード
bit4-0:00H~1FHのVCU関数番号
2)データバイト(CMD_DATA)
指定関数の引数で00H~FFHの1バイト。
データの意味や必要バイト数は関数によって違う
(5)VCU関数番号
引き値とはCMD_DATAの事で、たいがい1つだが複数の場合もある
戻し値とはVCUからの返信データの事で、今の所1バイトのみですが複数バイトも可能です。
戻し値がある場合、関数呼び出し後、I2C受信体制に入る必要があります。
記載の関数名はVCU側の問題で大した意味はありません、ホスト側では番号のみで指定します。
番号や機能は、今後の改善時に変更されるかもしれません
00H:予約
01H:SEND_STATUS 各種ステータスやレジスタ値をホストに返信
引き値:00H VCUバージョン情報
01H LCDステータスレジスタ値
02H VCU内VRAMレジスタ現在値
10H VCU内SREG0レジスタ値
11H VCU内SREG1レジスタ値
12H VCU内LREG0レジスタ値
13H VCU内LREG1レジスタ値
14H VCU内LREG2レジスタ値
15H VCU内LREG3レジスタ値
戻し値:引き値で指定した1バイトデータ
02H:CLRLCD LCD画面をクリアする
引き値:00H オールクリア、VRAM=0
01H 1行目クリア、VRAM=0
02H 2行目クリア、VRAM=20
10H 3行目クリア、VRAM=40
11H 4行目クリア、VRAM=60
戻し値:無し
03H:SET_VRAM VCU内VRAMレジスタに値をセット
引き値:00H~4FH
戻し値:無し
04H:VRAM_ADR VCU内VRAMアドレスとLCD内DDRAMアドレスとを同期させる
引き値:00H~4FH
戻し値:無し
05H:WRITE_CHAR 引き値の文字コードを処理する、位置はVRAM値
引き値:00H~FFH 文字コード
戻し値:無し
06H:BEEP 指定のBEEP音を発生させる
引き値:00H BEEP1
01H BEEP2
戻し値:無し
07H:CURSOR カーソル表示ON/OFF
引き値:00H CURSOR OFF
01H CURSOR ON、アンダーバー表示とブリンクをする
戻し値:無し
0DH:RECV_SREG VCU内共用レジスタ、SREG0とSREG1にホストから連続受信
引き値1:SREG0 00H~FFH
引き値2:SREG1 00H~FFH
戻し値:無し
0EH:RECV_LREG VCU内共用レジスタ、LREG0~LREG3にホストから連続受信
引き値1:LREG0 00H~FFH
引き値2:LREG1 00H~FFH
引き値3:LREG2 00H~FFH
引き値4:LREG3 00H~FFH
戻し値:無し
10H:LNBSLR 指定行目最右側に文字を表示、既存文字は左右指定側へスクロールします。
引き値1:00H~FFH
引き値2:左右側および行番号指定
bti7=1:右スクロール
bit7=0:左スクロール
bit6-0:行番号
00H:1行目
01H:2行目
02H:3行目
03H:4行目
戻し値:無し
11H:LXBSL 指定区間枠の最右側に文字を表示、既存文字は左スクロールします。
引き値:00H~FEH 表示文字コード
FFH 区間枠指定データの取り込み命令、1度行うと専用レジスタに保存される
区間枠始点:SREG0レジスタ
区間枠終点:SREG1レジスタ
※事前にSREGxレジスタにデータを設定しておく必要がある
戻し値:無し
12H:LXBSR 指定区間枠の最左側に文字を表示、既存文字は右スクロールします。
引き値:00H~FEH 表示文字コード
FFH 区間枠指定データの取り込み命令、1度行うと専用レジスタに保存される
区間枠始点:SREG0レジスタ
区間枠終点:SREG1レジスタ
※事前にSREGxレジスタにデータを設定しておく必要がある
戻し値:無し
↑ ケース側面
画像左から、
電源ピン
I2Cバス用ピン
ICSP用ピン
↑ 試運転中
AQM2004制御関数群
AQM2004v1.h
AQM2004v1.c
MSSP02b.h
MSSP02b.c
AQM2004ディスプレイ 使用方法
XC8で使用する事を想定していますが、もちろんASMでも使用可能です。
基本的にはAQM1602の操作方法に準拠した制御方法です。
実際の使用方法は、ホスト側CPUである、左記PICキット基板のデモプログラムのソースファイルをご参照ください。
ここではホスト側XC8用制御関数群を記します。
AQM2004制御関数群
(1)VCU関数を呼び出す関数群
1)AQM_PUTL(unsigned char 引数1、unsiged char 引数2)
引数2から始まるアドレスから文字列を表示します。
printf()を使用しない時の代替え関数だが、整列機能等は無い
メモリの少ないPICでも使用できます
引数1:表示文字コード格納配列アドレス
引数2:表示する文字列先頭VRAMアドレス(注1)
戻値:無
2)AQM_LNBSLR(unsigned char 引数1、unsigned char 引数2)
指定行目の左右指定反対側シフト(4行20文字モードのみ有効)
引数1のデータを指定側末に1文字表示
表示開始位置は指定できなく、固定位置
既存の表示データは指定側方向にスクロールされる
最指定側のデータは破棄される
引数1:文字コード
引数2:動作指令
bit7=1:右スクロール指定
bit7=0:左スクロール指定
bit6-0:行指定
0:1行目
1:2行目
2:3行目
3:4行目
戻値:無
3)AQM_LXBSL(unsigned char 引数)
指定区間左シフト
指定区間の最右側に引数の文字を表示(表示開始位置)
その区間にあった既存文字列は左にスクロール
スクロールは停止位置までで、最左側の文字は破棄される
引数:文字コード
ただし、FFHだけはコマンドと見なし、
下記共用レジスタから指定区間アドレスを取り込む
1度取り込むと再度コマンドを受け取るまで保持される
SREG0:区間開始VRAMアドレス
SREG1:区間停止VRAMアドレス
区間停止>区間開始の必要がある
戻値:無
4)AQM_LXBSR(unsigned char 引数)
指定区間右シフト
指定区間の最左側に引数の文字を表示(表示開始位置)
その区間にあった既存文字列は右にスクロール
スクロールは停止位置までで、最右側の文字は破棄される
引数:文字コード
ただし、FFHだけはコマンドと見なし、
下記共用レジスタから指定区間アドレスを取り込む
1度取り込むと再度コマンドを受け取るまで保持される
SREG0:区間開始VRAMアドレス
SREG1:区間停止VRAMアドレス
区間停止>区間開始の必要がある
戻値:無
5)SEND_SREG(unsigned char 引数1、unsiged char 引数2)
VCU内共用レジスタにデータを転送します
引数1:SREG0
引数2:SREG1
戻値:無
5)SEND_LREG(unsigned char 引数1、unsiged char 引数2、
unsigned char 引数3、unsigned 引数4)
VCU内共用レジスタにデータを転送します
引数1:LREG0
引数2:LREG1
引数3:LREG2
引数4:LREG3
戻値:無
6)SET_VRAM(unsigned char 引数)
VCU内VRAMレジスタにデータを転送します
引数:00H~4FH
戻値:無
7)VRAM_ADR(unsigned char 引数)
VCU内VRAMレジスタにデータを設定、DDRAMと同期します
引数:00H~4FH
戻値:無
8)AQM_WRTD(unsigned char 引数)
LCD画面のVRAMアドレスに1文字表示
VCUのVRAMアドレスは事前に設定
VRAMアドレスはVCU関数側でインクリメントされる
1行目が溢れた場合、次の行の先頭(最左側)から続けて表示される
4行目が溢れた場合、表示文字は上スクロールされ、
4行の先頭(最左側)から続けて表示される
printf関数の低レベル関数には、この関数を指定する
対応可能制御コード
¥a:BEL
¥b:BS(バックスペース)
¥n:LF(復帰改行)
¥f:FF(復帰改行と同じ)
¥r:CR(復帰)
引数:文字コード
戻値:無
9)AQM_CLRLCD(unsigned char 引数)
LCD画面クリア
引数:機能指定
00H:全画面クリア VRAM=0
01H:1行目クリア VRAM=0
02H:2行目クリア VRAM=20
03H:3行目クリア VRAM=40
04H:4行目クリア VRAM=60
戻値:無
10)unsigned char AQM_STATUS(unsigned char 引数)
指定の情報を1バイト読み込む
引数:読み込む情報を指定
00H:VCUバージョン情報
01H:LCDステータスレジスタ値
02H:VCU内部VRAM
03H:VRAMアドレスで指定するLCDデータ
10H:SREG0レジスタ値
11H:SREG1レジスタ値
12H:LREG0レジスタ値
13H:LREG1レジスタ値
14H:LREG2レジスタ値
15H:LREG3レジスタ値
戻値:符号無し8bitデータ
(2)直接LCDと通信を行う関数群
VCU側関数の管理とは別動作となります
11)AQM_PUTC(unsigned char 引数1,unsigned char 引数2)
指定の表示位置に1文字を表示します
引数1:文字コード
引数2:表示位置VRAMアドレス(注1)
戻値:無
12)unsigned char AQM_GETC(unsigned char 引数)
指定の表示位置の文字コードを取得します
引数:表示位置VRAMアドレス(注1)
戻値:文字コード
13)AQM_CMD(unsigned char 引数)
LCDにインストラクションコードを送信
引数:LCDコマンド
戻値:無
14)AQM_DAT(unsigned char 引数)
LCDのDDRAMにデータを送信
引数:文字コード
戻値:無
15)unsigned char AQM_READM(unsigned char 引数)
LCD内のメモリデータを取得します
引数:DDRAM/CGRAMアドレス
戻値:文字コード/外字データ
16)AQM_PUTG
(unsigned char 引数1,unsigned char 引数2)
指定の文字コードのCGRAMに1文字分データ(注3)を書き込みます
引数1:外字領域文字コード(00H~07H)
引数2:8バイトのグラフィックデータ格納配列アドレス
戻値:無
17)AQM_WRTG
(unsigned char 引数1,unsigned char 引数2)
指定のCGRAMアドレス(注2)にデータ(注3)を書き込みます
引数1:CGRAMアドレス
引数2:1ライン(8bit)分のグラフィックデータ
戻値:無
XC8で使用する事を想定していますが、もちろんASMでも使用可能です。
基本的にはAQM1602の操作方法に準拠した制御方法です。
実際の使用方法は、ホスト側CPUである、左記PICキット基板のデモプログラムのソースファイルをご参照ください。
ここではホスト側XC8用制御関数群を記します。
AQM2004制御関数群
(1)VCU関数を呼び出す関数群
1)AQM_PUTL(unsigned char 引数1、unsiged char 引数2)
引数2から始まるアドレスから文字列を表示します。
printf()を使用しない時の代替え関数だが、整列機能等は無い
メモリの少ないPICでも使用できます
引数1:表示文字コード格納配列アドレス
引数2:表示する文字列先頭VRAMアドレス(注1)
戻値:無
2)AQM_LNBSLR(unsigned char 引数1、unsigned char 引数2)
指定行目の左右指定反対側シフト(4行20文字モードのみ有効)
引数1のデータを指定側末に1文字表示
表示開始位置は指定できなく、固定位置
既存の表示データは指定側方向にスクロールされる
最指定側のデータは破棄される
引数1:文字コード
引数2:動作指令
bit7=1:右スクロール指定
bit7=0:左スクロール指定
bit6-0:行指定
0:1行目
1:2行目
2:3行目
3:4行目
戻値:無
3)AQM_LXBSL(unsigned char 引数)
指定区間左シフト
指定区間の最右側に引数の文字を表示(表示開始位置)
その区間にあった既存文字列は左にスクロール
スクロールは停止位置までで、最左側の文字は破棄される
引数:文字コード
ただし、FFHだけはコマンドと見なし、
下記共用レジスタから指定区間アドレスを取り込む
1度取り込むと再度コマンドを受け取るまで保持される
SREG0:区間開始VRAMアドレス
SREG1:区間停止VRAMアドレス
区間停止>区間開始の必要がある
戻値:無
4)AQM_LXBSR(unsigned char 引数)
指定区間右シフト
指定区間の最左側に引数の文字を表示(表示開始位置)
その区間にあった既存文字列は右にスクロール
スクロールは停止位置までで、最右側の文字は破棄される
引数:文字コード
ただし、FFHだけはコマンドと見なし、
下記共用レジスタから指定区間アドレスを取り込む
1度取り込むと再度コマンドを受け取るまで保持される
SREG0:区間開始VRAMアドレス
SREG1:区間停止VRAMアドレス
区間停止>区間開始の必要がある
戻値:無
5)SEND_SREG(unsigned char 引数1、unsiged char 引数2)
VCU内共用レジスタにデータを転送します
引数1:SREG0
引数2:SREG1
戻値:無
5)SEND_LREG(unsigned char 引数1、unsiged char 引数2、
unsigned char 引数3、unsigned 引数4)
VCU内共用レジスタにデータを転送します
引数1:LREG0
引数2:LREG1
引数3:LREG2
引数4:LREG3
戻値:無
6)SET_VRAM(unsigned char 引数)
VCU内VRAMレジスタにデータを転送します
引数:00H~4FH
戻値:無
7)VRAM_ADR(unsigned char 引数)
VCU内VRAMレジスタにデータを設定、DDRAMと同期します
引数:00H~4FH
戻値:無
8)AQM_WRTD(unsigned char 引数)
LCD画面のVRAMアドレスに1文字表示
VCUのVRAMアドレスは事前に設定
VRAMアドレスはVCU関数側でインクリメントされる
1行目が溢れた場合、次の行の先頭(最左側)から続けて表示される
4行目が溢れた場合、表示文字は上スクロールされ、
4行の先頭(最左側)から続けて表示される
printf関数の低レベル関数には、この関数を指定する
対応可能制御コード
¥a:BEL
¥b:BS(バックスペース)
¥n:LF(復帰改行)
¥f:FF(復帰改行と同じ)
¥r:CR(復帰)
引数:文字コード
戻値:無
9)AQM_CLRLCD(unsigned char 引数)
LCD画面クリア
引数:機能指定
00H:全画面クリア VRAM=0
01H:1行目クリア VRAM=0
02H:2行目クリア VRAM=20
03H:3行目クリア VRAM=40
04H:4行目クリア VRAM=60
戻値:無
10)unsigned char AQM_STATUS(unsigned char 引数)
指定の情報を1バイト読み込む
引数:読み込む情報を指定
00H:VCUバージョン情報
01H:LCDステータスレジスタ値
02H:VCU内部VRAM
03H:VRAMアドレスで指定するLCDデータ
10H:SREG0レジスタ値
11H:SREG1レジスタ値
12H:LREG0レジスタ値
13H:LREG1レジスタ値
14H:LREG2レジスタ値
15H:LREG3レジスタ値
戻値:符号無し8bitデータ
(2)直接LCDと通信を行う関数群
VCU側関数の管理とは別動作となります
11)AQM_PUTC(unsigned char 引数1,unsigned char 引数2)
指定の表示位置に1文字を表示します
引数1:文字コード
引数2:表示位置VRAMアドレス(注1)
戻値:無
12)unsigned char AQM_GETC(unsigned char 引数)
指定の表示位置の文字コードを取得します
引数:表示位置VRAMアドレス(注1)
戻値:文字コード
13)AQM_CMD(unsigned char 引数)
LCDにインストラクションコードを送信
引数:LCDコマンド
戻値:無
14)AQM_DAT(unsigned char 引数)
LCDのDDRAMにデータを送信
引数:文字コード
戻値:無
15)unsigned char AQM_READM(unsigned char 引数)
LCD内のメモリデータを取得します
引数:DDRAM/CGRAMアドレス
戻値:文字コード/外字データ
16)AQM_PUTG
(unsigned char 引数1,unsigned char 引数2)
指定の文字コードのCGRAMに1文字分データ(注3)を書き込みます
引数1:外字領域文字コード(00H~07H)
引数2:8バイトのグラフィックデータ格納配列アドレス
戻値:無
17)AQM_WRTG
(unsigned char 引数1,unsigned char 引数2)
指定のCGRAMアドレス(注2)にデータ(注3)を書き込みます
引数1:CGRAMアドレス
引数2:1ライン(8bit)分のグラフィックデータ
戻値:無
感想
程良い操作性と広い画面で、使い易いLCDモニタになったと思います。(当局比)
製作コストも低く簡単な回路ですが配線が多いのがちょっと面倒・・・
作ってしまえば各局様のPICライフに役に立ってくれると期待しています。
無線用途でも、周波数表示、RIT表示、モード表示やレベルメータ等、
色々使えそうです。
さらにバックライトを点灯しても消費電流が少ないのは大きなポイントです。
カーソル表示ONにすると、CP/MやDOSが動作しているような感覚になり、キーボードを接続、文字入力したくなります・・・
内蔵PICのプログラムは、作っていて結構面白かったので、少しずつ改善していきたいと思っています。
しかしI2Cバスは便利で面白いですね。
当局版I2C関数もVer0.2止まりですが・・・ (^_^;)
こんな未完成なプログラムでも応用範囲が広く、益々楽しめそうです。
所で・・・本家AQM1602はジャンク箱でホコリを被っています・・・
VCUプログラム及びホスト側関数の変更・改善は、このページに追記していきます。
2020年03月 JA0QON
デモ・プログラム
送受信を使用した関数の実行
外字登録とその外字の表示
使用基板はPICキット14ピンCPU基板
使用PICは16F18326です
I2Cバスは、
RC0=SCL
RC1=SDA
と、いつもと同じ構成になっています。
程良い操作性と広い画面で、使い易いLCDモニタになったと思います。(当局比)
製作コストも低く簡単な回路ですが配線が多いのがちょっと面倒・・・
作ってしまえば各局様のPICライフに役に立ってくれると期待しています。
無線用途でも、周波数表示、RIT表示、モード表示やレベルメータ等、
色々使えそうです。
さらにバックライトを点灯しても消費電流が少ないのは大きなポイントです。
カーソル表示ONにすると、CP/MやDOSが動作しているような感覚になり、キーボードを接続、文字入力したくなります・・・
内蔵PICのプログラムは、作っていて結構面白かったので、少しずつ改善していきたいと思っています。
しかしI2Cバスは便利で面白いですね。
当局版I2C関数もVer0.2止まりですが・・・ (^_^;)
こんな未完成なプログラムでも応用範囲が広く、益々楽しめそうです。
所で・・・本家AQM1602はジャンク箱でホコリを被っています・・・
VCUプログラム及びホスト側関数の変更・改善は、このページに追記していきます。
2020年03月 JA0QON
デモ・プログラム
送受信を使用した関数の実行
外字登録とその外字の表示
使用基板はPICキット14ピンCPU基板
使用PICは16F18326です
I2Cバスは、
RC0=SCL
RC1=SDA
と、いつもと同じ構成になっています。