DATE: --/--/--(--)   CATEGORY: スポンサー広告
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
page top
DATE: 2018/08/16(木)   CATEGORY: Nucleoマウス
Nucleo-32boardを使ったクラシックマウスの開発その15 ~LCD Part 2~

AQM1248AというLCDを使う話の続きです。

最初に復習です。このうち、②まで終わりました。
① LCDの初期化
→初期設定
② 2値化画像データの描画
→LCDの描画方法に慣れる(遊び)
③ フォントの確認
→フォントデータから文字を描画
④ 文字列の出力
→任意の文字列を描画
⑤ 変数の値を出力
→可変長引数関数の勉強

残りを終えてLCDの実装を終えましょう。

・フォントの確認

LCDに文字を出力しましょう。
文字を出すにはフォントデータが重要です。

今回はこちらからフォントデータをいただきました。

漢字表示グラフィック液晶表示ライブラリ

これは5×7ピクセルで描けるフォントデータらしいです。
こちらをfor文で出力してみました。




ありがたいですね。
こういうの無かったら自分で打つのか、、、
ってなってましたね。

しかし、このLCDで出力すると、
文字が小さいので倍サイズで使っています。
1bitあたりを2×2倍にして出力しているだけです。


・文字列の出力

フォントを得たので、
次は任意の文字列を出力できるようにしましょう。

C言語経験者はここは簡単だと思います。
未経験者の人はしっかり学びましょう。
→マウスを走らせるだけならこういう知識はいらないですね

実は文字には一つ一つ数が割り当てられています。
これを文字コードと呼びます。
その中でもアルファベットや記号をでは
ASCIIコード
というものが用いられます。

ASCIIコード表

上の参考記事の最後の部分なんかが分かりやすいです。

例として、
0x48といった値があったとします。
これは文字の'H'としても扱えるってことです。
その逆で文字の'H'は0x48という値としても使えます。


printf("%x\n",0x48); //48と出力される
printf("%c\n",0x48); //Hと出力される


結局今回は何をやりたいかというと、
任意の文字列の値を読む
→対応したフォントデータの配列を読み出す

といった関数を作ればいいわけです。

先ほどいただいたフォントデータは
0x20(スペース)が0として始まっている配列
です。
ということは、
自分が表示させたい文字の位置は、
文字の値-0x20
ということになります。
面倒なので、その他のはエラーにしましょう。

ということで、
そんなことを考えながら以下の出力関数を作ってみました。
引数は、出力位置の指定、コントラスト、任意の文字列としました。
11は1行あたりの最大文字数です。
UARTの_write関数と同じように、
1文字づつ出力していきます。


void printLCDString(uint8_t row, uint8_t column,
uint8_t contrast, char *string) {
int i;
i = 0;

while (string[i] != 0) {
if ((string[i] - 0x20) < 0) {
continue;
}
bigFont(string[i] - 0x20, row + (column + i) / 11,
(column + i) % 11,contrast);
i++;
if (row + (column + i) / 11 >= 3) {
return;
}
}
}


好きな文字列配列を作って出力してみましょう。

出力結果





・変数の値を出力

これで文字列さえあればLCDに任意の文字を
出力できるようになりました。
しかし、UARTのときと同じでこれでは使いにくいです。

ですので、printf的に変数の値を表示できるようにしましょう。
そこで登場するのが、可変長引数関数vsprintf関数です。

可変長引数関数についての説明はこちら

va_list、可変長引数の仕組みを理解してvprintf関数を使う

vsprintf関数についての説明はこちら

vsprintf -C言語関数辞典

流れとしては、
可変長引数で変数の値を複数入力できるようにする
vsprintf関数で文字列化する
文字列出力関数に渡して出力
です。

参考記事をもとに作ってみました。


void printfLCD(uint8_t row, uint8_t column, uint8_t contrast,
const char* fmt, ...) {

va_list ap;
char buffer[1024];

va_start(ap, fmt);
vsprintf(buffer, fmt, ap);
printLCDString(row, column, contrast, buffer);

va_end(ap);

}


これでprintf的に出力できるようになったかと思います。





で完全に余談なんですが、
こんなんLCD以外で何に使うの?
って思ってる人もたくさんいると思います。

Miceのみなさんには大好きな秘伝のタレがありますよね?
あの大変お世話になってきたmyprintf先生です。
あの関数の中身を覗いてみてください。
少しわかった気になれますよ。

そのくらいです。


さて、これでようやく
LED、タクトスイッチ、スピーカー、LCD
と全てのインターフェースが解禁されました。

これらを使って、自分の好きなモード選択関数を作ってみましょう。
モード選択関数の実装は後回しにしがちですが、
やるなら今だと思います。
頑張ってみてください。

Copyright © うむ夫の歩み. all rights reserved.
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。