トップページ >
電子工作インデックス >
テトリス >
1. 電光掲示板に表示させる
1. 電光掲示板に表示させる
ここからはソフトウェアの内容になります。
とりあえず単純に1画面を表示することを考えるので、技巧的なテクニック等は一切
使っていません…。(使いたくても使えないのですが。)
基本動作は、
-
配列を用意する
-
一行分のデータを出力
-
ウェイトを入れる
-
また次の行を読み出し。
…38行分くりかえしたら、また最初から。
-
1〜4を繰り返す回数で、画面1コマあたりの時間を調整。
例のごとく、表示の原理のページの動画参照です。
あの動画はソースコード内のwait()関数の時間をいろいろ変えて撮っています。
ソースコード(あくまでイメージ)
//define値
#define display_time 10 //画面1コマを表示する時間(1画面だけなら必要なし)
//グローバル変数など
char display[38][24]; //ゲーム画面を記憶するための配列。
//********************************************************************
//画面に出力
int output(void)
{
int column , a;
//全体を繰り返します。1画面(1コマ)表示する時間を決めます。
for( a = 0 ; a < display_times ; a++ )
{
//38行分繰り返します。
for( row = 0 ; row < 38 ; row++ )
{
PA.DR.BYTE = row; //デコーダに行データを出力。
//--------------------------------------------------------------------
//ポート1,2,3はトランジスタアレイ基盤につながっていて、
横方向のLEDのON-OFFを決める。
//「P1.DR.BIT.〜」は出力ポートを指す共用体です…。
P1.DR.BIT.B0 = display[row][0];
P1.DR.BIT.B1 = display[row][1];
P1.DR.BIT.B2 = display[row][2];
P1.DR.BIT.B3 = display[row][3];
P1.DR.BIT.B4 = display[row][4];
P1.DR.BIT.B5 = display[row][5];
P1.DR.BIT.B6 = display[row][6];
P1.DR.BIT.B7 = display[row][7];
P2.DR.BIT.B0 = display[row][8];
P2.DR.BIT.B1 = display[row][9];
P2.DR.BIT.B2 = display[row][10];
P2.DR.BIT.B3 = display[row][11];
P2.DR.BIT.B4 = display[row][12];
P2.DR.BIT.B5 = display[row][13];
P2.DR.BIT.B6 = display[row][14];
P2.DR.BIT.B7 = display[row][15];
P3.DR.BIT.B0 = display[row][16];
P3.DR.BIT.B1 = display[row][17];
P3.DR.BIT.B2 = display[row][18];
P3.DR.BIT.B3 = display[row][19];
P3.DR.BIT.B4 = display[row][20];
P3.DR.BIT.B5 = display[row][21];
P3.DR.BIT.B6 = display[row][22];
P3.DR.BIT.B7 = display[row][23];
//--------------------------------------------------------------------
wait(); //1行ごとにウェイトを入れる。
//ここで一度すべてのLEDをOFFにしないとゴーストが出ます。
P1.DR.BYTE = 0x00;
P2.DR.BYTE = 0x00;
P3.DR.BYTE = 0x00;
}
}
}
//********************************************************************
void wait(void)
{
int t = 50; //てきとーです。
while( t-- );
}
解説(言い訳)
ハードウェア構成は、H8のポート1,2,3にLEDドライバ基盤、
ポートAにデコーダ基盤をつなげています。ソースコード内では、
最初にデコーダ基盤に行データを出して行を指定し、次に指定した行のデータを配列
から読みだしてLEDドライバ基盤に出力しています。表示用配列fieldはグローバル変数
にしてしまっているので、他の関数でfieldを書き換えた上でまたこの関数を呼び出せば
画面を変えることができます。その際、display_timesで指定した時間だけ1つの画面を
保持します。これでFPS(Frame Per Second)とかをいじれるようになっています。
配列はchar型を使っているのに、実質LEDを光らせる/光らせない、の0か1しか記録していません。
配列の1ブロックあたり、第1ビット以外の残り7ビットは無駄にしているということです。
共用体とか使えよってかんじですが…。分かりやすく
サッと作ろうとしたので手抜きをしてしまいました。。。