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

📄 snake.lst

📁 51单片机上的贪吃蛇游戏
💻 LST
📖 第 1 页 / 共 4 页
字号:
C51 COMPILER V7.20   SNAKE                                                                 12/23/2007 22:27:19 PAGE 1   


C51 COMPILER V7.20, COMPILATION OF MODULE SNAKE
OBJECT MODULE PLACED IN snake.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE snake.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <REG52.H>
   2          sbit sound=P2^7; //这个是接峰鸣器
   3          sbit rs = P2^0;   //H=data; L=command;
   4          sbit rw = P2^1;   //H=read; L=write;
   5          sbit  e = P2^2;   //input enable;
   6          sbit busy=P0^7;   //lcd busy bit
   7          /*---------这里是液晶的一些命令定的控制字-----------8*/
   8          #define com_expand_command        0x40
   9          #define base_command          0x34
  10          #define oppsite_cursor_dec    0x10
  11          #define open_display_oppsite  0x0D
  12          #define clear_screen          0x01
  13           
  14          /*------下面的这些反白指令没有什么用处!--------*/
  15          #define oppsite_first_line    0x04
  16          #define oppsite_second_line   0x05
  17          #define oppsite_third_line    0x06
  18          #define oppsite_forth_line    0x07
  19          /*------上面的这些反白指令没有什么用处!--------*/
  20          /*-------------这里是定义那个绘图时设置地址时用的------*/
  21          #define X1_ADDRESS    0x80
  22          #define X2_ADDRESS    0x88
  23          #define Y_ADDRESS     0x80
  24          /*******-----这里用来向LCD定入数据时区分命令和数据的-----*/
  25          #define comm  0   //命令
  26          #define dat   1   //数据!
  27           
  28          #define uint  unsigned int
  29          #define uchar unsigned char
  30          #define uchar unsigned char
  31          /*-----键盘扫描码定义------------------*/
  32          #define DOWN_DOWN    0xe0  //第一键
  33          #define UP_DOWN      0xd0  //第二键
  34          #define RIGHT_DOWN   0xb0  //
  35          #define LEFT_DOWN    0x70   //
  36          /*------------屏上区域定义区---------------*/
  37          #define RIGHT_MAX    31
  38          #define DOWN_MAX     15
  39          #define UP_MAX       0
  40          #define LEFT_MAX     0
  41          /*------------定义游戏状态--------------*/
  42          #define GAME_OVER                0    //游戏结束了
  43          #define GAME_RUNING              1    //游戏进行中
  44          #define WAIT_FOR_USER_INPUT      3  //等待用户输入
  45          #define GAME_WELCOME_SCREEN   4    //
  46          #define SHOW_YOUR_RECORD   5//这个状态就是当游戏结束以后显示你的成绩
  47           
  48          
  49          /*--------------方向定义----------------*/
  50          #define RIGHT  0
  51          #define LEFT   1
  52          #define DOWN   2
  53          #define UP     3
  54          
  55          /*--------------定义屏幕序列号------------------*/
C51 COMPILER V7.20   SNAKE                                                                 12/23/2007 22:27:19 PAGE 2   

  56          #define WELCOME_SCREEN  0 //第一个欢迎屏
  57          #define WAITE_IN_PUT    1 //这是等待玩家选关的
  58          #define YOUR_RECORD  2 //这个屏是当玩家OVER后显示他分数
  59          #define CONGRATULATE    3 //这个是当玩家玩完一关后进入下一关时显示的
  60           
  61          
  62          /*---------------------------*/
  63          #define SNAKE_LONG   16  //定义蛇长
  64          #define DEFAULT_SPEED 5//定义蛇的默认速度 
  65          #define X_POT         0
  66          #define Y_POT         1 //蛇身是一个2维数组0是放X1放Y
  67          #define MAX_RECORD    15//这个是定义当多少分时就进入下一关
  68          /*---------定义一种结构体---------*/
  69          struct postion
  70          {
  71            uchar x;
  72           uchar y ;
  73          };//这个结构体是用来表示一些点的数据
  74          
  75          //*-----这个结构休是用来保存一些蛇改变方向时的数据它是有蛇前进时要用来删除尾巴时要用到-----*/
  76           //这三点分别是头,尾,和食物
  77          struct Snake
  78          {
  79            uchar Snake_body[SNAKE_LONG][2]; //其0为头15为尾
  80            uchar direction;
  81            uchar Speed;///速度这是由用户设定的
  82            uchar Game_Mode;    //这个是游戏的状态如如进行中,结速了等
  83            struct postion Temp_Pot_Or_Last_Trail;//这里蛇在前进时用暂存数据的移过后这个里面就是上次蛇尾所在的点
  84            uchar soft_conter;//这个是软件计数器  用来计数T1的中断次数,到了一定数值时就让蛇前进一步
  85            uchar Current_screen_num;    //这个是用来保存当前所显示的屏
  86            uchar Currrent_Position;//保存光标所在的位置
  87            uchar Screen_data[2][4];//这个是更新屏上的数据时,重构数据所使用的缓存
  88            struct postion Food_Postion;//这个是食物的位置
  89            uchar Record;//游戏得分数
  90          } ;
  91          uchar code NO_Data[10]={"0123456789"};//{"0","1","2","3","4","5","6","7","8","9"};
  92          /*----------------这个地方是输出到屏上面的数据--------------*/
  93          uchar code screen_data[][64]={
  94                            {"    综合程序    "                  
  95                 "开发:Crasyboye  "
  96                 "  游戏--贪吃蛇  "
  97                 "  按任意键继续  "
  98                 },//第一屏
  99                 {
 100                 "                "
 101                 "        第:  关"
 102                 "    请您选关    "
 103                 "增加/ 减少  确定"
 104                 },
 105                 ///////////////////////////
 106                 {"您的得分为:    "
 107                  "    继续努力    "
 108                  "                "
 109                  "  按任意键继续  "
 110                 },
 111                 {"                "
 112                  "恭喜!您顺利过关"
 113                  "  马上进下一关  "
 114               "  按任意键继续  "
 115                 }
 116               
 117                 };
C51 COMPILER V7.20   SNAKE                                                                 12/23/2007 22:27:19 PAGE 3   

 118                 
 119           
 120           
 121          /*-----变量定义--------*/
 122          struct Snake   My_snake;
 123           
 124          unsigned char KEY_WORD;
 125          bit   KEY_DOWN;  //这个用来表示键位有按下了
 126           
 127           
 128          /*----------函数声明-------------*/
 129           void inicial_timer () ; /*--------初始化两个定时器----------*/
 130           void voice_function() ;   /*------发音子程序-------*/
 131           /*---------确认某一点是否有有障碍物-----------*/
 132           bit  Sure_Postion_Have_pot(uchar row,uchar line);  //row是行line是列
 133           void Go_Ahead(); //这个函数用来使蛇向前前进一步
 134           bit Sure_Pot_Empty(uchar x,uchar y);   /*------------ 确认某一点是否是空点------------------*/
 135           void One_Step();///这个函数里蛇走一步的
 136           void wr_lcd (bit dat_comm,uchar content); /*-------------------写数据或指令到LCD-------------*/
 137           void init_lcd (void); //初始化定时器
 138           void chk_busy (void);  /*---------------检测忙信号----------------*/
 139           void Erasure();  //擦除屏幕函数 这是在绘图模式下
 140           void delay_ms(unsigned int ms);////延时毫秒级的
 141           void Erasure_Trail();  //擦尾
 142           void Draw_Head();//画头
 143           void Creat_Food();//产生一个食物并且检测食物是不是产生在蛇的身上如果是重新产生
 144           void Re_Build_Food_Buffer(uchar x,uchar y);//这个是用来重构缓存数据
 145           void Write_Food();//把食物画到屏上
 146           void Inicial_Game();////p初始化游戏
 147           void display_all_screen (uchar screen_num);//显示一整屏
 148           void Show_Your_Record();//显示你的成绩
 149           
 150          /*------键盘扫描也是中T0中断函数--------*/
 151          void inter_timer0() interrupt 1
 152          {
 153   1         unsigned char b;
 154   1        TR0=0;
 155   1        P1=0xff;
 156   1        b=P1;
 157   1        b=b&0xf0;
 158   1        if(b!=0xf0)
 159   1           {   
 160   2        KEY_DOWN=1;
 161   2        KEY_WORD=b;
 162   2        voice_function();
 163   2        } 
 164   1       
 165   1       while(b!=0xf0)   //这个地方是用来消抖的
 166   1       {
 167   2           b=P1;
 168   2        b=b&0xf0;
 169   2       }
 170   1        TR0=1;
 171   1      
 172   1      }
 173          /*--------初始化定时器----------*/
 174           void inicial_timer ()
 175           {
 176   1        TMOD=0x11;
 177   1        EA=1;
 178   1        TR0=1;
 179   1       TR1=1;
C51 COMPILER V7.20   SNAKE                                                                 12/23/2007 22:27:19 PAGE 4   

 180   1        ET0=1;
 181   1        ET1=1;
 182   1       }
 183           /*=----------这是定时器1的中断用来做为游戏的系系时钟------*/
 184          void inter_timer1() interrupt 3
 185          {
 186   1             TR1=0;
 187   1          TR0=0;
 188   1        if(My_snake.soft_conter>=9-My_snake.Speed)
 189   1           {
 190   2        My_snake.soft_conter=0;
 191   2        if(My_snake.Game_Mode==GAME_RUNING)
 192   2            {
 193   3               
 194   3                  One_Step();
 195   3                  Erasure_Trail();
 196   3                  Draw_Head();
 197   3          //  Write_Food();
 198   3            if(My_snake.Snake_body[0][Y_POT]==My_snake.Food_Postion.y&&My_snake.Snake_body[0][X_POT]==My_snake.F
             -ood_Postion.x)
 199   3               {
 200   4           Creat_Food();//产生一个食物并且检测食物是不是产生在蛇的身上如果是重新产生
 201   4           Write_Food();
 202   4          My_snake.Record++;
 203   4                
 204   4            }
 205   3                
 206   3             }
 207   2          else My_snake.soft_conter++;
 208   2        
 209   2        }
 210   1         else My_snake.soft_conter++;
 211   1        
 212   1        if(My_snake.Game_Mode==GAME_OVER)
 213   1         {
 214   2         Show_Your_Record();
 215   2         }
 216   1          TR1=1;
 217   1          TR0=1; 
 218   1      }
 219           /*------发音子程序-------*/
 220           void voice_function()
 221          {
 222   1        int c,e,d;
 223   1        for(d=0;d<1;d++)
 224   1        {
 225   2         
 226   2         for (c=0;c<50;c++)
 227   2         for(e=0;e<100;e++)
 228   2          sound=0;
 229   2         }
 230   1         sound=1;
 231   1      }
 232           /*---------确认某一点是否有有障碍物-----------*/
 233           bit  Sure_Postion_Have_pot()  //row是行line是列
 234             {
 235   1           
 236   1         
 237   1         return 1;  
 238   1              
 239   1         }
 240          /**-------------------这个是用来让蛇向前面一步-------------------**/
C51 COMPILER V7.20   SNAKE                                                                 12/23/2007 22:27:19 PAGE 5   

 241          void Go_Ahead()
 242             {
 243   1           uchar i,temp_x,temp_y;
 244   1        switch (My_snake.direction)
 245   1               {
 246   2         case RIGHT:
 247   2              {
 248   3              for(i=0;i<SNAKE_LONG;i++)
 249   3           {
 250   4               if(i==0)
 251   4            {
 252   5              My_snake.Temp_Pot_Or_Last_Trail.x=My_snake.Snake_body[0][X_POT];
 253   5           My_snake.Temp_Pot_Or_Last_Trail.y=My_snake.Snake_body[0][Y_POT];
 254   5           My_snake.Snake_body[0][X_POT]++;
 255   5             } //如果是第一个点就X++
 256   4            else         
 257   4           {
 258   5             temp_x=My_snake.Snake_body[i][X_POT];
 259   5             temp_y=My_snake.Snake_body[i][Y_POT];
 260   5            My_snake.Snake_body[i][Y_POT]=My_snake.Temp_Pot_Or_Last_Trail.y;
 261   5            My_snake.Snake_body[i][X_POT]=My_snake.Temp_Pot_Or_Last_Trail.x;
 262   5            My_snake.Temp_Pot_Or_Last_Trail.x=temp_x;
 263   5            My_snake.Temp_Pot_Or_Last_Trail.y=temp_y;
 264   5            }
 265   4           
 266   4           
 267   4            }
 268   3            return;
 269   3            }
 270   2      /*----------------------------------------------------------------------------*/
 271   2          case LEFT:
 272   2                {
 273   3            for(i=0;i<SNAKE_LONG;i++)
 274   3           {
 275   4               if(i==0)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -