↑上がACM2004
 下がSC1602
画面が広く省電力なACM2004 XC8ライブラリの作成

配線が面倒くさいのは変わらないですが、SC1602より表示文字が格段に多くなりバックライトLEDの消費電流も格段に少なくなりました。
これで電池駆動も可能領域となりました。
配線数に見合った?安価で見易い5V系LCDと思います。
これは秋月電子で1K円で購入したものです。
基本制御はSC1602と同じみたいなので、そのままでも何とか動作するとは思いますが、表示文字数への対処等、少々の変更を加えてみようと思います。
現在の所、データバス4bitバージョンのみです。

当初SC1602ASM版からの移植をアッセンブラでプログラムしていたのですが、DDRAMアドレス管理で、当局の頭がこんがらがってしまい (^_^;) 
その当時にも隠し機能的にあった、VRAMアドレスからDDRAMアドレスへの変換を前面に押し出し、逆にDDRAMアドレスは隠す事にしました。
これで文字コードの書き込みがVRAM指定の単純リニアなアドレスとなり、
当局の老化した頭でも気軽に対応可能となりました・・・
めでたしめでたし
 

↑ 使用した基板




↑ 基板の回路図

回路図では16F1828になっているが、ここでは16F18346に置き換えてプログラム作成しています
LCDバックライトには14mA程度流してます。
RB5には圧電スピーカーを用いた簡単な回路を接続してますが、もっとまともな回路の方が良いかも・・・


ライブラリ作成およびデモに使用した基板

これはPICキット用LCDのI2C変換基板です。
ACM2004のデータバスはDB0-DB7がPICと接続されています。
よって、4ビット版、8ビット版、どちらも動作試験可能です。
SC1602版とはほとんど同じ回路なのですが、違う点は、クロックストレッチが有効になった為、RDYピンは不要なので廃止。
代わりに、そのポートに安価な圧電スピーカーを接続しています。
そのため、BEEP音等の発音が可能となっています。
SC1602版基板も同じ基板なので同様な改造が可能ですけど。

今回はXC8でのプログラミングなのでPICは20ピンの16F18346を差し込んで実験します。
基板詳細は別ページを参照して下さい。

ヘッダーファイルの置き場所
MPLAB X IDE Ver5.5

「Projects」ウインドウの、
「Header Files」を右クリック、
「Add Existing Item・・・」
 ここで「ACM2004v1.h」を登録
同様に、
「Source Files」に
「ACM2004v1.c」を登録
この場所にはメインプログラムも登録
ACM2004用ライブラリのヘッダーファイル注意点

使用するPICのI/OポートとACM2004とのI/Oポートとのすり合わせを行う、マクロ設定があります。
これを行わないと動作しません。

PICのICSPピンのDATとCLKと接続するPICのI/Oポートを使用する場合は、LCDのDBポートとは並列接続しない方が良いと思います。
他のACM2004のI/Oポートは入力だけなので、大丈夫だと思います。


 ACM2004用ヘッダーファイルのマクロによるI/Oポート設定
 (実験基板での接続例1)
   LCD側   PIC側
   DB7  : RC7
   DB6  : RC6
   DB5  : RC5
   DB4  : RC4
     E  : RA5
   R/W  : RA4
   R/S  : RA2

   #define DB7 LATCbits.LATC7 // DB7 書き込みポート
   #define DB6 LATCbits.LATC6 // DB6 書き込みポート
   #define DB5 LATCbits.LATC5 // DB5 書き込みポート
   #define DB4 LATCbits.LATC4 // DB4 書き込みポート
   #define DR7 PORTCbits.RC7 // DB7 読み込みポート
   #define DR6 PORTCbits.RC6 // DB6 読み込みポート
   #define DR5 PORTCbits.RC5 // DB5 読み込みポート
   #define DR4 PORTCbits.RC4 // DB4 読み込みポート
   #define ENA LATAbits.LATA5 // イネーブル(E) ポート
   #define R_W LATAbits.LATA4 // R/W ポート
   #define R_S LATAbits.LATA2 // R/S ポート
   #define TR7 TRISCbits.TRISC7 // DB7ポートのI/O設定
   #define TR6 TRISCbits.TRISC6 // DB6ポートのI/O設定
   #define TR5 TRISCbits.TRISC5 // DB5ポートのI/O設定
   #define TR4 TRISCbits.TRISC4 // DB4ポートのI/O設定

   #define VRAM // 仮想表示位置アドレス用広域変数
   #define XSP LATBbits.LATB5 // スピーカ駆動ポート
   #define PL LATBbits.LATB7 // LEDポート

上記、赤字の部分を使用ハードウエア構成に合わせて書き換えます
もちろん、メインソースでPICのI/Oポート初期設定も合わせます。



↑ LCD表示させた所

文字が小さめだが、割と見易い








XC8版
ACM2004制御関数群 Ver1

 ACM2004v1.h

 ACM2004v1.c

XC8用ACM2004関数ライブラリ詳細

基本的にSC1602版と同じ関数群が存在してますが、今回LCD表示位置アドレスの取り扱いに関して変更点があります。
他の関数からも呼び出されている基本関数である、6)「WRTD」関数は内部動作が少々変更されています。
特に行間での挙動がSC1602版とは違いますので、ご注意ください。
また、補足事項もご参照ください
実際の使用方法はデモプログラム・ソースファイルをご参照ください
BEEP音はハードウエアが無いと発音しません。

ACM2004上位関数群

1)ACM2004_PUTL(unsigned char 引数1、unsiged char 引数2)
   引数2から始まるアドレスから文字列を表示します。
   最大80文字です。

   引数1:表示文字コード格納配列アドレス
   引数2:表示する文字列先頭VRAMアドレス(注1)
   戻値:無

2)ACM2004_PUTLx(unsigned char 引数)
   LCDx行目の最左側から文字列を表示(最大20文字)
   x=1~4

   引数:文字列格納配列アドレス
   戻値:無

3)ACM2004_LxBSL(unsigned char 引数)
   LCDx行目の最右側に文字を表示
   その行にあった文字列は左にスクロール
   最左側の文字は破棄される
   x=1~4

   引数:文字コード
   戻値:無

4)ACM2004_PUTC(unsigned char 引数1,unsigned char 引数2)
   指定の表示位置に1文字を表示します
   引数1:文字コード
   引数2:表示位置VRAMアドレス(注1)
    戻値:無

5)unsigned char ACM2004_GETC(unsigned char 引数)
   指定の表示位置の文字コードを取得します

   引数:表示位置VRAMアドレス(注1)
   戻値:文字コード


6)ACM2004_WRTD(unsigned char 引数)
   LCDにデータ(文字コード)を送信・表示します
   事前に表示開始位置VRAMアドレスを指定しておく事が必要です
   連続呼び出ししても表示位置は関数側が自動インクリメントします
   printf()等で使用する低レベル関数はこれを指定します
   一部の制御コードに対応します。(注4)
   
   引数:文字コード
   返値:無

7)ACM2004_CLRLCD(void)
   LCD全画面をクリア
   「VRAM」(カーソル)もホーム位置にリセットされます。

   引数:無
   返値:無

8)ACM2004_CLRLCDx(void)
   LCDx行目をクリア
   x=1~4

   引数:無
   返値:無

9)ACM2004_CURSOR_ON(void)
   カーソル表示を開始します
   これにより、現在のLCDアドレスポインタの位置で、
   カーソル(アンダーバー)がブリンクします。

   引数:無
   戻値:無

10)ACM2004_CURSOR_OFF(void)
   カーソル表示を終了します

   引数:無
   戻値:無

11)ACM2004_BLINK_ON(unsigned char 引数)
   指定の表示位置の文字をブリンクONにします

   引数:表示位置VRAMアドレス(注1)
   戻値:無

12)ACM2004_BLINK_OFF(unsigned char 引数)
   指定の表示位置の文字をブリンクOFFにします

   引数:表示位置VRAMアドレス(注1)
   戻値:無


これより以下の関数は名前が違うだけで、SC1602版と全く同じです。

13)ACM2004_PUTG
          (unsigned char 引数1,unsigned char 引数2)

   指定の文字コードのCGRAMに1文字分データ(注3)を書き込みます

   引数1:外字領域文字コード(00H~07H)
   引数2:8バイトのグラフィックデータ格納配列アドレス
   戻値:無

14)ACM2004_WRTG
          (unsigned char 引数1,unsigned char 引数2)

   指定のCGRAMアドレス(注2)にデータ(注3)を書き込みます

   引数1:CGRAMアドレス
   引数2:1ライン(8bit)分のグラフィックデータ
   戻値:無


15)unsigned char ACM2004_RCVG(unsigned char 引数)
   指定のCGRAMアドレス(注2)のデータを読み込みます

   引数:CGRAMアドレス
   戻値:1ライン(8bit)分のグラフィックデータ

16)ACM2004_INIT4(void)
   SC1602を4ビットモードでイニシャライズ
   2行・16桁・5×7ドットの標準的なモードに設定
   各種ライブラリ関数もこのモードを想定しています。
   SC1602版とまったく同じで、名前が違うだけです

   引数:無
   戻値:無

ACM2004/SC1602下位関数群
 ハードウエアに密着した関数群です。
 PIC側からはACM2004とSC1602とは同じに見えます。
 よって、SC1602用関数そのまま流用です

20)SEND4DAT(unsigned char 引数)
   LCDデータを4ビットモードで送信

   引数:LCD 文字コード、CGRAMビットデータ
   戻値:無

21)SEND4CMD(unsigned char 引数)
   LCDコマンドを4ビットモードで送信

   引数:LCDの各種コマンド、DDRAM、CGRAMアドレス
   戻値:無

22)SEND4FNC(unsigned char 引数)
   LCDのデータを8ビットモードで送信
   ただし、下位4bitの送信はできない
   事実上、イニシャライズ用のLCDコマンド送信専用

   引数:LCDコマンド
   戻値:無

23)unsigned char RECV4DAT(void)
   LCDのデータを4ビットモードで読み込む
   事前に読み込むアドレスを指定しておく事

   引数:無し
   戻値:指定アドレスのデータ

補足事項

(注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音について
 使用した基板には下記のポートに圧電スピーカーが接続されています
 BEEP関数はこのポートから約2KHZのパルスを約100ms出力
 出力ポート:RB5
 改変する場合、ループ定数等を変更して下さい
XC8 ACM2004ライブラリ
20ピンPIC16F18346使用
デモ・プログラム

 16F18346_ACM2004_demo01.c


※注意
 ACM2004v1 XC8用制御ライブラリも必要です。
デモンストレーション プログラム

実験基板上のPIC16F18326にXC8にて記述してます。
ヘッダーファイルにはACM2004に接続されているポートを指定する部分がありますでの、使用PIC及び回路に合わせてポート指定します
もちろん、使用PICのANSELやTRISの設定もメインルーチンで合わせます
イニシャライズ関数は必ず最初に1回呼び出します。
デモプログラム内はウエイトだらけですが、もちろん削除しても問題無いです。
動作が早いと何をやっているのか分かりずらいので、遅くしただけです。

感想
LCDの行数が増えましたし、動作も含めて少しはキャラクタディスプレイらしくなったかな?とは思っていますけど・・・

バグ等がありましたら、このページにて対処します。
戻る  実験・製作の記録TOPへ戻る