トップページ > 電子工作インデックス > シューティングゲーム > 画面出力関数
出力関数そのものは非常に単純なものです。信号線で指定できるのは チップ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)
}
//********************************************************************
//********************************************************************
//表示用データを入れておく配列を用意。(ヨコ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);
}
}
}
}
//********************************************************************