トップページ > 電子工作インデックス > シューティングゲーム > 画面出力関数
出力関数そのものは非常に単純なものです。信号線で指定できるのは チップ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); } } } } //********************************************************************