2016-07-15 18:20 | カテゴリ:PIC応用回路


LCD表示器に文字を表示するところの追加説明です。



前回、文字の表示までこぎつけました。
一文字ずつ、i2cの書き込み関数に渡して、それを一文字ずつ表示するわけですが、毎回このような手順は面倒で、一気に文字列を手渡して表示したいですよね。
そのために、下記の文字列表示関数を導入しました。

Put.jpg

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

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


この関数は、呼び出し側から、表示したい文字そのもののデータを受け取るのではなく、表示したい文字の格納されている「場所」の住所、つまりアドレスを受け取ります。
そのアドレスを示すものが、ポインターと言われるもので、例えば、

LCD_puts("ABCDEFG");

こういう形で、この関数が呼ばれると仮定すると、この文字列 "ABCDEFG" という文字データが格納されているメモリー上の場所をポインターとして、受け取ります。
その表記として、文字表示関数側では、const char *p として、*p となります。

この*がポインターとして受け取る印です。pはこの関数内で使用するバイト型の文字変数名(なんでもかまいません)です。
また、constとは、呼び出されたこの文字表示関数の中で、受け取ったデータは、変更しない(できない)という印です。

この、"ABCDEFG"という直接的な指定の代わりに、文字配列変数としても指定でき、例えば

int suuji;//整数変数を定義
char moji[10];//文字配列、10文字を定義


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


ここで、注意事項があります。
--------------

LCD文字表示関数は、表示する文字列の「終わり」をどのように判断しているかを知る必要があります。

それが、

while (*p != '\0')

の部分です。
つまり、表示しようと読み込んだ文字データが'\0’なら、終了、と判断しているわけです。
この'\0'はNULデータと言って、文字列の終わりの印と決められています。

例えば、上記の例の

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

では、itoa()関数は自動的に最後に'\0'を書き込んでくれますから、問題ないのですが、自分で文字配列にデータを書き込む際は、最後に必ず、'\0'を書き込みます。

例えば、

moji[0] = 'A';
moji[1] = 'B';
moji[2] = 'C';
moji[3] = '\0';

とします。

そうしないと、文字表示関数は、終わりを見つけられなくて、永久に文字を勝手に表示し続けて、プログラムは「暴走」となります。

以上を踏まえて、LCD表示の関数として、表示文字位置を指定する「カーソルポジション」コマンドと、「行消去」コマンドを作ってみました。

Cursor.jpg

Clear.jpg

【ジャンル】:趣味・実用 【テーマ】:電子工作
コメント(4)

管理者のみに表示する