H8-3069ネット対応マイコンにMESを入れる > 基本編6.8*8ドットマトリックスLEDで文字表示

6.8*8ドットマトリックスLEDで文字表示

文字を表示しよう

パソコンから文字を送って、その文字をドットマトリックスLEDに表示するプログラムを作りました。実行すると次の動画のように表示されます。
*動画を見るにはQuick Timeプラグインが必要です。


今回の文字送信には、基本編10で行ったLabVIEWでの送信を流用しました(実際に使用したのは基本編11で作ったプログラムです)。

LabVIEWで作ったプログラムからから文字を送信し、マイコンボード上のsci0を使ってH8マイコンで受け取ります。受け取った文字がAなら受信をやめて、ドットマトリクスLEDにAを書きます。

動画では、C・C・C・Aの順で文字を送りました。C送信時点ではなにも起こりません。Aを送信したところH8では文字の受信をやめ、LEDへの表示がされることを確認しました。

ブロックダイアグラム

プログラム

プログラムは、「基本編5.ドットマトリクスLEDを使ってみる」のプログラムと「基本編8.シリアルポートsci0を使ってみる(受信)」のプログラムをドッキングして改変しました。私の場合、接続方法は前回のままです。個々人でどのように配線したかによってどのレジスタを使っているか変わってきます。大変ではありますが、一つ一つ図面と格闘してください。

/*シリアルポートsci0を使った通信*/ /*(ドットマトリクス受信)*/ #include <h8/reg3067.h> //レジスタの定義 #include <string.h> #include <mes2.h> int main() { /*初期設定*/ PADDR = 0xFF; //ROW側(固定) PADR = 0x00; //クリア PBDDR = 0xCF; //COL側(固定) PBDR |= 0x00; //クリア P8DDR = 0xFD; //COL側(固定) P8DR |= 0x00; //クリア P9DDR = 0xD0; //COL側(固定) P9DR |= 0x00; //クリア int fd,i,len,r = 0; unsigned char lcd[82]; char *a; unsigned char Word[] = "ニュウリョクシテクダサイ:"; /*初期設定ここまで*/ // ポインタに配列lcdの先頭アドレスを入れる a = lcd; // LCD画面の消去 fd = open("lcd0", 0); for(i=0;i<32;++i){ seek(fd, i); fprintf(fd, " "); } close(fd); fd = open("com0", 0); write(fd, Word, strlen(Word)); close(fd); do{ // 文字入力があるまで待つ while(r == 0){ fd = open("com0",0); sleep(80); r = read(fd, a, 1); close(fd); printf("%d",r); } r = 0; // ポインタaを一要素分進める a = ++a; } // Aキーが押されるまで受け付ける while(*(a-1)!= 'A'); //受信したらLCDに書き出す fd = open("lcd0", 0); write(fd, lcd, strlen(lcd)); close(fd); len = strlen(lcd); printf("\r\n%d文字受信しました\r\n",len); // ドットマトリクス表示 while(1){ PBDR = 0x48; //ROW PADR = 0x01; //COL-1行目 sleep(10); PBDR = 0x84; //ROW PADR = 0x02; //COL-2行目 sleep(10); PBDR = 0x02; //ROW P8DR |= 0x01; //ROW PADR = 0x04; //COL-3行目 sleep(10); P8DR = 0x00; //ROWクリア PBDR = 0x01; //ROW P9DR |= 0x10; //ROW PADR = 0x08; //COL-4行目 sleep(10); PBDR = 0x01; //ROW P9DR |= 0x10; //ROW PADR = 0x10; //COL-5行目 sleep(10); PBDR = 0xCF; //ROW P8DR |= 0x01; //ROW P9DR |= 0x10; //ROW PADR = 0x20; //COL-6行目 sleep(10); P8DR = 0x00; //ROWクリア PBDR = 0x01; //ROW P9DR |= 0x10; //ROW PADR = 0x40; //COL-7行目 sleep(10); PBDR = 0x01; //ROW P9DR |= 0x10; //ROW PADR = 0x80; //COL-8行目 sleep(10); P9DR = 0x00; //ROWクリア } }

ここにプログラムをおきます。参考程度にとどめてください。

文字の表示は、COL(PADRレジスタにつながっている)を一つずつずらして表示させます。途中、P8DRやP9DRを0でクリアして、Aの表示がうまくいくようにします。

やり終えた後、AだけじゃなくBとかCとかアルファベット全文字についてやってみる気は全く起きませんでした(笑)。どこのビットに1を立てるのか考えるのが手間です。

なお、今回のプログラムはAの表示をし始めたらそこから永久ループに入る書き方になっています。本来のプログラムの書き方からすると望ましくないと思います。ここでは何かボタンを用意して、押されたらループを抜ける書き方にしてください。私は面倒だったので省略しました。終わらせるときは、リセットボタンを押して終わらせてました。

次は7.シリアルポートsci0を使ってみる(送信)です。>> 






[PR]看護師の好条件求人なら:転職活動不安ですか?なんでも相談OK!