LCDキャラクタディスプレーライブラリ:TextLCD.c(TextLCD.h)
このライブラリはLCDキャラクタディスプレイ用の関数ライブラリです。他のプログラムから呼び出せる以下の関数が含まれています。
LCD初期化関数を実行後は8ビットを4ビット2回に分けて転送するモードになります。DDRAM(ディスプレーデータRAM)は80文字の記憶容量があります。
1行16文字までしか表示できませんから裏に隠れています。スクロールを使ってこの隠れた文字を表示する方法がありますが今回のライブラリには入れていません。
CGRAM(キャラクタジェネレータRAM)は8文字分のデータを記憶します。キャラクタドットは横5ビット縦8ビットです。
コマンド出力関数
LCD_WriteData(引数1,引数2)
LCDキャラクタディスプレーに表示データを送ったり、表示位置を制御する関数です。
引数1は制御コードまたは表示文字データです。引数2によって切り替えます。
引数2がLCD_DATA_RSの時は、表示文字データ送信で、LCD_CMD_RSの時は制御コードを送信します。
戻り値はありません。
例
LCD_WriteData(LCD_CMD_CLAR,LCD_CMD_RS); // 全表示クリアしてホーム位置へ
LCD_WriteData(Line_1,LCD_CMD_RS); // 2行目の先頭にカーソルを移動する
LCD_WriteData(0x41, LCD_DATA_RS); // 文字"A"を表示する。
LCD_WriteData(0x00, LCD_DATA_RS); // CGRAMの1番目の文字を表示する。
引数1がコマンドの場合(引数2はLCD_CMD_RSとする。)
定義名 定義値 機 能 LCD_CMD_CLAR 0x01 全表示をクリアしてカーソルをホーム(0番地)に移動する。 LCD_CMD_HOME 0x02 カーソルをホーム(0番地)に移動する。 LCD_CMD_ENT_SET 0x06 エントリーモード設定、メモリ書き込み時アドレスをInc、表示シフト無しに設定する。 LCD_CMD_DISP_CUR 0x0e 表示設定、表示ON、カーソルON LCD_CMD_DISP_BNK 0x0d 表示設定、表示ON、カーソルブリンク LCD_CMD_DISP_NCUR 0x0c 表示設定、表示ON、カーソルOFF LCD_CMD_DISP_OFF 0x08 表示設定、表示OFF LCD_CMD_CG_ADDR 0x40 CG RAMの先頭アドレスをセット。以降送信するデータはCGRAMにアクセスする。 LCD_CMD_DD_ADDR 0x80 DD RAMの先頭アドレスをセット。以降送信するデータはDDRAMにアクセスする。 LCD_CMD_FUNC_SET 0x28 ファンクション設定、4ビットモード、Duty1/6、5×7ドット Line_0 0x80 1行目先頭アドレス(+桁数で表示位置を右に設定する。) Line_1 0xc0 2行目先頭アドレス(+桁数で表示位置を右に設定する。)
引数2
定義名 定義値 機 能 LCD_CMD_RS 0 コントロールコマンドを出力(コマンドは引数1で指定する)。 LCD_DATA_RS 1 表示データ/文字データを出力
CGRAMに書き込む場合は以下の様になります。予めCGDATAのテーブルを用意すると良いでしょう。CGデータの一番下はカーソルになりますのでカーソルを表示した時は重なってしまうので注意してください。横方向の上位3ビットは無視されます。
例
LCD_WriteData(LCD_CMD_CG_ADDR,LCD_CMD_RS); // CG RAMアドレスセット、以降はCG RAMにアクセスする
LCD_WriteData(LCD_CG_DATA[0],LCD_DATA_RS); // LCD_CG_DATAテーブルの[0]番目を出力する。
・
・
LCD_WriteData(LCD_CMD_DD_ADDR,LCD_CMD_RS); // DD RAMアドレスセット、以降はDD RAMにアクセスする
LCD初期化関数
LCD_Init()
引数はありません。
LCD初期化関数は以下のようになっています。決められた手順ですから4ビットモードの場合8ビットモードを3回繰り返してから4ビットモード設定をします。以降は4ビットモードでコマンドを受け付けます。各コマンド関数の後にCpu_Delay100US()関数が入れてあります。キャラクタディスプレーのビジーを読まない為、各コマンドの最長所要時間より長くウェイトしています。
戻り値はありません。
/****************
* LCD初期化関数 *
*****************/
void LCD_Init(void)
{
LCD_RS_PutVal(LCD_CMD_RS); // Clear RS
LCD_E_PutVal(0); // Clear E
Cpu_Delay100US(1000); // 100mS待機
LCD_DB4bits_PutVal(LCD_CMD_INT8B); // 8ビットモード設定
LCD_StrobePulse(); // Eパルス発生
Cpu_Delay100US(150); // 15mS待機
LCD_DB4bits_PutVal(LCD_CMD_INT8B); // 8ビットモード設定
LCD_StrobePulse(); // Eパルス発生
Cpu_Delay100US(3); // 300uS待機
LCD_DB4bits_PutVal(LCD_CMD_INT8B); // 8ビットモード設定
LCD_StrobePulse(); // Eパルス発生
Cpu_Delay100US(1); // 100uS待機
LCD_DB4bits_PutVal(LCD_CMD_INT4B); // 4ビットモード設定
LCD_StrobePulse(); // Eパルス発生
Cpu_Delay100US(1); // 100uS待機
LCD_WriteData(LCD_CMD_FUNC_SET, LCD_CMD_RS); // 4ビットモードファンクション設定
Cpu_Delay100US(1);
LCD_WriteData(LCD_CMD_DISP_OFF, LCD_CMD_RS); // ディスプレー表示OFF
Cpu_Delay100US(1);
LCD_WriteData(LCD_CMD_CLAR, LCD_CMD_RS); // 表示クリア
Cpu_Delay100US(50);
LCD_WriteData(LCD_CMD_ENT_SET, LCD_CMD_RS); // 文字配置順序の設定
Cpu_Delay100US(1);
LCD_WriteData(LCD_CMD_DISP_NCUR,LCD_CMD_RS); // 表示開始
Cpu_Delay100US(1);
}
CGRAM初期化関数
LCD_CG_init()
引数はありません。
CGRAMにデータを一気に転送する関数です。転送されるCGデータはLCD_CG_DATA[ ]に配列データとして用意されます。
バイナリーで記述していますので見やすいと思います。1が黒、0は白になります。今回はVUメーターのバーの形を入れてあります。
戻り値はありません。
0x00バー1本
0x01バー2本
0X020dBマーカー
0x03マーカー付きバー1本
0x04マーカー付きバー2本
0x05 R バーの高さに合わせたRch表示文字
0x06 L バーの高さに合わせたLch表示文字
0x07 □ □使用予定なし。
/*************************
* ユーザーキャラクタ定義 *
**************************/
const unsigned char LCD_CG_DATA[] = // CGデータ配列
{
0b00000000, // ..... 00
0b00000000, // .....
0b00011000, // $$...
0b00011000, // $$...
0b00011000, // $$...
0b00011000, // $$...
0b00011000, // $$...
0b00011000, // $$...
0b00000000, // ..... 01
0b00000000, // .....
0b00011011, // $$.$$
0b00011011, // $$.$$
0b00011011, // $$.$$
0b00011011, // $$.$$
0b00011011, // $$.$$
0b00011011, // $$.$$
0b00000100, // ..$.. 02
0b00000100, // ..$..
0b00000000, // .....
0b00000000, // .....
0b00000000, // .....
0b00000000, // .....
0b00000000, // .....
0b00000000, // .....
0b00000100, // ..$.. 03
0b00000100, // ..$..
0b00011000, // $$...
0b00011000, // $$...
0b00011000, // $$...
0b00011000, // $$...
0b00011000, // $$...
0b00011000, // $$...
0b00000100, // ..$.. 04
0b00000100, // ..$..
0b00011011, // $$.$$
0b00011011, // $$.$$
0b00011011, // $$.$$
0b00011011, // $$.$$
0b00011011, // $$.$$
0b00011011, // $$.$$
0b00000000, // ..... 05
0b00000000, // .....
0b00011100, // $$$..
0b00010010, // $..$.
0b00010010, // $..$.
0b00011100, // $$$..
0b00010010, // $..$.
0b00010010, // $..$.
0b00000000, // ..... 06
0b00000000, // .....
0b00010000, // $....
0b00010000, // $....
0b00010000, // $....
0b00010000, // $....
0b00010000, // $....
0b00011110, // $$$$.
0b00000000, // ..... 07
0b00000000, // .....
0b00011111, // $$$$$
0b00010001, // $...$
0b00010001, // $...$
0b00010001, // $...$
0b00010001, // $...$
0b00011111 // $$$$$
}; // 07 70-78 ( )
上記のテーブルを8文字分連続して一気にCGRAMに転送します。
/***************
* CG RAM初期化 *
****************/
void LCD_CG_init(void)
{
unsigned char i,j,temp;
LCD_WriteData(LCD_CMD_CG_ADDR,LCD_CMD_RS); //CG RAMアドレスセット、以降はCG RAMにアクセスする
temp = 0;
for (i=0;i<8;i++){
for (j=0;j<8;j++){
LCD_WriteData(LCD_CG_DATA[temp++],LCD_DATA_RS);
Cpu_Delay100US(1);
}
}
LCD_WriteData(LCD_CMD_DD_ADDR,LCD_CMD_RS); // DD RAMアドレスセット、以降はDD RAMにアクセスする
Cpu_Delay100US(1);
LCD_WriteData(LCD_CMD_DISP_NCUR,LCD_CMD_RS); // 表示開始
Cpu_Delay100US(1);
}
1文字表示関数
LCD_putc(引数)
この関数の引数はアスキーコードになります。表示したい文字のアスキーコードを引数として渡してください。
CGRAMの場合は0x00から0x07を指定します。
戻り値はありません。
例
LCD_putc(0x41); // ”A"を表示する。
LCD_putc(0x00); // CGRAMの1番目の文字を表示する。
/****************
* 1文字表示関数 *
*****************/
void LCD_putc(unsigned char c)
{
LCD_WriteData(c, LCD_DATA_RS); // 表示DATAをDD RAMに書込
Cpu_Delay100US(1); // LCD内部処理のため200uS待つ
}
文字列表示関数
LCD_PrintDisplay(引数1,引数2)
文字列を表示する関数です。引数1は表示する行を指定します。引数2は表示する文字列を” ”で囲って指定します。
戻り値はありません。
例
LCD_PrintDisplay(Line_0," LCD VU Display "); // オープニングメッセージ1行目を書込む Line_0は1行目指定アドレスを定義済み。
LCD_PrintDisplay(Line_1,"Ver1 デンシコウサクノモリ"); // オープニングメッセージ2行目を書込む Line_1は2行目指定アドレスを定義済み。
/*****************
* 文字列表示関数 *
******************/
void LCD_PrintDisplay(unsigned char Lineaddr, unsigned char* s)
{ // (引数1は行指定アドレス,引数2は"表示文字列")
unsigned char *str; // strをポインタ変数宣言
str = s; // strは表示文字の先頭アドレス
LCD_WriteData(Lineaddr, LCD_CMD_RS);
while( *str != '\0'){ // 文字列が終了するまで繰り返し
LCD_WriteData(*str++,LCD_DATA_RS);
Cpu_Delay100US(1);
}
}