トップページ > 電子工作インデックス > テトリス > 1. 電光掲示板に表示させる

1. 電光掲示板に表示させる

ここからはソフトウェアの内容になります。
とりあえず単純に1画面を表示することを考えるので、技巧的なテクニック等は一切 使っていません…。(使いたくても使えないのですが。)

基本動作は、
  1. 配列を用意する
  2. 一行分のデータを出力
  3. ウェイトを入れる
  4. また次の行を読み出し。 …38行分くりかえしたら、また最初から。
  5. 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ビットは無駄にしているということです。 共用体とか使えよってかんじですが…。分かりやすく サッと作ろうとしたので手抜きをしてしまいました。。。

前へ   次へ