XC8用AQM1602の基本制御関数群を作ってみる
初めてのC・・・
はじめてのC~ 君とC~
と言う訳で、当局にとって初めてのC言語プログラミングと言う事になりました・・・
今まではCソースを参考にアッセンブラソースを作成と言う事はちょくちょく行っていましたが、
全くゼロからCソース作成するとなると、話は違います。
実際、今回初めてソースファイルを作ってみましたが、エラー出まくりの一騒動でした・・・
目的は当局HP内の「PICキット」のCソース版を付加しようとの思いからでした。
それでは顛末記をどうぞ・・・ (^_^;)
参考文献
①電子工作のためのPIC16F1ファミリ活用ガイドブック 後閑哲也著 技術評論社
②初心者のためのポイント学習C言語 http://www9.plala.or.jp/sgwr-t/
実験環境
PICキットNO-001:14ピンPIC用CPU基板およびPIC16F1823
PICキットNO-012:AQM1602モジュール
PICキット:LEDモジュール
はじめてのC~ 君とC~
と言う訳で、当局にとって初めてのC言語プログラミングと言う事になりました・・・
今まではCソースを参考にアッセンブラソースを作成と言う事はちょくちょく行っていましたが、
全くゼロからCソース作成するとなると、話は違います。
実際、今回初めてソースファイルを作ってみましたが、エラー出まくりの一騒動でした・・・
目的は当局HP内の「PICキット」のCソース版を付加しようとの思いからでした。
それでは顛末記をどうぞ・・・ (^_^;)
参考文献
①電子工作のためのPIC16F1ファミリ活用ガイドブック 後閑哲也著 技術評論社
②初心者のためのポイント学習C言語 http://www9.plala.or.jp/sgwr-t/
実験環境
PICキットNO-001:14ピンPIC用CPU基板およびPIC16F1823
PICキットNO-012:AQM1602モジュール
PICキット:LEDモジュール
AQM1602アッセンブラ版 Ver1.0
アッセンブラ制御プログラム
PIC内臓モジュールである、MSSP(I2C)を使用します
(1)主な使用変数
a) DSP_ADR : 80H~8FH、C0H~CFH
表示位置アドレスを指定します
1行目の最左側位置は80Hで、最右側位置は8FHとなります。
2行目の最左側位置はC0Hで、最右側位置はCFHとなります。
b) MSADx : 文字列格納アドレス
MSAD0は格納アドレス下位8ビット、MSAD1は上位8ビット
文字列最後にエンドコード00Hが必要です。
(2)主要サブルーチン
a) WRTD
LCDにデータを送信します
引数:Wregの8bitデータ(文字コード)
戻値:無
b) WRTC
LCDにコマンドを送信します
引数:Wregの8bitデータ(LCDコマンド)
戻値:無
c) PUTW
Wレジスタの文字コードをDSP_ADRで指定した位置に表示する
引数:Wregの8bitデータ(文字コード)
DSP_ADRによる表示開始DDRAMアドレス
戻値:無
d) PUTL
MSADxで指定されたアドレスの連続文字データをLCDに表示、
表示位置開始位置はDSP_ADRで指定
表示文字数は最大32文字
引数:文字コード列の格納アドレス
DSP_ADRによる表示開始DDRAMアドレス
戻値:無
e) PUTL1
MSADxで指定されたアドレスの連続文字データをLCD1行目に表示
表示開始位置指定はできず、必ず先頭(最左側)から表示
引数:文字コード列の格納アドレス
戻値:無
f) PUTL2
MSADxで指定されたアドレスの連続文字データをLCD2行目に表示
表示開始位置指定はできず、必ず先頭(最左側)から表示
引数:文字コード列の格納アドレス
戻値:無
e) CLRLCD
全画面を消去
f) INIT5_LCD
AQM1602を初期設定します
VDD5V用で2行表示の普通文字です
g) INIT3_LCD
AQM1602を初期設定します
VDD3.3V用で、2行表示の普通文字です
アッセンブラ制御プログラム
PIC内臓モジュールである、MSSP(I2C)を使用します
(1)主な使用変数
a) DSP_ADR : 80H~8FH、C0H~CFH
表示位置アドレスを指定します
1行目の最左側位置は80Hで、最右側位置は8FHとなります。
2行目の最左側位置はC0Hで、最右側位置はCFHとなります。
b) MSADx : 文字列格納アドレス
MSAD0は格納アドレス下位8ビット、MSAD1は上位8ビット
文字列最後にエンドコード00Hが必要です。
(2)主要サブルーチン
a) WRTD
LCDにデータを送信します
引数:Wregの8bitデータ(文字コード)
戻値:無
b) WRTC
LCDにコマンドを送信します
引数:Wregの8bitデータ(LCDコマンド)
戻値:無
c) PUTW
Wレジスタの文字コードをDSP_ADRで指定した位置に表示する
引数:Wregの8bitデータ(文字コード)
DSP_ADRによる表示開始DDRAMアドレス
戻値:無
d) PUTL
MSADxで指定されたアドレスの連続文字データをLCDに表示、
表示位置開始位置はDSP_ADRで指定
表示文字数は最大32文字
引数:文字コード列の格納アドレス
DSP_ADRによる表示開始DDRAMアドレス
戻値:無
e) PUTL1
MSADxで指定されたアドレスの連続文字データをLCD1行目に表示
表示開始位置指定はできず、必ず先頭(最左側)から表示
引数:文字コード列の格納アドレス
戻値:無
f) PUTL2
MSADxで指定されたアドレスの連続文字データをLCD2行目に表示
表示開始位置指定はできず、必ず先頭(最左側)から表示
引数:文字コード列の格納アドレス
戻値:無
e) CLRLCD
全画面を消去
f) INIT5_LCD
AQM1602を初期設定します
VDD5V用で2行表示の普通文字です
g) INIT3_LCD
AQM1602を初期設定します
VDD3.3V用で、2行表示の普通文字です
MSSP関数群およびAQM1602関数群のXC8への移植
AQM1602はI2Cインターフェイスを使うので、当局版アッセンブラソースを参考にし、それをXCの関数として、そのまま移植してみました。
事実上これらが当局最初のXCプログラムとなりました。
アッセンブラ版は実際動作していると言う事実が唯一の頼りです・・・
まずは新規プロジェクトでCコンパイラを選択して・・・
MPLABXIDEのエディタはCソース記述で真価を発揮するのですね、驚きました・・・
何か違和感無くポンポン記述できます。(書くだけですが・・・)
変数の取扱い、バンクの無意識、ループや分岐等の記述が楽な事・・・
もちろん、ビルドボタンでエラー出まくり、「;」の付け忘れがやたら多い事・・・ (^_^;)
エラー箇所の特定がアッセンブラに比べて極めて解りずらい事・・・
文法等ほとんど無いアッセンブラに慣れると、文法のある言語はいちいち文法エラーで引っ掛かるので、結構イライラします。
一つ間違いがあると、あちこちでエラー発生、何なんでしょうか
まあ、慣れの問題でしょうけど・・・
PCアプリとは違ってマイコンでは楽なアッセンブラ感、と言った使い方だと思われるので、利点を甘受できる様になれれば良いかな。
で、そんな事をしている内に、何故かエラーは消えないが、ビルドが出来・・・ (ーー;)
とりあえずHEXファイルが生成されるまでになりました。
エラーが表示される割には、何故かちゃんと動作するし・・・
これで良いんだろうか不安です・・・
アッセンブラの様な達成感が余り無いのでつまんないのだが・・・
AQM1602制御関数群
1) AQM_INIT5(void)、AQM_INIT3(void)
VDDが5Vと3.3Vの場合のLCDのイニシャライズを行います
AQM_INIT5がVDD=5V用、AQM_INIT3がVDD=3.3V用となっています
引数:無
返値:無
2) AQM_CMD(unsigned char)
LCDコマンドを送信します
引数:8bitのLCDコマンド
返値:無
3) AQM_WRTD(unsigned char)
LCDデータ(文字コード)を送信・表示します
事前に表示開始位置アドレスを送信しておく事が必要です
連続送信しても表示位置はLCD側が自動インクリメントします
printf()等で使用する低レベル関数はこれを指定します
引数:8bitのLCDデータ
返値:無
4) AQM_PUTC(unsigned char1,unsigned char2)
指定の表示位置に1文字を表示します
引数1:文字コード1バイト
引数2:表示位置アドレス1バイト
返値:無
5) AQM_PUTL(unsigned char1配列,unsigned char2)
指定の表示位置から文字列を表示します(最大32文字)
引数1:文字列格納配列アドレス
引数2:表示開始位置アドレス
返値:無
6) AQM_PUTL1(unsigned char配列)
LCD1行目の最左側から文字列を表示(最大16文字)
引数:文字列格納配列アドレス
返値:無
7) AQM_PUTL2(unsigned char配列)
LCD2行目の最左側から文字列を表示(最大16文字)
引数:文字列格納配列アドレス
返値:無
8) AQM_CLRLCD(void)
LCDの表示をクリア
引数:無
返値:無
AQM1602はI2Cインターフェイスを使うので、当局版アッセンブラソースを参考にし、それをXCの関数として、そのまま移植してみました。
事実上これらが当局最初のXCプログラムとなりました。
アッセンブラ版は実際動作していると言う事実が唯一の頼りです・・・
まずは新規プロジェクトでCコンパイラを選択して・・・
MPLABXIDEのエディタはCソース記述で真価を発揮するのですね、驚きました・・・
何か違和感無くポンポン記述できます。(書くだけですが・・・)
変数の取扱い、バンクの無意識、ループや分岐等の記述が楽な事・・・
もちろん、ビルドボタンでエラー出まくり、「;」の付け忘れがやたら多い事・・・ (^_^;)
エラー箇所の特定がアッセンブラに比べて極めて解りずらい事・・・
文法等ほとんど無いアッセンブラに慣れると、文法のある言語はいちいち文法エラーで引っ掛かるので、結構イライラします。
一つ間違いがあると、あちこちでエラー発生、何なんでしょうか
まあ、慣れの問題でしょうけど・・・
PCアプリとは違ってマイコンでは楽なアッセンブラ感、と言った使い方だと思われるので、利点を甘受できる様になれれば良いかな。
で、そんな事をしている内に、何故かエラーは消えないが、ビルドが出来・・・ (ーー;)
とりあえずHEXファイルが生成されるまでになりました。
エラーが表示される割には、何故かちゃんと動作するし・・・
これで良いんだろうか不安です・・・
アッセンブラの様な達成感が余り無いのでつまんないのだが・・・
AQM1602制御関数群
1) AQM_INIT5(void)、AQM_INIT3(void)
VDDが5Vと3.3Vの場合のLCDのイニシャライズを行います
AQM_INIT5がVDD=5V用、AQM_INIT3がVDD=3.3V用となっています
引数:無
返値:無
2) AQM_CMD(unsigned char)
LCDコマンドを送信します
引数:8bitのLCDコマンド
返値:無
3) AQM_WRTD(unsigned char)
LCDデータ(文字コード)を送信・表示します
事前に表示開始位置アドレスを送信しておく事が必要です
連続送信しても表示位置はLCD側が自動インクリメントします
printf()等で使用する低レベル関数はこれを指定します
引数:8bitのLCDデータ
返値:無
4) AQM_PUTC(unsigned char1,unsigned char2)
指定の表示位置に1文字を表示します
引数1:文字コード1バイト
引数2:表示位置アドレス1バイト
返値:無
5) AQM_PUTL(unsigned char1配列,unsigned char2)
指定の表示位置から文字列を表示します(最大32文字)
引数1:文字列格納配列アドレス
引数2:表示開始位置アドレス
返値:無
6) AQM_PUTL1(unsigned char配列)
LCD1行目の最左側から文字列を表示(最大16文字)
引数:文字列格納配列アドレス
返値:無
7) AQM_PUTL2(unsigned char配列)
LCD2行目の最左側から文字列を表示(最大16文字)
引数:文字列格納配列アドレス
返値:無
8) AQM_CLRLCD(void)
LCDの表示をクリア
引数:無
返値:無
追記 2019年11月
XC8版AQM1602関数群の更新を行い、Ver2となりました。
外字登録関数およびその他関数群が追加となっています。
その内、読み込み系関数群はAQM1602では使用できません。
理由はAQM1602がスレーブ送信できないためです。
SC1602_I2Cでは下記すべての関数が使用できます。
関数詳細については「SC1602制御関数」を参照して下さい
AQM1602制御関数群 Ver2
AQM1602/SC1602_I2C 共用関数
1) AQM_PUTC(unsigned char1,unsigned char2)
指定の表示位置に1文字を表示します
引数1:文字コード1バイト
引数2:表示位置DDRAMアドレス1バイト
返値:無
2) AQM_PUTG(unsigned char1,unsigned char2)
外字文字コードに対応したCGRAM領域に8バイト分書き込み
引数1:外字用文字コード1バイト
引数2:1文字分8バイトのビットデータを格納した配列アドレス
返値:無
3) AQM_WRTD(unsigned char)
LCDデータ(文字コード)を送信・表示します
事前に表示開始位置アドレスを送信しておく事が必要です
連続送信しても表示位置はLCD側が自動インクリメントします
printf()等で使用する低レベル関数はこれを指定します
引数:8bitのLCDデータ
返値:無
4) AQM_WRTG(unsigned char1,unsigned char2)
CGRAMアドレスの1バイト分のビットデータを書き込む
PUTCと機能的に同じだが引数の位置が違う
グラフィックはこの方が書きやすい
引数1:CGRAMアドレス
引数2:8bitのCGRAM用ビットデータ
返値:無
5) AQM_PUTC(unsigned char1,unsigned char2)
指定の表示位置に1文字を表示します
引数1:文字コード1バイト
引数2:表示位置アドレス1バイト
返値:無
6) AQM_PUTL(unsigned char1配列,unsigned char2)
指定の表示位置から文字列を表示します(最大32文字)
引数1:文字列格納配列アドレス
引数2:表示開始位置アドレス
返値:無
7) AQM_PUTL1(unsigned char配列)
LCD1行目の最左側から文字列を表示(最大16文字)
引数:文字列格納配列アドレス
返値:無
8) AQM_PUTL2(unsigned char配列)
LCD2行目の最左側から文字列を表示(最大16文字)
引数:文字列格納配列アドレス
返値:無
9) AQM_CMD(unsigned char)
LCDコマンドを送信します
引数:8bitのLCDコマンド
返値:無
10)AQM_CLRLCD(void)
LCDの表示をクリア
引数:無
返値:無
11)AQM_CLRLCD1(void)
LCD1行目の表示をクリア
引数:無
返値:無
12)AQM_CLRLCD2(void)
LCD2行目の表示をクリア
引数:無
返値:無
13)AQM_BLINK_ON(unsigned char)
指定のDDRAMアドレスの文字をブリンクさせます
引数:DDRAMアドレス
返値:無
14)AQM_BLINK_OFF(unsigned char)
指定のDDRAMアドレスの文字ブリンクを終了させます
引数:DDRAMアドレス
返値:無
15)VRAM_ADR(unsigned char)
VRAMアドレスをLCDに設定
引き値が00H-1FHの場合、DDRAMアドレスに変換
引き値が20H以上なら、そのままLCDに送信
つまり、VRAMアドレスを00H-1FHと見立てて、
それをDDRAMアドレスに変換・送信
DDRAMアドレスを指定されていた場合、そのまま送信
引数:LCD表示位置アドレス
返値:無
SC1602_I2Cで有効な関数
16)unsigned char AQM_GETC(unsigned char)
指定のアドレスのLCDデータを読み込みます
引数:8bitのDDRAMアドレスあるいはCGRAMアドレス
返値:文字コードあるいは外字データ1バイト
17)AQM_L1BSL(unsigned char)
1行目左シフト(2行16文字モードのみ有効)
引数のデータを最右側に1文字表示(ここが表示開始位置)
表示開始位置は指定できなく、固定位置
既存の表示データは左側にシフトされる
最左側のデータは破棄される
引数:8bitのLCDデータ(文字コード)
返値:無
18)AQM_L2BSL(unsigned char)
2行目左シフト(2行16文字モードのみ有効)
引数のデータを最右側に1文字表示(ここが表示開始位置)
表示開始位置は指定できなく、固定位置
既存の表示データは左側にシフトされる
最左側のデータは破棄される
引数:8bitのLCDデータ(文字コード)
返値:無
19)AQM_L21BSL(unsigned char1,unsigned char2)
2行目-1行目左シフト(2行16文字モードのみ有効)
引数のデータを2行目最右側に1文字表示(ここが表示開始位置)
既存の表示データは左側にシフトされる
2行目最左側のデータは1行目最右側にシフト
1行目最右側のデータは左側にシフト
左シフトは停止位置までで、それ以降は破棄される
停止位置アドレスは1行目のみ指定可能
引数:8bitのLCDデータ(文字コード)
引数2:スクロール停止位置DDRAMアドレス
返値:無
AQM1602専用関数
20)AQM_INIT5(void)
21)AQM_INIT3(void)
VDDが5Vと3.3Vの場合のLCDのイニシャライズを行います
AQM_INIT5がVDD=5V用、AQM_INIT3がVDD=3.3V用となっています
引数:無
返値:無
XC8版AQM1602関数群の更新を行い、Ver2となりました。
外字登録関数およびその他関数群が追加となっています。
その内、読み込み系関数群はAQM1602では使用できません。
理由はAQM1602がスレーブ送信できないためです。
SC1602_I2Cでは下記すべての関数が使用できます。
関数詳細については「SC1602制御関数」を参照して下さい
AQM1602制御関数群 Ver2
AQM1602/SC1602_I2C 共用関数
1) AQM_PUTC(unsigned char1,unsigned char2)
指定の表示位置に1文字を表示します
引数1:文字コード1バイト
引数2:表示位置DDRAMアドレス1バイト
返値:無
2) AQM_PUTG(unsigned char1,unsigned char2)
外字文字コードに対応したCGRAM領域に8バイト分書き込み
引数1:外字用文字コード1バイト
引数2:1文字分8バイトのビットデータを格納した配列アドレス
返値:無
3) AQM_WRTD(unsigned char)
LCDデータ(文字コード)を送信・表示します
事前に表示開始位置アドレスを送信しておく事が必要です
連続送信しても表示位置はLCD側が自動インクリメントします
printf()等で使用する低レベル関数はこれを指定します
引数:8bitのLCDデータ
返値:無
4) AQM_WRTG(unsigned char1,unsigned char2)
CGRAMアドレスの1バイト分のビットデータを書き込む
PUTCと機能的に同じだが引数の位置が違う
グラフィックはこの方が書きやすい
引数1:CGRAMアドレス
引数2:8bitのCGRAM用ビットデータ
返値:無
5) AQM_PUTC(unsigned char1,unsigned char2)
指定の表示位置に1文字を表示します
引数1:文字コード1バイト
引数2:表示位置アドレス1バイト
返値:無
6) AQM_PUTL(unsigned char1配列,unsigned char2)
指定の表示位置から文字列を表示します(最大32文字)
引数1:文字列格納配列アドレス
引数2:表示開始位置アドレス
返値:無
7) AQM_PUTL1(unsigned char配列)
LCD1行目の最左側から文字列を表示(最大16文字)
引数:文字列格納配列アドレス
返値:無
8) AQM_PUTL2(unsigned char配列)
LCD2行目の最左側から文字列を表示(最大16文字)
引数:文字列格納配列アドレス
返値:無
9) AQM_CMD(unsigned char)
LCDコマンドを送信します
引数:8bitのLCDコマンド
返値:無
10)AQM_CLRLCD(void)
LCDの表示をクリア
引数:無
返値:無
11)AQM_CLRLCD1(void)
LCD1行目の表示をクリア
引数:無
返値:無
12)AQM_CLRLCD2(void)
LCD2行目の表示をクリア
引数:無
返値:無
13)AQM_BLINK_ON(unsigned char)
指定のDDRAMアドレスの文字をブリンクさせます
引数:DDRAMアドレス
返値:無
14)AQM_BLINK_OFF(unsigned char)
指定のDDRAMアドレスの文字ブリンクを終了させます
引数:DDRAMアドレス
返値:無
15)VRAM_ADR(unsigned char)
VRAMアドレスをLCDに設定
引き値が00H-1FHの場合、DDRAMアドレスに変換
引き値が20H以上なら、そのままLCDに送信
つまり、VRAMアドレスを00H-1FHと見立てて、
それをDDRAMアドレスに変換・送信
DDRAMアドレスを指定されていた場合、そのまま送信
引数:LCD表示位置アドレス
返値:無
SC1602_I2Cで有効な関数
16)unsigned char AQM_GETC(unsigned char)
指定のアドレスのLCDデータを読み込みます
引数:8bitのDDRAMアドレスあるいはCGRAMアドレス
返値:文字コードあるいは外字データ1バイト
17)AQM_L1BSL(unsigned char)
1行目左シフト(2行16文字モードのみ有効)
引数のデータを最右側に1文字表示(ここが表示開始位置)
表示開始位置は指定できなく、固定位置
既存の表示データは左側にシフトされる
最左側のデータは破棄される
引数:8bitのLCDデータ(文字コード)
返値:無
18)AQM_L2BSL(unsigned char)
2行目左シフト(2行16文字モードのみ有効)
引数のデータを最右側に1文字表示(ここが表示開始位置)
表示開始位置は指定できなく、固定位置
既存の表示データは左側にシフトされる
最左側のデータは破棄される
引数:8bitのLCDデータ(文字コード)
返値:無
19)AQM_L21BSL(unsigned char1,unsigned char2)
2行目-1行目左シフト(2行16文字モードのみ有効)
引数のデータを2行目最右側に1文字表示(ここが表示開始位置)
既存の表示データは左側にシフトされる
2行目最左側のデータは1行目最右側にシフト
1行目最右側のデータは左側にシフト
左シフトは停止位置までで、それ以降は破棄される
停止位置アドレスは1行目のみ指定可能
引数:8bitのLCDデータ(文字コード)
引数2:スクロール停止位置DDRAMアドレス
返値:無
AQM1602専用関数
20)AQM_INIT5(void)
21)AQM_INIT3(void)
VDDが5Vと3.3Vの場合のLCDのイニシャライズを行います
AQM_INIT5がVDD=5V用、AQM_INIT3がVDD=3.3V用となっています
引数:無
返値:無