久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
單片機16X16點陣飛機射擊游戲 仿真+源程序
[打印本頁]
作者:
zhfirst
時間:
2017-2-28 14:51
標題:
單片機16X16點陣飛機射擊游戲 仿真+源程序
4個8×8led顯示屏組成的,16X16點陣飛機射擊游戲帶源碼和仿真,下面是仿真原理圖:
0.png
(36.92 KB, 下載次數: 90)
下載附件
2017-3-1 04:28 上傳
16X16點陣飛機射擊游戲單片機源程序:
/*******************************************************
*******16X16點陣飛機射擊游戲****************************
********************************************************
**廣東技術師范學院天河學院-電氣工程系-電氣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 //"飛機"用結構體統一信息
{
unsigned char x; //飛機的X坐標,最大為9
unsigned int t; //飛機頭顯示內容
unsigned int w;//飛機尾顯示內容
} FEIJI;
FEIJI feiji;//定義飛機變量
///////////////////////////
idata char GoOrStay ;//狀態標記-1為未開始,0為正在游戲,1為暫停,2為設置狀態
idata char TU_Y;//最接近飛機的Y軸標記自向下數,最上層為1,無層時為0
idata char xuanze;//選擇start為0否為1
idata unsigned char Guan;//關數
unsigned char TU[32];//16X16圖像數組
idata unsigned char time_a=0;
idata unsigned int time_b=0;//定時器內和關數有關的增量
////////////////////////////////
/*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
};
///////////函數聲明/////////////////////
extern void feijitu(void); //根據飛機的x坐標寫出它的頭尾形狀,再給回TU數組
extern void ZHENGJIAYIXING(void);//增加一行
extern void chuqihua(void);//初始化顯示
extern void DELAY(unsigned int a); //延時子函數a最大為十進制65535
//extern unsigned char zhenli(unsigned char a);//整理調整函數
extern void dian1616(unsigned char ZZ[]);//16X16顯示主函數
extern void guanshu(unsigned char n);//將當前關卡加入到數組
extern void QuDouDong(unsigned int a);//去抖動,同時顯示
extern void SheJi(void); //射擊調整函數
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);//判斷勝利還是失敗
///////////////////////////////////////
/////////////////////////以下為顯示一個16X16/////
void DELAY(unsigned int a) //延時子函數a最大為十進制65535
{while(a--)
;
}
void dian1616(unsigned char ZZ[])//16X16主函數
{ unsigned char a,b; //a放行號,b放字在數組的序號
if(GoOrStay!=2)
feijitu(); //加入飛機位置狀態
guanshu(Guan); //關數
b=0;
XIA(0x00); //不送出下半部分
for(a=0x01;a!=0;a=(a<<1)) //上半個字
{
DELAY(50) ;//延時一小段時間為看清楚
ZUO(ZZ[b]) ; //調調整函數,送出左
b++ ;
YOU(ZZ[b]); //送出右
b++ ;
SHANG(a) ;//送出行號
DELAY(50) ;//延時一小段時間為了字型顯示更清楚
ZUO(0) ; //消影
YOU(0);
}
SHANG(0x00); //不送出上半部分
for(a=0x01;a!=0;a=(a<<1)) //下半個字
{ DELAY(50) ;//延時一小段時間為看清楚
ZUO(ZZ[b]) ; //調整函數,送出左
b++ ;
YOU(ZZ[b]); //送出右
b++ ;
XIA(a); //送出行號
DELAY(50) ;//延時一小段時間為了字型顯示更清楚
ZUO(0) ; //消影
YOU(0);
}
}
//////////////////以上為顯示一個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)); //保留信息狀態區的內容
}
TU[0]=0xff; //補上第0行顯示內容
TU[1]=(0xe0|(TU[1]&0x3f)); //保留信息狀態區的內容
TU_Y=(TU_Y+1);
}
////
void feijitu(void) //根據飛機的x坐標,寫出它的頭尾形態,并再其給回TU數組
{
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); //尾顯示形態
feiji.t=(feiji.t&0xffe0)|((unsigned int)(0x20|(TU[29]&0x3f))); //保留信息狀態區的內容
feiji.w=(feiji.w&0xffe0)|((unsigned int)(0x20|(TU[31]&0x3f))); //保留信息狀態區的內容
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) //將當前關卡加入到數組
{
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)//去抖動,同時顯示
{
while(a--)
{
if(GoOrStay!=2)
feijitu(); //加入飛機位置狀態
guanshu(Guan);//加入顯示關數
dian1616(TU); //16x16點陣顯示
}
}
///////
void AnNiu_S(void)//判開始按鈕
{
unsigned int n;//超時退出變量
A_S=1;
if(A_S==0)
{
A_S=1;
QuDouDong(QUDOUDONGSHIJIAN);//去抖動
if(A_S==0)
{
if(xuanze==0)//如為開始
{
if(GoOrStay==-1)
GoOrStay=0;//標記為開始
else
{
if(GoOrStay==0)
GoOrStay=1;//如果已開始則暫停
else
if(GoOrStay==1)
{GoOrStay=0;//如果已暫停則開始
}
}
}
if(GoOrStay==2)//如為設置
{ GoOrStay=-1;//標記為未開始
xuanze=0;
}
if(xuanze==1)//如為選擇
GoOrStay=2;
//等手放開
n=DENGFANKAISHIJIAN;
while(A_S==0)
{
A_S=1;
dian1616(TU); //顯示
n--;
if(n==0)
break;//按鈕超時退出
}
}
}
}
////
void AnNiu_L(void)//左按鈕
{
unsigned int n;//超時變量
A_L=1;
if(A_L==0)
{
A_L=1;
QuDouDong(QUDOUDONGSHIJIAN); //去抖動
if(A_L==0) //確認進入
{
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)//如果為設置則選擇關數
{
if(Guan==9)
Guan=0;
else
Guan++;
}
//等手放開
n=DENGFANKAISHIJIAN;
while(A_L==0)
{
A_L=1;
dian1616(TU); //顯示
n--;
if(n==0)
break;//按鈕超時退出
}
}//
}
}
///
////
void AnNiu_R(void)//右按鈕
{
unsigned int n;//超時變量
A_R=1;
if(A_R==0)
{
A_R=1;
QuDouDong(QUDOUDONGSHIJIAN); //去抖動
if(A_R==0) //確認進入
{
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)//如果為設置則選擇關數
{
if(Guan==0)
Guan=9;
else
Guan--;
}
//等手放開
n=DENGFANKAISHIJIAN;
while(A_R==0)
{
A_R=1;
dian1616(TU); //顯示
n--;
if(n==0)
break;//按鈕超時退出
}
}//
}
}
///
//////
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;//按鈕超時退出
}
}
}
}
}
///
///
void SheJi(void) //射擊調整函數
{ idata char y;
y=TU_Y;
if(y!=0)
{
if(feiji.x<8)//找出最凹的y坐標
{ //在左半面找
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();//射擊調整函數
//等手放開
n=2; //射擊鍵超時少一點
while(A_F==0)
{
A_F=1;
dian1616(TU); //顯示
n--;
if(n==0)
break;//按鈕超時退出
}
}
}
}
void AnNiu(void) //按鈕實現
{
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關全過勝利
WINN();//勝利畫面
else
if(TU_Y>14)
FAIL();
}
////
void SheZhi(void)//設置畫面
{
TU[30]=TU[28]=0xff;//去掉飛機圖形
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();//設置畫面
}
}
///////////////////////////////////////////
void TIME1(void) interrupt 3 //定時器1
{ TH1=0X3C;
TL1=0XB0;//定時器初值
EA=0;
P3=0XF0;
//定時器處理
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;
}
//定時器初始化
void dishiqi(void)
{
TMOD=0X10;//定時器工作方式1
TH1=0X3C;
TL1=0XB0;//定時器初值
ET1=1;
EA=1;
TF1=0;
TR1=0;//關定時器
}
////////////////////初始化//////////////////
void chuqihua(void)//初始顯示內容為0
{
idata char a;
dishiqi() ;//定時器初始化
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; //初始飛機位置
GoOrStay=-1; //置狀態標記為未開始
Guan=0;//初始關卡為0
xuanze=0;
}
/////////////////////////////////
void main() //程序主函數
{
chuqihua();//初始化
while(1)
{
if(GoOrStay==-1)
caidan();
AnNiu(); //按鈕
if(GoOrStay==0)
{dian1616(TU); //顯示
TR1=1;//游戲時開定時器
}
winORfail();//判斷是否勝利
if(GoOrStay==1) //暫停
{dian1616(stay);
TR1=0;//關定時器
}
}
}
復制代碼
0.png
(65.78 KB, 下載次數: 67)
下載附件
2017-3-1 04:27 上傳
仿真工程文件和程序源碼下載:
16X16點陣飛機射擊游戲.rar
(29.01 KB, 下載次數: 69)
2017-3-1 04:29 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
美女免费视频网站
|
成人一级黄色片
|
小日子的在线观看免费第8集
|
咪咪色影院
|
日韩精品视频一区二区三区
|
在线视频一区二区
|
性色av浪潮av
|
亚洲第一免费视频
|
久久久一级片
|
免费视频久久久
|
一级看片免费视频
|
国产一区免费
|
四川毛片
|
天天干天天看
|
国产成年妇视频
|
wwwxxx欧美
|
可以免费看黄的网站
|
国产精品国产精品国产专区不卡
|
精品久久久久久久久久久
|
日韩精品一区二区三区免费视频
|
91精品国产成人www
|
黄色三级av
|
亚洲欧美日韩色图
|
日韩成人在线免费观看
|
日韩在线不卡视频
|
国产三级做爰高清在线
|
17c在线
|
亚洲欧美日韩一区二区三区四区
|
av片免费
|
中文字幕精品视频
|
久久精品观看
|
青青草原国产
|
国产一区二区在线免费
|
国产毛片毛片毛片
|
色婷婷视频在线观看
|
国产午夜三级
|
五月六月丁香
|
丁香久久
|
91免费版看片
|
免费高清av
|
久久久综合网
|