⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 16x16飞机射击游戏.lst

📁 16X16点阵做的射击游戏,类似于俄罗斯方块的点阵游戏,附带proteus仿真原理图.keilC51编译
💻 LST
📖 第 1 页 / 共 2 页
字号:
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 + -