リスト1  LCDに文字を表示するプログラム(LCD_char) #include "mbed.h" #include "TextLCD.h" // コンストラクタを使ってlcd変数を初期化する。 TextLCD lcd(p24, p26, p27, p28, p29, p30); int main() { // LCDの表示をクリアする lcd.cls(); // locate関数で文字を表示する位置を指定する。 // LCDの左上が(0,0)になる。文字位置の指定は 0 から始まることに注意する。 // 上の段の左から4列目から文字列を表示するように指定している。 lcd.locate(3,0); // printf関数は"(ダブル・クォーテーション)で囲まれた文字列を表示する。 // 使用するキャラクタLCDの表示範囲を超えないように、表示開始位置と文字数の // 関係にも注意する。 lcd.printf("Eleki Jack!"); // ここでは下の段の6列目から文字列を表示する。 lcd.locate(5,1); // putc関数は指定した文字コード(図5)を1文字だけ表示する。 // 文字コードの指定は、コードの最初に[0x]を付け、値を16進数で表現する。 // 文字コードの16進数は、図5の列でHigher(上位)4bitを指定し、 // 行でLower(下位)4bitを指定する。 // ちなみにカタカナの'エ'は図5橙色枠内のように上位が'B'で下位が4になり、 // これに0xを付加した 0xB4となる。 lcd.putc(0xB4); // エ lcd.putc(0xDA); // レ lcd.putc(0xB7); // キ lcd.putc(0xBC); // シ lcd.putc(0xDE); // " lcd.putc(0xAC); // ャ lcd.putc(0xAF); // ッ lcd.putc(0xB8); // ク lcd.putc(0x21); // ! } --- リスト2 温湿度センサを使って室内の環境データを測定しLCDに表示するプログラム #include "mbed.h" #include "TextLCD.h" TextLCD lcd(p24, p26, p27, p28, p29, p30); // p20の端子から温度センサの出力値をtemp_inに取り込むための宣言 AnalogIn temp_in(p20); // p19の端子から湿度センサの出力値をhumid_inに取り込むための宣言 AnalogIn humid_in(p19); // 決められた周期で関数を呼び出すためのTickerオブジェクトの宣言 Ticker in; // センサから値を取得しLCDの表示を更新する関数 // Tickerオブジェクトからこの関数を決められた周期で呼び出す void Update(){ float r_temp, r_humid; float temp,humid; // センサから値を読み取る。 temp = temp_in; humid = humid_in; // センサの値を補正する。 // 0.0〜3.3[V]を0.0〜1.0に変換しているため、入力値に3.3を乗算し電圧値に戻して、 // さらに100 を乗算し温度に変換している。 r_temp = temp * 3.3 * 100 ; // ---- (1) // 湿度も同様。3.3を乗算し100を掛けることで湿度[%]の値を求めている。 r_humid = humid * 3.3 * 100 ; // この部分は6倍の増幅器を使ってセンサの値を取得した場合の変換処理をする。 // 温度センサは50℃のとき0.5[V]を出力するが、この出力を6倍の増幅器を通すことで // 50℃で3[V](=0.5[V]*6)の出力になるため、1℃温度が上昇すると出力が+60[mV](これまで+10mVだったものが+60mV) // 増加するようになる。 // これにより、測定できる温度範囲は0〜55℃に狭まるが、その分細かい動きを // 観測できるようになる。 // 温度を求めるのに、前は変数の値に3.3と100を乗算していましたが、温度センサの出力を6倍したものが // 入力値となっているため、この値から6を除算する必要がある。 // したがって、入力値に55.0(=3.3*100/6)を乗算すると温度が求まる。 //r_temp = temp * 55.0 ; // ---- (2) lcd.cls(); lcd.locate(0,0); // printf関数の""の中の文字列がLCDに表示される。この中で%5.2fの部分は、""の後の変数の // 値が表示される。 // %5.2fのfは実数データの表示で、%5.2は小数点を含む5桁のうち小数点以下を2桁で表示する。 // ただし、小数点より上の桁は2桁を超えても表示されるが、1桁の場合は1桁分は空白が表示される。 lcd.printf("RoomTemp %5.2f",r_temp); // 単位の℃を表示する。 lcd.locate(14,0); lcd.putc(0xDf); // 文字コードで表示。 lcd.putc('C'); // 表示したい文字をシングル・コーテションで囲んで表示。 // 表示位置を下の段の左端からに指定。 lcd.locate(0,1); // printfの" "の中では、%は特別な記号。そのまま%を表示したい場合は%を2個並べると // %が1個だけ表示される。 lcd.printf("humidity%5.1f%%",r_humid); } int main() { // 10秒ごとにセンサからの値とLCDの表示を更新する。 in.attach(&Update,10); // 無限ループ。 while(1){ } } --- リスト3  LCDの外字登録と表示プログラム #include "mbed.h" #include "TextLCD.h" TextLCD lcd(p24, p26, p27, p28, p29, p30); int main() { lcd.cls(); // CGRAMアドレスの指定 // CGRAM(1)にひらがなの「え」のビット・パターンを登録する。 lcd.writeCommand(0x40) ; // 40μ秒待ちます。 wait(0.000040f) ; // ここから文字のビット・パターンを1行ずつ設定していく。 lcd.writeData((int)0x08) ; lcd.writeData((int)0x04) ; lcd.writeData((int)0x00) ; lcd.writeData((int)0x1F) ; lcd.writeData((int)0x02) ; lcd.writeData((int)0x04) ; lcd.writeData((int)0x0E) ; lcd.writeData((int)0x19) ; // 40μ秒待つ。 wait(0.000040f); lcd.cls(); // 文字の表示位置を指定する lcd.locate(5,0); // CGRAM(1)を指定して、その部分に登録されている文字コードの「え」を表示する。 lcd.putc(0x00); } --- リスト4 文字が流れるプログラム #include "mbed.h" #include "TextLCD.h" void slideMessage(char* ,double ,int ); // 流れる文字はslideMessage関数を使う。 // messageには表示する文字列 // slidetimeは文字がズレる時間 // rowは0で上の段、1で下の段の文字が流れる。 // 上下両方とも流れる文字にはできない。 // slideMessage(流れる文字列, 文字がズレる時間, 行の指定 ) TextLCD lcd(p24,p26,p27,p28,p29,p30); // SIZEはLCDの文字列の長さを表す。 #define SIZE 16 void main(void) { // 流れる文字列を作成する。 // 文字列の変数はstaticにしないと、正しく表示されない。 static char msg[] = "1234567890123456" ; static char msg1[] = "Welcome to mbed! mbed is a tool for Rapid Prototyping with Microcontrollers." ; static char msg2[] = "abcdefghijklmnop" ; // Debugにお勧めの文字列。 // 文字列の変数を引数として渡す。 // 今回はmsg1の文字列で、0.5秒ごとにスライドし、上の段に文字を表示する設定。 slideMessage(msg1, 0.5,0); return 0 ; } void slideMessage(char msg[], double time,int row) { int j, k ; // strlen関数は文字列の長さを返す関数で、msg[]であれば16がlenに代入さる。 int len = ( strlen(msg) ) ; lcd.cls(); while(1){ // <= Debug の際はこのwhileをコメントにする printf("[len:%d :: %s]",len,msg); // <= Debug printf("----- first loop -----\r\n"); // <= Debug // 最初の文字が右から現れて、その文字が左端に移動するまでの処理。 // 最初の文字が左端に移動するまで16回の処理が必要になるので // 15〜0までの16回のループになる。 for (j = SIZE -1 ; j>=0 ; j-- ){ // 変数kのループは、表示する文字列の位置を指定するためのループ。 printf("(%2d)",j); // <= Debug for ( k = j ; k < SIZE ; k++ ){ // 表示される文字は1文字ずつ増えていく。 // その位置を変数kで表している。 // 最初はのループでは 1文字しか表示されないので15, // 次のループでは2文字表示されるので15,14, // その次は3文字表示されるので15,14,13… lcd.locate(k,row); if ( len > (k - j) ){ // 表示したい文字は文字配列0から始まる。 // 最初のループはmsg[0]を表示し、 // 次のループでは、msg[0],msg[1] // その次のループでは、msg[0],msg[1],msg[2]…と増える。 lcd.printf("%c",msg[k-j]) ; printf("[%2d:%c]",k,msg[k-j]); // <= Debug }else{ // 文字列が16文字より少ない場合は、スペースを表示。 lcd.printf(" ") ; printf("[%2d:*]",k); // <= Debug } } // 時間待ち wait(time) ; printf("\r\n"); // <= Debug } printf("----- second loop -----\r\n"); // <= Debug // このループは移動した先頭の文字が消えて2番目の文字が左端の位置に // 移動する部分からの処理。 // 文字が16文字を超える可能性があるため、文字列がすべて消えるだけループする。 for ( j = 1 ; j <= len ; j++ ){ // 変数kは表示位置を指定しているので、0〜15の16回のループが必要になる。 printf("(%2d)",j); // <= Debug for ( k = 0; k < SIZE ; k++ ){ // この時点で最初の文字は左端に表示されている。 // そのため、表示位置は左端である0からの表示になる。 lcd.locate(k,row) ; // 表示する文字もmsg[1]が最初の文字になる。 if( ( k + j ) < len ){ lcd.printf("%c",msg[k+j]) ; printf("[%2d:%c]",k,msg[k+j]); // <= Debug }else{ // k+j