初めての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モジュール
アッセンブラ版
AQM1602制御ルーチン Ver1.0

 AQM1602v1.asm


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行表示の普通文字です


XC8版
AQM1602制御関数群 Ver1.0


 AQM1602v1.h

 AQM1602v1.c


注意
AQM1602はMSSP関連ファイルを使います

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制御関数群Ver2


 AQM1602v2.h

 AQM1602v2.c
追記 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用となっています
   引数:無
   返値:無





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