XC8用SC1602の制御関数ライブラリ
今更ですが・・・SC1602ライブラリの作成
最近、配線が面倒くさくて、あまり使用しないパラレルLCDですが・・・
配線を我慢すれば安価で見易い5V系LCDではあります。
今までXC8制御ライブラリが当局内では無かったので作ってみました。
使用方法はAQM1602とほぼ同じですが、何故か関数数が増えました。
現在の所、データバス4bitバージョンのみです。
最近、配線が面倒くさくて、あまり使用しないパラレルLCDですが・・・
配線を我慢すれば安価で見易い5V系LCDではあります。
今までXC8制御ライブラリが当局内では無かったので作ってみました。
使用方法はAQM1602とほぼ同じですが、何故か関数数が増えました。
現在の所、データバス4bitバージョンのみです。
ライブラリ作成およびデモに使用した実験基板
これはPICキット14ピンCPU基板、I2C拡張基板、パラレルLCDを1つ基板にまとめた当局内の実験用基板です。
SC1602はデータバスはDB4-DB7がPICと接続されています。
よって、DB0-DB3の下位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」を登録
この場所にはメインプログラムも登録
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ポート初期設定も合わせます。
使用する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関数ライブラリ詳細
何か・・・グダグダと数ばかりありますが、イニシャライズ時以外、常時使用するのは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~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 ○○○○○
(注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 ○○○○○
デモンストレーション プログラム
実験基板上のPIC16F18326にXC8にて記述してます。
ヘッダーファイルにはSC1602に接続されているポートを指定する部分がありますでの、使用PIC及び回路に合わせてポート指定します
もちろん、使用PICのANSELやTRISの設定もメインルーチンで合わせます
イニシャライズ関数は必ず最初に1回呼び出します。
だらだらと記述されていますが、気にしないで下さい・・・ (^_^;)
実験基板上のPIC16F18326にXC8にて記述してます。
ヘッダーファイルにはSC1602に接続されているポートを指定する部分がありますでの、使用PIC及び回路に合わせてポート指定します
もちろん、使用PICのANSELやTRISの設定もメインルーチンで合わせます
イニシャライズ関数は必ず最初に1回呼び出します。
だらだらと記述されていますが、気にしないで下さい・・・ (^_^;)