トップページ > 電子工作インデックス > テトリス > 10. LCD制御関数
グローバル変数のscoreとhigh_scoreを読んで、それを液晶ディスプレイ (Liquid Crystal Display、以下LCD) に出力する関数です。scoreは1列消去関数のところで書きかえています。 LCDは秋月さんで売っているキャラクタ2行のものを使用しています。4ビットモードです。
ハードの仕様についてですが、今回はH8のポート6を使うことにしました。 ビット0〜3が4ビットデータ出力ピン、ビット4は表示する文字データなのかLCDに対する 制御データなのかを知らせるRS(Resiser Select)ピン、ビット6は書き込みタイミングを知らせる E(Enable)ピンとしています。ビット5を使っていないのは、製作途中に誤って破壊してしまったから なので、特に意味があってやっているわけではありません(汗)
4ビットデータを出力し、Eピンを"0"→"1"とするとデータが書き込まれます。 この際、RSピンが"0"なら制御信号、"1"なら文字データ(ASCIIコード)とみなされます。
//******************************************************************** //文字データ(8ビット)を受け取って、液晶に1文字表示させる関数 void lcd_char_trans(char data) { //転送データの写しを作っておきます。 cahr data_temp; data_temp = data; //文字データなので、RSピンは"1"にしておきます。 P6.DR.BIT.B4 = 1; p6.DR.BIT.B6 = 0; //先に上位4ビットを出力します。 data = data >> 4; data = data&0x0f; P6.DR.BYTE = data; //Eピンの立ち上がりで書き込み P6.DR.BIT.B6 = 1 lcd_wait(); P6.DR.BIT.B6 = 0; //念のためウェイト入れときます。 lcd_wait(); //次は下位4ビットを出力。 data_temp = (data_temp & 0x0f) P6.DR.BYTE = data_temp; //Eピンの立ち上がりで書き込み P6.DR.BIT.B6 = 1 lcd_wait(); P6.DR.BIT.B6 = 0; //念のためウェイト入れときます。 lcd_wait(); } //******************************************************************** //lcdをコントロールするデータを送る関数です。 //実際のところ下位4ビットのみしか効かないのですが…。 void lcd_data_trans(char data) { //制御データなので、RSピンは"0"にしておきます。 P6.DR.BIT.B4 = 0; p6.DR.BIT.B6 = 0; P6.DR.BYTE = data; //Eピンの立ち上がりで書き込み P6.DR.BIT.B6 = 1 lcd_wait(); P6.DR.BIT.B6 = 0; //念のためウェイト入れときます。 lcd_wait(); } //********************************************************************
//******************************************************************** //文字列(配列に格納したもの)を受けて、それを表示します。 //前もってposition()関数で表示開始位置を指定しておく必要があります。 void lcd_string_out(char *string) { //文字列の最後(ヌル文字)までループ while(*string != '\0') { //1文字表示関数を呼び出します。 lcd_char_trans(*str); //次の文字を読み込みます。(配列はアドレスの値が連続しているから…。) str++; } } //********************************************************************
//******************************************************************** //文字の表示開始位置を決める関数 //yに0x08を入れると1行目が選択され、0x0cを入れると2行目が選択されます //yについては関数を呼び出す側で調整してください…。 //xはただ数を入れるだけでOKです。 void lcd_position(int y,int x) { P6.DR.BYTE=0; lcd_data_trans(y); lcd_data_trans(x); lcd_wait(); } //********************************************************************
//******************************************************************** void lcdclear(void) { P6.DR.BYTE=0; lcd_data_trans(0); lcd_data_trans(1); } //********************************************************************
付属のデータシートの通りですので特筆事項はありません…。main関数の最初の部分で 呼び出して、初期設定をします。
//******************************************************************** void lcdini(void) { lcd_data_trans(3); lcd_data_trans(3); lcd_data_trans(3); lcd_data_trans(2); lcd_data_trans(2); lcd_data_trans(8); lcd_data_trans(0); lcd_data_trans(0x0c); lcd_data_trans(0); lcd_data_trans(6); } //********************************************************************
//******************************************************************** //単なる時間稼ぎ関数です。 void lcd_wait(void) { int t = 1000; while(t--); } //********************************************************************ソースコード
//******************************************************************** //ハードウェアの仕様 //液晶はポート6につながっています。 //1〜4番目のピン(P6.DR.BIT.B0〜P6.DR.BIT.B3) → 液晶のデータ //5番目のピン(P6.DR.BIT.B4) → RSピン //6番目のピン (P6.DR.BIT.B5) → Eピン //******************************************************************** //液晶にscoreを表示する関数 int score_out(void) { //ハイスコアを更新 if(highscore<score) high_score = score; //計算用にデータを写しておきます unsigned long h_temp = highscore; unsigned long s_temp = score; //LCD表示文字列用の配列を作ります。 char string1[8]; char string2[8]; //high_scoreとscoreに記録された数値を文字列に直します。 //基本アルゴリズム:10で割った余りを配列に格納→10で割る…を繰り返す。 for(i=0;i<8;i++) { //<注意>配列の0番目の要素から順に、一の位、十の位…と入っていきます。 string1[i] = (char)(h % 10); string2[i] = (char)(s % 10); h_temp /=10; s_temp /=10; } //---------------------------------------------------- //前のデータを消します。 lcdclear(); //---------------------------------------------------- //一行目にhigh_scoreを表示 lcd_position(0x08,0x00); out("max :"); for(i=8;i>=0;i--) { lcdo(s1[i]+'0'); } //----------------------------------------------------- //二行目にscoreを表示 lcd_position(0x0c,0x00); out("score:"); for(i=8;i>=0;i--) { lcdo(s2[i]+'0'); } } //********************************************************************前へ テトリスTOP