1.文字を表示する
最初に作った何もしないプログラムでは、プログラムの終了直前にメッセージを表示させていました。
今回は改めて、画面に文字を表示するプログラムを紹介しましょう。
このプログラムに使われている、文字列を表示するAPIについて解説します。
LCDの中心に Hello World ! と表示されたと思います。 しかし、これだけではデバッグにあまり役立たないため、これを改良していきましょう。
今回は改めて、画面に文字を表示するプログラムを紹介しましょう。
display1.c
#include "kernel.h" #include "kernel_id.h" #include "ecrobot_interface.h" DeclareTask(Task1); /* Task1を宣言 */ void ecrobot_device_initialize(){} /* OSEK起動時の処理(何もしない)*/ void ecrobot_device_terminate(){} /* OSEK終了時の処理(何もしない)*/ void user_1ms_isr_type2(void){} TASK(Task1) { display_clear(0); /*LCD表示用バッファのクリア*/ display_string("Hello World !"); /* 文字列を表示する */ display_update(); TerminateTask(); /* 処理終了 */ } |
このプログラムに使われている、文字列を表示するAPIについて解説します。
display_clear(0)
LCD表示用バッファをクリアします。
同時に表示を更新するかどうかを引数で指定します。"0"は更新しない、"1"は更新する、です。
同時に表示を更新するかどうかを引数で指定します。"0"は更新しない、"1"は更新する、です。
display_string("Hello World !")
LCD表示用データバッファに文字列を格納します。
display_update()
LCD表示用データバッファに格納されているデータを、LCDに表示します。同時に表示用バッファがクリアされる。
LCDの中心に Hello World ! と表示されたと思います。 しかし、これだけではデバッグにあまり役立たないため、これを改良していきましょう。
2.変数を表示する・表示位置を指定する
次に変数を表示するプログラムを作りましょう。また、画面中央に表示するのではなく、位置も指定してみましょう。
ここではロボットの左右のモーターの回転量を表示するプログラムを作成します。
それでは次のプログラムを作成してください。ここでは display2.c とします。
プログラムを起動したら、タイヤを回転させてみて下さい。タイヤの回転量が表示されると思います。
では、このプログラムで新しく用いたAPIについて解説します。
上のプログラムの無限ループの中に、10ms のwait処理を入れている理由は、液晶の反応速度があまり速くないためです。また、10msecより短く値が変化してもそれを読み取れる人は稀です。興味のある人は、どの程度のwait処理で正しく表示できるか、また読み取り可能かを確認してみて下さい。
LCDには文字列や数字以外に画像の表示や線の描画も可能です。詳しくは、API Referenceの5.ディスプレイ関係のところを参照してください。
ここではロボットの左右のモーターの回転量を表示するプログラムを作成します。
それでは次のプログラムを作成してください。ここでは display2.c とします。
display2.c
#include "kernel.h" #include "kernel_id.h" #include "ecrobot_interface.h" DeclareTask(Task1); /* Task1を宣言 */ void ecrobot_device_initialize(){} /* OSEK起動時の処理(何もしない)*/ void ecrobot_device_terminate(){} /* OSEK終了時の処理(何もしない)*/ void user_1ms_isr_type2(void){} TASK(Task1) { int l_count,r_count; nxt_motor_set_count(NXT_PORT_B,0); /* ロータリエンコーダ初期化 */ nxt_motor_set_count(NXT_PORT_C,0); display_clear(0); /*LCD表示用バッファのクリア*/ while(1){ l_count = nxt_motor_get_count(NXT_PORT_B); /* ロータリエンコーダから変数に代入 */ r_count = nxt_motor_get_count(NXT_PORT_C); display_goto_xy(0, 1); /* 表示位置をx=0,y=1に移動 */ display_string("l_count="); /* "l_count="と表示 */ display_int(l_count, 0); /* l_count変数の中身を左詰で表示 */ display_goto_xy(0, 2); /* 表示位置をx=0,y=2に移動 */ display_string("r_count="); /* "r_count="と表示 */ display_int(r_count, 0); /* r_count変数の中身を左詰で表示 */ display_update(); /* LCD表示用バッファから画面更新 */ systick_wait_ms(10); /* 10ms待つ */ } TerminateTask(); /* 処理終了 */ } |
プログラムを起動したら、タイヤを回転させてみて下さい。タイヤの回転量が表示されると思います。
では、このプログラムで新しく用いたAPIについて解説します。
display_goto_xy(0, 1)
display_int(r_count,0)
文字の表示位置を指定します。画面の左上が(0,0)です。
一つ目の引数で水平方向(0〜15)、二つ目の引数で垂直方向(0〜7)を指定します。
一つ目の引数で水平方向(0〜15)、二つ目の引数で垂直方向(0〜7)を指定します。
display_int(r_count,0)
LCDにint形変数をLCD表示用バッファに格納します。
一つ目の引数は表示する変数を、二つ目の引数は表示する領域を指定します。
二つ目の引数に"4"と入力した場合、4つ右へいった所から、右詰で数字を表示します。左詰で数字を表示する場合は'0'を入れます。
一つ目の引数は表示する変数を、二つ目の引数は表示する領域を指定します。
二つ目の引数に"4"と入力した場合、4つ右へいった所から、右詰で数字を表示します。左詰で数字を表示する場合は'0'を入れます。
上のプログラムの無限ループの中に、10ms のwait処理を入れている理由は、液晶の反応速度があまり速くないためです。また、10msecより短く値が変化してもそれを読み取れる人は稀です。興味のある人は、どの程度のwait処理で正しく表示できるか、また読み取り可能かを確認してみて下さい。
LCDには文字列や数字以外に画像の表示や線の描画も可能です。詳しくは、API Referenceの5.ディスプレイ関係のところを参照してください。
3.課題
1.サンプルプログラム display2.c の動作を確認せよ。
2.「3.タッチセンサの使用」の課題のプログラムを改変して、走行中の左右のエンコーダ値およびモータへの指令値を LCD に表示するようにせよ。
2.「3.タッチセンサの使用」の課題のプログラムを改変して、走行中の左右のエンコーダ値およびモータへの指令値を LCD に表示するようにせよ。