|
4個(gè)8×8led顯示屏組成的,16X16點(diǎn)陣飛機(jī)射擊游戲帶源碼和仿真,下面是仿真原理圖:
16X16點(diǎn)陣飛機(jī)射擊游戲單片機(jī)源程序:
- /*******************************************************
- *******16X16點(diǎn)陣飛機(jī)射擊游戲****************************
- ********************************************************
- **廣東技術(shù)師范學(xué)院天河學(xué)院-電氣工程系-電氣062班*********
- ***************梁宏閣***********************************
- *******************************************************/
- ////////////////////////////////////////////////////////
- #include "reg51.h"
- #include "absacc.h"
- #include "intrins.h"
- #include "stdio.h"
- ///////////////////
- #define DENGFANKAISHIJIAN 30
- #define QUDOUDONGSHIJIAN 2
- /////////////
- sbit P21 =P2^1 ;
- sbit P22 =P2^2 ;
- sbit P23 =P2^3 ;
- sbit P24 =P2^4 ;
- #define P00 P0
- ////////////////////
- sbit A_L =P1^1 ; //左移動
- sbit A_R =P1^2 ; //右移動
- sbit A_F =P1^3 ; //射擊
- sbit A_S =P1^4 ; //開始/暫停
- sbit A_T =P1^5 ; //退出
- ///////////////////////////////////
- #define ZUO(a) P00=a;P24=0;P24=1
- #define YOU(a) P00=a;P21=0;P21=1
- #define SHANG(a) P00=a;P22=0;P22=1
- #define XIA(a) P00=a;P23=0;P23=1
- //////////////////////////////////////////
- //////////////////////////////////////////
- typedef struct //"飛機(jī)"用結(jié)構(gòu)體統(tǒng)一信息
- {
- unsigned char x; //飛機(jī)的X坐標(biāo),最大為9
- unsigned int t; //飛機(jī)頭顯示內(nèi)容
- unsigned int w;//飛機(jī)尾顯示內(nèi)容
- } FEIJI;
- FEIJI feiji;//定義飛機(jī)變量
- ///////////////////////////
- idata char GoOrStay ;//狀態(tài)標(biāo)記-1為未開始,0為正在游戲,1為暫停,2為設(shè)置狀態(tài)
- idata char TU_Y;//最接近飛機(jī)的Y軸標(biāo)記自向下數(shù),最上層為1,無層時(shí)為0
- idata char xuanze;//選擇start為0否為1
- idata unsigned char Guan;//關(guān)數(shù)
- unsigned char TU[32];//16X16圖像數(shù)組
- idata unsigned char time_a=0;
- idata unsigned int time_b=0;//定時(shí)器內(nèi)和關(guān)數(shù)有關(guān)的增量
- ////////////////////////////////
- /*3x5字模*/
- unsigned char code S_3X5[10][5]={{0x0e,0x0a,0x0a,0x0a,0x0e}/*0*/,{0x04,0x0c,0x04,0x04,0x04}/*1*/,
- {0x0e,0x02,0x0e,0x08,0x0e}/*2*/,{0x0e,0x02,0x0e,0x02,0x0e}/*3*/,{0x0a,0x0a,0x0e,0x02,0x02}/*4*/,
- {0x0e,0x08,0x0e,0x02,0x0e}/*5*/,{0x0e,0x08,0x0e,0x0a,0x0e}/*6*/,{0x0e,0x02,0x02,0x02,0x02}/*7*/,
- {0x0e,0x0a,0x0e,0x0a,0x0e}/*8*/,{0x0e,0x0a,0x0e,0x02,0x0e}/*9*/,
- };
- /*start+setup字模*/
- unsigned char code start_setup[32]={
- 0x1c,0x07,0x09,0x02,0x6a,0xb2,0x8a,0xaa,
- 0xeb,0xb2,0x2a,0xaa,0xca,0xaa,0x00,0x00,
- 0x03,0x80,0x01,0x06,0x6d,0x55,0x89,0x56,
- 0xed,0x54,0x29,0x54,0xcd,0x74,0x00,0x00};
- unsigned char code start[32]={
- 0x1c,0x07,0x09,0x02,0x6a,0xb2,0x8a,0xaa,
- 0xeb,0xb2,0x2a,0xaa,0xca,0xaa,0x00,0x00,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
- unsigned char code setup[32]={
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0x03,0x80,0x01,0x06,0x6d,0x55,0x89,0x56,
- 0xed,0x54,0x29,0x54,0xcd,0x74,0x00,0x00};
- /*STAY字模*/
- unsigned char code stay[32]={
- 0x00,0x00,0x1f,0x00,0x04,0x11,0x04,0x0a,
- 0x74,0x04,0x84,0xc4,0x85,0x24,0x65,0x24,
- 0x15,0x24,0x15,0xe4,0xe5,0x20,0x05,0x20,
- 0x01,0x20,0x00,0x00,0x00,0x00,0x00,0x00
- };
- /*OVER字模*/
- unsigned char code over[32]={
- 0xaa,0xaa,0xff,0xff,0x00,0x00,0x00,0x06,
- 0x05,0x35,0x65,0x45,0x95,0x46,0x95,0x75,
- 0x95,0x45,0x65,0x45,0x02,0x35,0x00,0x00,
- 0xff,0xff,0x55,0x55,0xff,0xff,0x55,0x55
- } ;
- /*WIN字模*/
- unsigned char code win[32]={
- 0x55,0x55,0xff,0xff,0x00,0x00,0xa9,0x40,
- 0x55,0x40,0x55,0x40,0x48,0x80,0x00,0x00,
- 0x0a,0xa4,0x0a,0xaa,0x05,0x2a,0x00,0x00,
- 0xff,0xff,0x00,0x00,0xff,0xff,0xaa,0xaa
- };
- ///////////函數(shù)聲明/////////////////////
- extern void feijitu(void); //根據(jù)飛機(jī)的x坐標(biāo)寫出它的頭尾形狀,再給回TU數(shù)組
- extern void ZHENGJIAYIXING(void);//增加一行
- extern void chuqihua(void);//初始化顯示
- extern void DELAY(unsigned int a); //延時(shí)子函數(shù)a最大為十進(jìn)制65535
- //extern unsigned char zhenli(unsigned char a);//整理調(diào)整函數(shù)
- extern void dian1616(unsigned char ZZ[]);//16X16顯示主函數(shù)
- extern void guanshu(unsigned char n);//將當(dāng)前關(guān)卡加入到數(shù)組
- extern void QuDouDong(unsigned int a);//去抖動,同時(shí)顯示
- extern void SheJi(void); //射擊調(diào)整函數(shù)
- extern void AnNiu_S(void);//判開始暫停按鈕
- extern void AnNiu_T(void);//判斷退出按鈕
- extern void AnNiu_L(void);//判左移按鈕
- extern void AnNiu_R(void);//判右移出按鈕
- extern void AnNiu_F(void);//判射擊按鈕
- extern void AnNiu(void);//按鈕合集
- extern void SHANstart(void);//閃START
- extern void SHANsetup(void);//閃SETUP
- extern void SHAN( char a);//閃0閃start,1閃setup
- extern void winORfail(void);//判斷勝利還是失敗
- ///////////////////////////////////////
- /////////////////////////以下為顯示一個(gè)16X16/////
- void DELAY(unsigned int a) //延時(shí)子函數(shù)a最大為十進(jìn)制65535
- {while(a--)
- ;
- }
- void dian1616(unsigned char ZZ[])//16X16主函數(shù)
- { unsigned char a,b; //a放行號,b放字在數(shù)組的序號
- if(GoOrStay!=2)
- feijitu(); //加入飛機(jī)位置狀態(tài)
- guanshu(Guan); //關(guān)數(shù)
- b=0;
- XIA(0x00); //不送出下半部分
- for(a=0x01;a!=0;a=(a<<1)) //上半個(gè)字
- {
- DELAY(50) ;//延時(shí)一小段時(shí)間為看清楚
- ZUO(ZZ[b]) ; //調(diào)調(diào)整函數(shù),送出左
- b++ ;
- YOU(ZZ[b]); //送出右
- b++ ;
- SHANG(a) ;//送出行號
- DELAY(50) ;//延時(shí)一小段時(shí)間為了字型顯示更清楚
- ZUO(0) ; //消影
- YOU(0);
- }
- SHANG(0x00); //不送出上半部分
- for(a=0x01;a!=0;a=(a<<1)) //下半個(gè)字
- { DELAY(50) ;//延時(shí)一小段時(shí)間為看清楚
-
- ZUO(ZZ[b]) ; //調(diào)整函數(shù),送出左
- b++ ;
- YOU(ZZ[b]); //送出右
- b++ ;
- XIA(a); //送出行號
- DELAY(50) ;//延時(shí)一小段時(shí)間為了字型顯示更清楚
- ZUO(0) ; //消影
- YOU(0);
- }
- }
- //////////////////以上為顯示一個(gè)16X16////
- void ZHENGJIAYIXING(void)//增加一行
- {
- char a;
- for(a=15;a>-1;a--)
- { TU[2*(a+1)]=TU[2*a];
- TU[2*(a+1)+1]=((TU[2*a+1]&0xe0)|(TU[2*(a+1)+1]&0x3f)); //保留信息狀態(tài)區(qū)的內(nèi)容
- }
- TU[0]=0xff; //補(bǔ)上第0行顯示內(nèi)容
- TU[1]=(0xe0|(TU[1]&0x3f)); //保留信息狀態(tài)區(qū)的內(nèi)容
- TU_Y=(TU_Y+1);
- }
- ////
- void feijitu(void) //根據(jù)飛機(jī)的x坐標(biāo),寫出它的頭尾形態(tài),并再其給回TU數(shù)組
- {
- unsigned char a;
- feiji.t=0x8000;
- for(a=0;a<feiji.x;a++)
- {
- feiji.t>>=1; //右移一位
- }
- feiji.w=(((feiji.t|(feiji.t>>1)&0xffe0)|(feiji.t<<1))&0xffe0); //尾顯示形態(tài)
- feiji.t=(feiji.t&0xffe0)|((unsigned int)(0x20|(TU[29]&0x3f))); //保留信息狀態(tài)區(qū)的內(nèi)容
- feiji.w=(feiji.w&0xffe0)|((unsigned int)(0x20|(TU[31]&0x3f))); //保留信息狀態(tài)區(qū)的內(nèi)容
- TU[28]=(unsigned char)(feiji.t>>8);
- TU[29]=(unsigned char)feiji.t;
- TU[30]=(unsigned char)(feiji.w>>8);
- TU[31]=(unsigned char)feiji.w;
- }
- ///
- void guanshu(unsigned char n) //將當(dāng)前關(guān)卡加入到數(shù)組
- {
- char a;
- if(n<10)
- {
- for(a=2;a<7;a++)
- {
- TU[2*a+1]=(TU[2*a+1]&0xe0)|S_3X5[n][a-2];
- }
- }
- }
- ///////////////////////////
- void SHANstart(void) //閃start
- { char a;
- a=15;
- while(a--)
- {
- dian1616(setup); //顯示
- AnNiu();
- }
- a=15;
- while(a--)
- { dian1616(start_setup); //顯示
- AnNiu();
- }
- }
- //
- void SHANsetup(void) //閃setup
- { char a;
- a=15;
- while(a--)
- {
- dian1616(start); //顯示
- AnNiu();
- }
- a=15;
- while(a--)
- {
- dian1616(start_setup); //顯示
- AnNiu();
- }
- }
- //
- void SHAN( char a)//a決定0閃start,1閃setup
- {
- if(a==0)
- SHANstart();
- else
- SHANsetup();
- }
- /////////////////////////////////
- void QuDouDong(unsigned int a)//去抖動,同時(shí)顯示
- {
- while(a--)
- {
- if(GoOrStay!=2)
- feijitu(); //加入飛機(jī)位置狀態(tài)
- guanshu(Guan);//加入顯示關(guān)數(shù)
- dian1616(TU); //16x16點(diǎn)陣顯示
- }
- }
- ///////
- void AnNiu_S(void)//判開始按鈕
- {
- unsigned int n;//超時(shí)退出變量
- A_S=1;
- if(A_S==0)
- {
- A_S=1;
- QuDouDong(QUDOUDONGSHIJIAN);//去抖動
- if(A_S==0)
- {
- if(xuanze==0)//如為開始
- {
- if(GoOrStay==-1)
-
- GoOrStay=0;//標(biāo)記為開始
- else
- {
- if(GoOrStay==0)
- GoOrStay=1;//如果已開始則暫停
- else
- if(GoOrStay==1)
- {GoOrStay=0;//如果已暫停則開始
- }
- }
-
- }
- if(GoOrStay==2)//如為設(shè)置
- { GoOrStay=-1;//標(biāo)記為未開始
- xuanze=0;
- }
- if(xuanze==1)//如為選擇
- GoOrStay=2;
-
- //等手放開
- n=DENGFANKAISHIJIAN;
- while(A_S==0)
- {
- A_S=1;
- dian1616(TU); //顯示
- n--;
- if(n==0)
- break;//按鈕超時(shí)退出
- }
- }
- }
- }
- ////
- void AnNiu_L(void)//左按鈕
- {
- unsigned int n;//超時(shí)變量
- A_L=1;
- if(A_L==0)
- {
- A_L=1;
- QuDouDong(QUDOUDONGSHIJIAN); //去抖動
- if(A_L==0) //確認(rèn)進(jìn)入
- {
- if(GoOrStay==0)//如果正在游戲則用左右功能
- {
- if(feiji.x==0)//如果是最左則去最右
- {
- feiji.x=9;
- }
- else
- {
- feiji.x--;//沿x軸左移
- }
- }
- if(GoOrStay==-1)//如果未開始則為上下選擇功能
- {
- if(xuanze==0)
- xuanze=1;
- else
- xuanze=0;
- }
- if(GoOrStay==2)//如果為設(shè)置則選擇關(guān)數(shù)
- {
- if(Guan==9)
- Guan=0;
- else
- Guan++;
- }
- //等手放開
- n=DENGFANKAISHIJIAN;
- while(A_L==0)
- {
- A_L=1;
- dian1616(TU); //顯示
- n--;
- if(n==0)
- break;//按鈕超時(shí)退出
- }
- }//
- }
- }
- ///
- ////
- void AnNiu_R(void)//右按鈕
- {
- unsigned int n;//超時(shí)變量
- A_R=1;
- if(A_R==0)
- {
- A_R=1;
- QuDouDong(QUDOUDONGSHIJIAN); //去抖動
- if(A_R==0) //確認(rèn)進(jìn)入
- {
- if(GoOrStay==0)//如果正在游戲則用左右功能
- {
- if(feiji.x==9)//如果是最右則去最左
- {
- feiji.x=0;
- }
- else
- {
- feiji.x++;//沿x軸右移
- }
- }
- if(GoOrStay==-1)//如果未開始則為上下選擇功能
- {
- if(xuanze==0)
- xuanze=1;
- else
- xuanze=0;
- }
- if(GoOrStay==2)//如果為設(shè)置則選擇關(guān)數(shù)
- {
- if(Guan==0)
- Guan=9;
- else
- Guan--;
- }
- //等手放開
- n=DENGFANKAISHIJIAN;
- while(A_R==0)
- {
- A_R=1;
- dian1616(TU); //顯示
- n--;
- if(n==0)
- break;//按鈕超時(shí)退出
- }
- }//
- }
- }
- ///
- //////
- void AnNiu_T(void)//退出
- {
- unsigned int n;
- A_T=1;
- if(A_T==0)
- {
- A_T=1;
- if(A_T==0)
- {
- A_T=1;
- QuDouDong(QUDOUDONGSHIJIAN);//去抖動
- if(A_T==0)
- {
- chuqihua(); //初始化
- //等手放開
- n=DENGFANKAISHIJIAN;
- while(A_T==0)
- {
- A_T=1;
- dian1616(TU); //顯示
- n--;
- if(n==0)
- break;//按鈕超時(shí)退出
- }
- }
- }
- }
- }
- ///
- ///
- void SheJi(void) //射擊調(diào)整函數(shù)
- { idata char y;
-
- y=TU_Y;
-
- if(y!=0)
- {
- if(feiji.x<8)//找出最凹的y坐標(biāo)
- { //在左半面找
- for(;((~TU[2*(y-1)])&(0X80>>feiji.x))==((unsigned char)(feiji.t>>8));y--)
- ;
- }
- else
- { //在右半面找
- for(;((~TU[2*(y-1)+1])&(0X80>>(feiji.x-8)))==((unsigned char)(feiji.t&0xc0));y--)
- ;
-
- }
- TU[2*(y-1)]=(unsigned char)((~(feiji.t>>8))&TU[2*(y-1)]);
- TU[2*(y-1)+1]=(unsigned char)(~((feiji.t)&0x00c0)&TU[2*(y-1)+1]);
-
- if((TU[2*(TU_Y-1)]==0)&&((TU[2*(TU_Y-1)+1]&0xc0)==0))
- {TU_Y--;
-
- }
- }
- dian1616(TU); //顯示
- }
- void AnNiu_F(void)//判射擊按鈕
- { unsigned int n;
- A_F=1;
- if(A_F==0)
- {
- A_F=1;
- QuDouDong(QUDOUDONGSHIJIAN);//去抖動
- if(A_F==0)
- {
- if(GoOrStay==0)
- SheJi();//射擊調(diào)整函數(shù)
- //等手放開
- n=2; //射擊鍵超時(shí)少一點(diǎn)
- while(A_F==0)
- {
- A_F=1;
- dian1616(TU); //顯示
- n--;
- if(n==0)
- break;//按鈕超時(shí)退出
- }
- }
- }
- }
- void AnNiu(void) //按鈕實(shí)現(xiàn)
- {
- AnNiu_S() ;//判開始暫停
- AnNiu_L() ;//判斷左按鈕
- AnNiu_R() ; //判斷右按鈕
- AnNiu_F() ; //判斷射擊
- AnNiu_T() ;//判斷退出
-
- }
- ////
- void FAIL(void) //失敗畫面
- {
- idata unsigned int n;
- n=300;
- while(n--)
- dian1616(over);
- chuqihua();//初始化
- }
- void WINN(void)//勝利
- {
- idata unsigned int n;
- n=300;
- while(n--)
- dian1616(win);
- chuqihua(); //初始化
- }
- void winORfail(void)//判斷勝利還是失敗
- {
- if(Guan>9)//10關(guān)全過勝利
- WINN();//勝利畫面
- else
- if(TU_Y>14)
- FAIL();
-
- }
- ////
- void SheZhi(void)//設(shè)置畫面
- {
- TU[30]=TU[28]=0xff;//去掉飛機(jī)圖形
- TU[29]|=0XC0;
- TU[31]|=0XC0;
-
- guanshu(Guan);
- while(GoOrStay==2)
- {
- dian1616(TU); //顯示
- AnNiu();
- }
- }
- //////菜單////
- void caidan(void)
- {
- while(GoOrStay==-1|GoOrStay==2)//如果還沒開始
- {
- if(GoOrStay==-1)
- SHAN(xuanze);//選擇畫面
- if(GoOrStay==2)
- SheZhi();//設(shè)置畫面
- }
- }
- ///////////////////////////////////////////
- void TIME1(void) interrupt 3 //定時(shí)器1
- { TH1=0X3C;
- TL1=0XB0;//定時(shí)器初值
- EA=0;
- P3=0XF0;
-
- //定時(shí)器處理
- time_a++;
- if(time_a==(40-Guan*2))
- {
- ZHENGJIAYIXING();
- time_a=0;}
- time_b++;
- if(time_b==1200)
- {Guan++;
- time_b=0;
- }
- EA=1;
- TR1=1;
- TF1=0;
- }
- //定時(shí)器初始化
- void dishiqi(void)
- {
- TMOD=0X10;//定時(shí)器工作方式1
- TH1=0X3C;
- TL1=0XB0;//定時(shí)器初值
- ET1=1;
- EA=1;
- TF1=0;
- TR1=0;//關(guān)定時(shí)器
- }
- ////////////////////初始化//////////////////
- void chuqihua(void)//初始顯示內(nèi)容為0
- {
- idata char a;
- dishiqi() ;//定時(shí)器初始化
- for(a=0;a<32;a++)
- TU[a]=0x0;
- TU_Y=0;
- A_L =1 ; //左移動
- A_R =1 ; //右移動
- A_F =1 ; //射擊
- A_S =1 ; //開始/暫停
- A_T =1 ; //退出
- P21=1;P22=1;P23=1;P24=1;
- for(a=0;a<16;a++)//畫上邊
- {
- TU[2*a+1]|=0x20;
- }
- ZHENGJIAYIXING(); //加一層
- feiji.x=5; //初始飛機(jī)位置
- GoOrStay=-1; //置狀態(tài)標(biāo)記為未開始
- Guan=0;//初始關(guān)卡為0
-
- xuanze=0;
- }
- /////////////////////////////////
-
-
- void main() //程序主函數(shù)
- {
- chuqihua();//初始化
- while(1)
- {
- if(GoOrStay==-1)
- caidan();
- AnNiu(); //按鈕
- if(GoOrStay==0)
- {dian1616(TU); //顯示
- TR1=1;//游戲時(shí)開定時(shí)器
- }
- winORfail();//判斷是否勝利
- if(GoOrStay==1) //暫停
- {dian1616(stay);
- TR1=0;//關(guān)定時(shí)器
- }
- }
- }
復(fù)制代碼
仿真工程文件和程序源碼下載:
16X16點(diǎn)陣飛機(jī)射擊游戲.rar
(29.01 KB, 下載次數(shù): 69)
2017-3-1 04:29 上傳
點(diǎn)擊文件名下載附件
|
評分
-
查看全部評分
|