↑上かSC1602D
 下がSC1602B
今更ですが・・・SC1602ライブラリの作成

最近、配線が面倒くさくて、あまり使用しないパラレルLCDですが・・・
配線を我慢すれば安価で見易い5V系LCDではあります。
今までXC8制御ライブラリが当局内では無かったので作ってみました。
使用方法はAQM1602とほぼ同じですが、何故か関数数が増えました。
現在の所、データバス4bitバージョンのみです。



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

これはPICキット14ピンCPU基板、I2C拡張基板、パラレルLCDを1つ基板にまとめた当局内の実験用基板です。
SC1602はデータバスはDB4-DB7がPICと接続されています。
よって、DB0-DB3の下位4bitは無接続です。
実験基板詳細は別ページを参照して下さい。

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

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

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

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


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


   #define DB7 LATCbits.LATC5 // DB7 書き込みポート
   #define DB6 LATCbits.LATC4 // DB6 書き込みポート
   #define DB5 LATCbits.LATC3 // DB5 書き込みポート
   #define DB4 LATCbits.LATC2 // DB4 書き込みポート
   #define DR7 PORTCbits.RC5 // DB7 読み込みポート
   #define DR6 PORTCbits.RC4 // DB6 読み込みポート
   #define DR5 PORTCbits.RC3 // DB5 読み込みポート
   #define DR4 PORTCbits.RC2 // DB4 読み込みポート
   #define ENA LATAbits.LATA0 // イネーブル(E) ポート
   #define R_W LATAbits.LATA1 // R/W ポート
   #define R_S LATAbits.LATA2 // R/S ポート
   #define TR7 TRISCbits.TRISC5 // DB7ポートのI/O設定
   #define TR6 TRISCbits.TRISC4 // DB6ポートのI/O設定
   #define TR5 TRISCbits.TRISC3 // DB5ポートのI/O設定
   #define TR4 TRISCbits.TRISC2 // DB4ポートのI/O設定

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


XC8版
SC1602制御関数群 Ver1.0

 SC1602v1.h

 SC1602v1.c

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

何か・・・グダグダと数ばかりありますが、イニシャライズ時以外、常時使用するのは1~2個程度と思います。
低レベルの下位関数は4個ほどで、上位関数群がそれを使い回しています。

SC1602上位関数群

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

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

2)SC1602_PUTL1(unsiged char 引数)
   LCD1行目の最左側から文字列を表示(最大16文字)

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

3)SC1602_PUTL2(unsigned char 引数)
   LCD2行目の最左側から文字列を表示(最大16文字)

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

4)SC1602_L1BSL(unsigned char 引数)
   LCD1行目の最右側に文字を表示
   その行にあった文字列は左にスクロール
   最左側の文字は破棄される
   引数:文字コード
   戻値:無

5)SC1602_L2BSL(unsigned char 引数)
   LCD2行目の最右側に文字を表示
   その行にあった文字列は左にスクロール
   最左側の文字は破棄される

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

6)SC1602_L21BSL
         (unsigned char 引数1、unsigned char 引数2)

   LCD2行目の最右側に文字を表示
   その行にあった文字列は左にスクロール
   2行目最左側の文字は1行目最右側に表示される
   1行目にあった文字列は左にスクロール
   1行目指定最左側の文字は破棄される

   引数1:表示文字コード
   引数2:1行目左スクロール停止位置アドレス
    戻値:無

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

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

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

9) VRAM_ADR(unsigned char 引数)
   LCD表示位置アドレスを指定します
   VRAMアドレスを00H~1FHと見立てて、
   それをDDRAMアドレスに変換・送信します。
   引数が00H~1FHの場合はDDRAMアドレスに変換
   引数が20H以上ならそのまま送信

   引数:表示位置アドレス
   返値:無

10)SC1602_WRTD(unsigned char 引数)
   LCDデータ(文字コード)を送信・表示します
   事前に表示開始位置アドレスを送信しておく事が必要です
   連続送信しても表示位置はLCD側が自動インクリメントします
   printf()等で使用する低レベル関数はこれを指定します
   
   引数:文字コード
   返値:無

11)SC1602_CLRLCD(void)
   LCD全画面をクリア

   引数:無
   返値:無

12)SC1602_CLRLCD1(void)
   LCD1行目をクリア

   引数:無
   返値:無

13)SC1602_CLRLCD2(void)
   LCD2行目をクリア

   引数:無
   返値:無

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

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

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

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

16)SC1602_PUTG
          (unsigned char 引数1,unsigned char 引数2)

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

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

17)SC1602_WRTG
          (unsigned char 引数1,unsigned char 引数2)

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

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

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

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

19)SC1602_INIT4(void)
   SC1602を4ビットモードでイニシャライズ
   2行・16桁・5×7ドットの標準的なモードに設定
   各種ライブラリ関数もこのモードを想定しています。

   引数:無
   戻値:無


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)DDRAMアドレス
   LCD表示モードが16桁・2行表示・5×7ビット文字での話になります。
   
   DDRAMはハードウエアとしては00H~4FH分のアドレス、
   80バイト(文字)のRAM容量を持っているようです
   ここに文字コードを書き込む事によって、文字が表示されます。
   表示モードによってDDRAMアドレスと表示位置の関係が変化する様です。
   表示シフトを行わない限り、16桁2行表示では、
   1行目は00H~0FHで、最左側から表示
   2行目は40H~4FHがDDRAMアドレスとなるようです。
   命令ビットがbit7=Hですので、
   80H+DDRAMアドレスが表示位置指定命令となります。

   面倒なので、ここで言うDDRAMアドレスとは
   LCD表示モードが16桁・2行表示・5×7ビット文字
   以上の環境で、命令ビットを含んでコマンド送信、
   1行目 80H~8FH
   2行目 C0H~CFHとします。

(注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  ○○○○○
XC8 SC1602ライブラリ
14ピンPIC16F18326使用
デモ・プログラム

 16F18326_SC1602_LIBdemo01.c

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

実験基板上のPIC16F18326にXC8にて記述してます。
ヘッダーファイルにはSC1602に接続されているポートを指定する部分がありますでの、使用PIC及び回路に合わせてポート指定します
もちろん、使用PICのANSELやTRISの設定もメインルーチンで合わせます
イニシャライズ関数は必ず最初に1回呼び出します。

だらだらと記述されていますが、気にしないで下さい・・・ (^_^;)
戻る  実験・製作の記録TOPへ戻る