2016-07-12 18:17 | カテゴリ:PIC応用回路


LCD表示器に文字を表示するところまでトライしていきます。


前回、i2C通信に関して、スタートコマンド。書き込みコマンド。ストップコマンドなどをご紹介しましたが、今回はこれらのコマンドを組み合わせて、LCDデバイスに指示を出す事を検討します。
i2cの通信手順に基づいて、LCDデバイスに指示を出すには、LCDデバイスの仕様に合わせて手順を踏まなければなりません。

デバイスの説明書を見ると、その手順がちゃんと書いてあります。
PICのC言語を使用したサンプルが出ています。

まず、このLCDにコマンドを与えるのか、表示するデータを送るのかを区別するための手順があります。

続きは、、、


コマンドを送る場合は、

//---------------------------------------------
// LCD コマンド1バイト書き込み
//---------------------------------------------

void LCD_CW(unsigned char lcd_cmd) {
i2c_START();//スタートコマンド
i2c_WRITE(S_ADRS1);//1バイト(0A)書き込み(スレーブアドレス)
i2c_WRITE(0x00);//1バイト(00)書き込み(次に送るデータはコマンドだという合図)
i2c_WRITE(lcd_cmd);//コマンド1バイト書き込み(実際のコマンド)
i2c_STOP();//終了
__delay_ms(5);

}


データを送る場合は

//---------------------------------------------
// LCD データ1バイト書き込み
//---------------------------------------------

void LCD_DW(unsigned char lcd_dat) {
i2c_START();//スタートコマンド
i2c_WRITE(S_ADRS1);//1バイト(0A)書き込み(スレーブアドレス)
i2c_WRITE(0x80);//1バイト(80)書き込み(次に送るデータはデータだという合図)
i2c_WRITE(lcd_dat);;//データを1バイト書き込み(実際の文字データなど)
i2c_STOP();//終了
__delay_ms(5);
}



という決まりがあります。

これに基づいて、LCDの初期リセットや、文字を表示させる位置の指定、実際に表示させる文字そのものを送信していけば、LCDに表示されます。

まず、電源投入後にリセット動作を起動します。
下記の例は、マニュアルにあった手順です。
’01’のリセット・クリアコマンド以外は、解析できていません。


//----------------------------------------------
// LCD Initialization
// 画面クリア後カーソルはホームへセット
// RAMメモリーポインター先頭
//-----------------------------------------------

void LCD_init() {

LCD_CW(0x01); // LCDリセット
LCD_CW(0x38);
LCD_CW(0x0F);
LCD_CW(0x06);
LCD_CW(0x80); // 表示RAM領域アドレスポインターを先頭に

}



また、各コマンドには5msecのDelay関数が挿入されています。
実は、このLCDデバイスは、元々は、パラレル信号で制御されるようなインターフェスになっています。
そこに、別途PICを取り付けて、i2cインターフェスで制御できるように改造されたものです。
したがって、各コマンドの間に、LCDデバイス側が処理するために待ち時間が設けられているようです。

では、リセット・クリアが完了したら、次は文字の表示に移ります。
リセットする前は、ディスプレイにはこんな感じでドットが表示されています。


LCD01.jpg


//------------------------------------------------------------
// LCD 初期メッセージ表示例(待ち時間は念のため10msecにしてあります)
//------------------------------------------------------------

LCD_CW(0x80);//LCDのデータ格納RAMのアドレスを先頭位置にセット(上記のリセットコマンドを改めて送ります)(任意)
LCD_DW('V');//表示するデータとして、”V”を送信
LCD_DW('i');//同上”i”を送信
LCD_DW('v');
LCD_DW('i');
LCD_DW('d');



これで、液晶にVividと表示されたと思います。

LCD02.jpg


しかし、この様に、毎回、一文字ずつ表示していくのは面倒で、実用的ではありません。
もう少しスマートにしたいです。
そこで、ちょっと工夫して


//-----------------------------------------------
// LCD文字表示(連続)
// 現在のカーソル位置から連続して文字を書き込む
// 1行目、2行目の終端を越えた文字は無視される
//------------------------------------------------

void LCD_puts(const char *p) {  //文字配列をポインターとして受け取る(内容は変更しない)
while (*p != '\0') {     //受け取った文字配列にヌルデータ(\0)が来るまで文字データを
LCD_DW(*p); // LCD_DW関数にセットして表示する
p++; //ポインターを+1する
}
}


としました。

この関数は、

LCD_puts("ABCDEFG");

とか、

int suuji;
char moji[10];


suuji = 12345;
itoa(moji, suuji, 10);// suujiの数字(1234)を文字に変換して、moji配列に代入する関数
LCD_puts(moji);

という形で、使用します。

LCD03.jpg


上記の2例を組み入れたテストプログラムはこちらです。

DemoProg002.txt

管理者のみに表示する