📄 16x16飞机射击游戏.lst
字号:
C51 COMPILER V8.02 16X16飞籣射籣游戏 11/21/2008 23:01:10 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE 16X16飞籣射籣游戏
OBJECT MODULE PLACED IN 16x16飞机射击游戏.OBJ
COMPILER INVOKED BY: E:\Keil\C51\BIN\C51.EXE 16x16飞机射击游戏.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*******************************************************
2 *******16X16点阵飞机射击游戏****************************
3 ********************************************************
4 ****广东技术师范学院天河学院-电气工程系-电气062班*******
5 ***************梁宏阁***********************************
6 *******************************************************/
7 ////////////////////////////////////////////////////////
8 #include "reg51.h"
9 #include "absacc.h"
10 #include "intrins.h"
11 #include "stdio.h"
12 ///////////////////
13 #define DENGFANKAISHIJIAN 30
14 #define QUDOUDONGSHIJIAN 2
15 /////////////
16 sbit P21 =P2^1 ;
17 sbit P22 =P2^2 ;
18 sbit P23 =P2^3 ;
19 sbit P24 =P2^4 ;
20 #define P00 P0
21 ////////////////////
22 sbit A_L =P1^1 ; //左移动
23 sbit A_R =P1^2 ; //右移动
24 sbit A_F =P1^3 ; //射击
25 sbit A_S =P1^4 ; //开始/暂停
26 sbit A_T =P1^5 ; //退出
27 ///////////////////////////////////
28 #define ZUO(a) P00=a;P24=0;P24=1
29 #define YOU(a) P00=a;P21=0;P21=1
30 #define SHANG(a) P00=a;P22=0;P22=1
31 #define XIA(a) P00=a;P23=0;P23=1
32 //////////////////////////////////////////
33 //////////////////////////////////////////
34
35 typedef struct //"飞机"用结构体统一信息
36 {
37 unsigned char x; //飞机的X坐标,最大为9
38 unsigned int t; //飞机头显示内容
39 unsigned int w;//飞机尾显示内容
40 } FEIJI;
41
42 FEIJI feiji;//定义飞机变量
43 ///////////////////////////
44 idata char GoOrStay ;//状态标记-1为未开始,0为正在游戏,1为暂停,2为设置状态
45 idata char TU_Y;//最接近飞机的Y轴标记自向下数,最上层为1,无层时为0
46 idata char xuanze;//选择start为0否为1
47 idata unsigned char Guan;//关数
48 unsigned char TU[32];//16X16图像数组
49 idata unsigned char time_a=0;
50 idata unsigned int time_b=0;//定时器内和关数有关的增量
51 ////////////////////////////////
52
53
54 /*3x5字模*/
55 unsigned char code S_3X5[10][5]={{0x0e,0x0a,0x0a,0x0a,0x0e}/*0*/,{0x04,0x0c,0x04,0x04,0x04}/*1*/,
C51 COMPILER V8.02 16X16飞籣射籣游戏 11/21/2008 23:01:10 PAGE 2
56 {0x0e,0x02,0x0e,0x08,0x0e}/*2*/,{0x0e,0x02,0x0e,0x02,0x0e}/*3*/,{0x0a,0x0a,0x0e,0x02,0x02}/*4*/,
57 {0x0e,0x08,0x0e,0x02,0x0e}/*5*/,{0x0e,0x08,0x0e,0x0a,0x0e}/*6*/,{0x0e,0x02,0x02,0x02,0x02}/*7*/,
58 {0x0e,0x0a,0x0e,0x0a,0x0e}/*8*/,{0x0e,0x0a,0x0e,0x02,0x0e}/*9*/,
59 };
60 /*start+setup字模*/
61 unsigned char code start_setup[32]={
62 0x1c,0x07,0x09,0x02,0x6a,0xb2,0x8a,0xaa,
63 0xeb,0xb2,0x2a,0xaa,0xca,0xaa,0x00,0x00,
64 0x03,0x80,0x01,0x06,0x6d,0x55,0x89,0x56,
65 0xed,0x54,0x29,0x54,0xcd,0x74,0x00,0x00};
66 unsigned char code start[32]={
67 0x1c,0x07,0x09,0x02,0x6a,0xb2,0x8a,0xaa,
68 0xeb,0xb2,0x2a,0xaa,0xca,0xaa,0x00,0x00,
69 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
70 unsigned char code setup[32]={
71 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
72 0x03,0x80,0x01,0x06,0x6d,0x55,0x89,0x56,
73 0xed,0x54,0x29,0x54,0xcd,0x74,0x00,0x00};
74 /*STAY字模*/
75 unsigned char code stay[32]={
76 0x00,0x00,0x1f,0x00,0x04,0x11,0x04,0x0a,
77 0x74,0x04,0x84,0xc4,0x85,0x24,0x65,0x24,
78 0x15,0x24,0x15,0xe4,0xe5,0x20,0x05,0x20,
79 0x01,0x20,0x00,0x00,0x00,0x00,0x00,0x00
80 };
81 /*OVER字模*/
82 unsigned char code over[32]={
83 0xaa,0xaa,0xff,0xff,0x00,0x00,0x00,0x06,
84 0x05,0x35,0x65,0x45,0x95,0x46,0x95,0x75,
85 0x95,0x45,0x65,0x45,0x02,0x35,0x00,0x00,
86 0xff,0xff,0x55,0x55,0xff,0xff,0x55,0x55
87 } ;
88 /*WIN字模*/
89 unsigned char code win[32]={
90 0x55,0x55,0xff,0xff,0x00,0x00,0xa9,0x40,
91 0x55,0x40,0x55,0x40,0x48,0x80,0x00,0x00,
92 0x0a,0xa4,0x0a,0xaa,0x05,0x2a,0x00,0x00,
93 0xff,0xff,0x00,0x00,0xff,0xff,0xaa,0xaa
94 };
95 ///////////函数声明/////////////////////
96 extern void feijitu(void); //根据飞机的x坐标写出它的头尾形状,再给回TU数组
97 extern void ZHENGJIAYIXING(void);//增加一行
98 extern void chuqihua(void);//初始化显示
99 extern void DELAY(unsigned int a); //延时子函数a最大为十进制65535
100 //extern unsigned char zhenli(unsigned char a);//整理调整函数
101 extern void dian1616(unsigned char ZZ[]);//16X16显示主函数
102 extern void guanshu(unsigned char n);//将当前关卡加入到数组
103 extern void QuDouDong(unsigned int a);//去抖动,同时显示
104 extern void SheJi(void); //射击调整函数
105 extern void AnNiu_S(void);//判开始暂停按钮
106 extern void AnNiu_T(void);//判断退出按钮
107 extern void AnNiu_L(void);//判左移按钮
108 extern void AnNiu_R(void);//判右移出按钮
109 extern void AnNiu_F(void);//判射击按钮
110 extern void AnNiu(void);//按钮合集
111 extern void SHANstart(void);//闪START
112 extern void SHANsetup(void);//闪SETUP
113 extern void SHAN( char a);//闪0闪start,1闪setup
114 extern void winORfail(void);//判断胜利还是失败
115 ///////////////////////////////////////
116
117
C51 COMPILER V8.02 16X16飞籣射籣游戏 11/21/2008 23:01:10 PAGE 3
118 /////////////////////////以下为显示一个16X16/////
119 void DELAY(unsigned int a) //延时子函数a最大为十进制65535
120 {while(a--)
121 1 ;
122 1 }
123
124 void dian1616(unsigned char ZZ[])//16X16主函数
125 { unsigned char a,b; //a放行号,b放字在数组的序号
126 1 if(GoOrStay!=2)
127 1 feijitu(); //加入飞机位置状态
128 1 guanshu(Guan); //关数
129 1
130 1 b=0;
131 1 XIA(0x00); //不送出下半部分
132 1 for(a=0x01;a!=0;a=(a<<1)) //上半个字
133 1 {
134 2 DELAY(50) ;//延时一小段时间为看清楚
135 2 ZUO(ZZ[b]) ; //调调整函数,送出左
136 2 b++ ;
137 2 YOU(ZZ[b]); //送出右
138 2 b++ ;
139 2
140 2 SHANG(a) ;//送出行号
141 2
142 2 DELAY(50) ;//延时一小段时间为了字型显示更清楚
143 2
144 2 ZUO(0) ; //消影
145 2 YOU(0);
146 2 }
147 1 SHANG(0x00); //不送出上半部分
148 1 for(a=0x01;a!=0;a=(a<<1)) //下半个字
149 1 { DELAY(50) ;//延时一小段时间为看清楚
150 2
151 2
152 2 ZUO(ZZ[b]) ; //调整函数,送出左
153 2 b++ ;
154 2 YOU(ZZ[b]); //送出右
155 2 b++ ;
156 2
157 2 XIA(a); //送出行号
158 2
159 2 DELAY(50) ;//延时一小段时间为了字型显示更清楚
160 2
161 2 ZUO(0) ; //消影
162 2 YOU(0);
163 2 }
164 1 }
165 //////////////////以上为显示一个16X16////
166 void ZHENGJIAYIXING(void)//增加一行
167 {
168 1 char a;
169 1 for(a=15;a>-1;a--)
170 1 { TU[2*(a+1)]=TU[2*a];
171 2 TU[2*(a+1)+1]=((TU[2*a+1]&0xe0)|(TU[2*(a+1)+1]&0x3f)); //保留信息状态区的内容
172 2 }
173 1 TU[0]=0xff; //补上第0行显示内容
174 1 TU[1]=(0xe0|(TU[1]&0x3f)); //保留信息状态区的内容
175 1
176 1
177 1 TU_Y=(TU_Y+1);
178 1 }
179 ////
C51 COMPILER V8.02 16X16飞籣射籣游戏 11/21/2008 23:01:10 PAGE 4
180 void feijitu(void) //根据飞机的x坐标,写出它的头尾形态,并再其给回TU数组
181 {
182 1 unsigned char a;
183 1 feiji.t=0x8000;
184 1 for(a=0;a<feiji.x;a++)
185 1 {
186 2 feiji.t>>=1; //右移一位
187 2 }
188 1
189 1 feiji.w=(((feiji.t|(feiji.t>>1)&0xffe0)|(feiji.t<<1))&0xffe0); //尾显示形态
190 1
191 1 feiji.t=(feiji.t&0xffe0)|((unsigned int)(0x20|(TU[29]&0x3f))); //保留信息状态区的内容
192 1 feiji.w=(feiji.w&0xffe0)|((unsigned int)(0x20|(TU[31]&0x3f))); //保留信息状态区的内容
193 1
194 1 TU[28]=(unsigned char)(feiji.t>>8);
195 1 TU[29]=(unsigned char)feiji.t;
196 1 TU[30]=(unsigned char)(feiji.w>>8);
197 1 TU[31]=(unsigned char)feiji.w;
198 1 }
199 ///
200 void guanshu(unsigned char n) //将当前关卡加入到数组
201 {
202 1 char a;
203 1 if(n<10)
204 1 {
205 2 for(a=2;a<7;a++)
206 2 {
207 3 TU[2*a+1]=(TU[2*a+1]&0xe0)|S_3X5[n][a-2];
208 3 }
209 2 }
210 1 }
211 ///////////////////////////
212 void SHANstart(void) //闪start
213 { char a;
214 1 a=15;
215 1 while(a--)
216 1 {
217 2 dian1616(setup); //显示
218 2 AnNiu();
219 2 }
220 1 a=15;
221 1 while(a--)
222 1 { dian1616(start_setup); //显示
223 2 AnNiu();
224 2 }
225 1 }
226 //
227 void SHANsetup(void) //闪setup
228 { char a;
229 1 a=15;
230 1 while(a--)
231 1 {
232 2 dian1616(start); //显示
233 2 AnNiu();
234 2 }
235 1 a=15;
236 1 while(a--)
237 1 {
238 2 dian1616(start_setup); //显示
239 2 AnNiu();
240 2 }
241 1 }
C51 COMPILER V8.02 16X16飞籣射籣游戏 11/21/2008 23:01:10 PAGE 5
242 //
243 void SHAN( char a)//a决定0闪start,1闪setup
244 {
245 1 if(a==0)
246 1 SHANstart();
247 1 else
248 1 SHANsetup();
249 1 }
250 /////////////////////////////////
251 void QuDouDong(unsigned int a)//去抖动,同时显示
252 {
253 1 while(a--)
254 1 {
255 2 if(GoOrStay!=2)
256 2 feijitu(); //加入飞机位置状态
257 2 guanshu(Guan);//加入显示关数
258 2 dian1616(TU); //16x16点阵显示
259 2 }
260 1 }
261 ///////
262 void AnNiu_S(void)//判开始按钮
263 {
264 1 unsigned int n;//超时退出变量
265 1 A_S=1;
266 1 if(A_S==0)
267 1 {
268 2 A_S=1;
269 2 QuDouDong(QUDOUDONGSHIJIAN);//去抖动
270 2 if(A_S==0)
271 2 {
272 3 if(xuanze==0)//如为开始
273 3 {
274 4 if(GoOrStay==-1)
275 4
276 4 GoOrStay=0;//标记为开始
277 4 else
278 4 {
279 5 if(GoOrStay==0)
280 5 GoOrStay=1;//如果已开始则暂停
281 5 else
282 5 if(GoOrStay==1)
283 5 {GoOrStay=0;//如果已暂停则开始
284 6 }
285 5 }
286 4
287 4 }
288 3 if(GoOrStay==2)//如为设置
289 3 { GoOrStay=-1;//标记为未开始
290 4 xuanze=0;
291 4 }
292 3 if(xuanze==1)//如为选择
293 3 GoOrStay=2;
294 3
295 3 //等手放开
296 3 n=DENGFANKAISHIJIAN;
297 3 while(A_S==0)
298 3 {
299 4 A_S=1;
300 4 dian1616(TU); //显示
301 4 n--;
302 4 if(n==0)
303 4 break;//按钮超时退出
C51 COMPILER V8.02 16X16飞籣射籣游戏 11/21/2008 23:01:10 PAGE 6
304 4 }
305 3 }
306 2 }
307 1 }
308 ////
309 void AnNiu_L(void)//左按钮
310 {
311 1 unsigned int n;//超时变量
312 1 A_L=1;
313 1 if(A_L==0)
314 1 {
315 2 A_L=1;
316 2 QuDouDong(QUDOUDONGSHIJIAN); //去抖动
317 2 if(A_L==0) //确认进入
318 2 {
319 3 if(GoOrStay==0)//如果正在游戏则用左右功能
320 3 {
321 4 if(feiji.x==0)//如果是最左则去最右
322 4 {
323 5 feiji.x=9;
324 5 }
325 4 else
326 4 {
327 5 feiji.x--;//沿x轴左移
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -