H8-3069ネット対応マイコンにMESを入れる > 基本編4.ブラウザから入力した文字列を液晶に表示させる

4.ブラウザ入力した文字列を液晶に表示

予め配列に入れた文字を表示

前回の「3.DIPスイッチの入力確認」が出来たら、今度はその斜め左下に付いている液晶(SC1602BS*B)に文字列を表示するプログラムを作ってみようと思います。このページでの目標は、ブラウザ画面から入力した文字列を液晶画面に表示させることです。しかし、その前に簡単なのからやっていきます。まずはあらかじめ配列に入れておいた文字列を液晶に表示させる、というのをやります。

I/O BOARDのLCD(SC1602BS*B)

/*予め配列に入れておいた文字列を 液晶に表示する*/ #include <string.h> #include <mes2.h> int main() { unsigned char lcd[] = "HAPPY!!!"; int fd; fd = open("lcd0", 0); write(fd, lcd, strlen(lcd)); close(fd); }

上のプログラムをlcd1.cという名前で保存します。保存先はC:\mes\lcd1フォルダの中にします(lcd1フォルダをmesフォルダの中に新規作成する)。
なお、lcd1.cが欲しい場合はこちらにおきます。ご自分のPCにダウンロードしたうえでお使いください。
このlcd1.cをコンパイル、RAMに転送します。そして、下のようにlcd1.elfを実行すると、LCD画面にHAPPY!!!という表示がされます。

ハイパーターミナルでlcd1.elfを実行する LCDにHAPPY!!!が表示されたところ

動きました。でも、このプログラムで、まだちょっと不明点があります(自分で書いたくせに)。それは、strlenという文字列の長さを調べる関数を使うために書いたヘッダファイル「string.h」です。この#include <string.h>は書かなくても動くようなのです。これはコンパイルの関係だとは思うのですが、とても不思議です。もし、エラーであれば、コンパイル時にエラーが出るはずですよね?このようにincludeせずに使ってエラーが出ないということは、うまくstrlenが使えるように読み出されている、ということになります。
この不思議について何かご存知の方がいらっしゃれば、トップページのコメント送信欄からポチっと送ってくだされば助かります。

ハイパーターミナルから入力した文字列を表示

次は、ハイパーターミナルから入力した文字列を液晶に表示します。

/*ハイパーターミナルから入力した文字列を液晶に表示*/ #include <string.h> #include <mes2.h> int main() { unsigned char lcd[82]; char *a; int fd,i,r = 0; // ポインタに配列lcdの先頭アドレスを入れる a = lcd; // LCD画面の消去 fd = open("lcd0", 0); for(i=0;i<32;++i){ seek(fd, i); fprintf(fd, " "); } close(fd); printf("入力してください:"); do{ // 文字入力があるまで待つ while(r == 0){ r = read(1, a, 80); } // 画面に入力中の文字を表示する printf("%c",*a); r = 0; // ポインタaを一要素分進める a = ++a; } // ENTERキーが押されるまで受け付ける while(*(a-1)!= 0x0D); // 終端記号を入れる *(a-1) = '\0'; // LCDに表示する fd = open("lcd0", 0); write(fd, lcd, strlen(lcd)); close(fd); }

このlcd2.cはこちらにおきます。ダウンロードして使ってください。保存先はC:\mes\lcd2フォルダの中にします(lcd2フォルダをmesフォルダの中に新規作成する)。そして、コンパイル、RAMに転送します。そして下のようにlcd2.elfを実行します。

ハイパーターミナルからlcd2.elfを実行したところ

ハイパーターミナルの画面に「入力してください:」と出たら、何か適当な文字列(半角英数字または半角カタカナ)を打ち込み、Enterキーを押します。ここでは「mendori Happy!」と打ち込んでEnterキーを押しました。すると次のような表示になります。

文字列を打ち込んだところ 液晶にハイパーターミナルから入力した文字列が表示された

ここでのポイントは2つ。まずはseekを使って液晶画面を消す(というか空白で埋めた)ところ。このseekの使い方はこれで合ってるのかな?まあ消せたので良いことにします。
それからもう一つのポイントは、「文字」ではなくて「文字列」を受け取るためにEnterキーが押されるまで受け取り続ける、ところです。0x0Dは文字コード表によると、CR(復帰)。このCRを受け取ったら、readをやめて、ポインタaの一つ前の要素(つまりCRが入ってるところ)に'\0'(文字列の終わり)をつけてやりました。要るのかどうかはわかりませんが、まあ一応つけました。
ちなみに、r = read(1, a, 80);の1は、標準入力(com1=sci1)の意味です。標準入出力はopenせずに使ってよい、みたいですね。

ブラウザから入力した文字列を表示

次はブラウザを使って文字列を表示します。先ほどのハイパーターミナルのプログラムより分かりやすいですね。

/*ブラウザから入力した文字列を表示*/ #include <string.h> #include <mes2.h> int main(int argc, char **argv) { unsigned char lcd[82]; int fd; cgi_value(argv[1], "lcd", lcd, 80); printf("<html><body>\r\n"); printf("<h1>LCDテストページ</h1><hr>\r\n"); printf("<p>argcは%dです。</p>\r\n",argc); printf("<p>*argvは%sです。</p>\r\n",*argv); printf("<p>*(argv+1)は%sです。</p>\r\n",*(argv+1)); printf("<form action=\"%s\">",*argv); printf("LCD<input type=\"text\" name=\"lcd\" ><br>\r\n"); printf("<input type=\"submit\" value=\"submit\" ><br>\r\n"); printf("</form></body></html>\r\n"); fd = open("lcd0", 0); write(fd, lcd, strlen(lcd)); close(fd); }

このlcd3.cはこちらにおきます。ダウンロードして使ってください(上のをコピペすると、改行の関係でエラーになります)。保存先はC:\mes\lcd3フォルダの中にします(lcd3フォルダをmesフォルダの中に新規作成する)。そして、コンパイル、RAMに転送します。そしてhttp.elfを実行し、ブラウザを立ち上げてhttp://192.168.10.2/lcd3.elfを開きます。下のような表示になります。

まだ入力してない状態のブラウザ表示

まだ入力してないので*(argv+1)は何も表示されません。液晶の表示も下のように何も出ていません。

まだ入力してない状態の液晶表示

ここで、ブラウザから「Happy!!!」と打ち込んでSubmitボタンを押します。するとブラウザと液晶の画面は次のようになります。

submitボタンを押したあとのブラウザ表示 submitボタンを押したあとのの液晶表示

できました。%21が!(感嘆符)のアスキーコードですね。このブラウザからの表示は「基本編3.LEDの点灯消灯プログラム」をいじっただけです。理屈は同じなので説明は割愛します。

次は5.8*8ドットマトリックスLEDを使ってみるです。>> 






[PR]横浜で超魅力価格の記念写真を:記念写真が大人気、結婚写真、成人式写真