トップページ > 電子工作インデックス > シューティングゲーム > 画面出力関数

画面出力関数




出力関数そのものは非常に単純なものです。信号線で指定できるのは チップ1かチップ2か…だけで、具体的に何行何列目にデータを書き込む (表示する)かは制御コードを送信することで決定します。


//********************************************************************

//グラフィック液晶ディスプレイの使い方
//まず、main()関数の初期設定でGLCDini()を呼び出してください。

//出力関数out()について…。

//void out(char data,unsigned char chip,unsigned char flag)
//[データ],[横方向のチップ(1or2)],[データ(1)なのかコマンドなのか(0)]

//********************************************************************

#include <3048.h>


//ピン・アサインメント
//D0〜D7   PortB
//D/I     PA.DR.BIT.B0
//E        PA.DR.BIT.B1
//CS1      PA.DR.BIT.B2
//CS2      PA.DR.BIT.B3

//********************************************************************
//ピンの設定

#define Di    PA.DR.BIT.B0
#define E     PA.DR.BIT.B1
#define CS1   PA.DR.BIT.B2
#define CS2   PA.DR.BIT.B3

//********************************************************************
//関数プロトタイプ宣言

void out(char data,unsigned char chip,unsigned char flag);
void GLCDini(void);

//********************************************************************
//グラフィック液晶に8ビットデータを転送する関数

void out(char data,unsigned char chip,unsigned char flag)
//<データ>、<横方向のチップ(1or2)>、<データ(1)なのかコマンドなのか(0)>
{


  //------------------------------------------------------------------
  //まずデータか制御コードかを判別します。

  if(flag == 0) Di =0;
  else Di =1;
  

  //------------------------------------------------------------------
  //チップ1が選択された場合

  if(chip == 1)
  {
    CS1=1;
    CS2=0;
  }
  
  //------------------------------------------------------------------
  //チップ2が選択された場合
  
  else
  {
    CS1=0;
    CS2=1;
  }
    

  //データ出力
  pbdr=data;

  //ダウンエッジを与えます      
  E = 1;
  E = 0;
  E = 1;
}



//********************************************************************
//グラフィック液晶仕様のための初期化関数

void GLCDini(void)
{

  //------------------------------------------------------------------
  //マイコン側の設定

  paddr=0xff;
  pbddr=0xff;

  //------------------------------------------------------------------
  //液晶ディスプレイ側の設定

  out(0x3f,1,0);  //チップ1を表示ON
  out(0x3f,2,0);  //チップ2も表示ON
  
  out(( 0xb8 | 0x00 ),1,0); //ページセット(0〜7)
  out(( 0x40 | 0x00 ),1,0); //コラムセット(0〜64)

}

//********************************************************************




64×128の配列を元に、画面を表示する


//********************************************************************

//表示用データを入れておく配列を用意。(ヨコ128ドットが64列並んでいるイメージです。)
//この配列には”配列変換”で生成した画像データや、ゲーム画面を扱う配列などを用意します。

char display_data[64][128]={};

//********************************************************************
//ビットごとに変数を扱うための共用体をつくっておきます。

  struct BIT
  {
    char b7:1;
    char b6:1;
    char b5:1;
    char b4:1;
    char b3:1;
    char b2:1;
    char b1:1;
    char b0:1;
  };
  
  union Bit_Data
  {
    struct BIT bit ;
    char byte; 
  };

//********************************************************************
//配列からデータを取り込んで1画面表示を行う関数

void array_out(void)
{
  //for文用変数。高速化のためにregister指定としました。
  register char i,j,k;

  //配列のデータを一時的に移すための変数。
  union Bit_Data temp;

  //チップセレクト(k=0でchip1(左)、k=1でchip2(右))
  for(k=0;k<=1;k++)
  {  
 
    //表示位置を0番地に指定。
    out(0x40,k+1,0);
    out(0xc0,k+1,0);
 

    //ページセレクト(一番上のラインから、8ビットごとに8列  = 64ドット)
    for(j=0;j<8;j++) 
    {
      out((0xb8|j),k+1,0);


      //コラムセレクト(ヨコ方向への移動。 自動ですが…)
      for(i=0;i<64;i++)
      { 
        if(i==0)
        {
           //最初のときだけ、左寄せにして位置をリセットします。
           out(0x40,k+1,0);
        }


        temp.bit.b0 = display_data[7+8*j][i+64*k];
        temp.bit.b1 = display_data[6+8*j][i+64*k];
        temp.bit.b2 = display_data[5+8*j][i+64*k];
        temp.bit.b3 = display_data[4+8*j][i+64*k];
        temp.bit.b4 = display_data[3+8*j][i+64*k];
        temp.bit.b5 = display_data[2+8*j][i+64*k];
        temp.bit.b6 = display_data[1+8*j][i+64*k];
        temp.bit.b7 = display_data[0+8*j][i+64*k];
  
        //out()関数を呼び出して出力。
        out(temp.byte,k+1,1);

      }
    }
  }
}
//********************************************************************




前へ   次へ