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

📄 snake.lst

📁 键盘控制游戏液竟晶12864的,通过一般的控制新片就可以实现!供大家参考
💻 LST
📖 第 1 页 / 共 3 页
字号:
 173          ---------------------------------------------------------*/
 174          void PlacedFood()
 175          {
 176   1         uchar i=0;
 177   1         srand(16); //随机数发生器初始值
 178   1         if (FoodFlag==0)
 179   1         {
C51 COMPILER V8.08   SNAKE                                                                 06/20/2007 12:20:21 PAGE 4   

 180   2                      RandCounter++;
 181   2                      if (RandCounter==28) RandCounter=0;
 182   2                      do
 183   2                      { //rand ()产生一个0-32767之间的虚拟随机数
 184   3                              i = rand (); //赋给一个字符型,取低8位
 185   3                              i+=RandCounter;//由于产生的随机数非常的有规律所以加一个
 186   3                              if (i<111&&Map[i]==0)
 187   3                              {//产生的随机数在坐标范围以内且没刷到墙和蛇上就刷出.  
 188   4                                      Map[i] = 2; //放食物
 189   4                                      break;//跳出循环
 190   4                              }
 191   3                      }
 192   2                      while(1);
 193   2                      FoodFlag = 1;//食物标志位置1,表明放了食物
 194   2              }
 195   1      }
 196          /*---------------------------------------------------------
 197          函数:Init()
 198          说明:初始化
 199          ---------------------------------------------------------*/
 200          void Init()
 201          {
 202   1        IE   = 0x83; //开外中断0,定时器0,总中断允许
 203   1        IP   = 0x01; //外中断INT0中断优先
 204   1        TMOD = 0x01;//定时器0模式1
 205   1        TH0  = 0xB1; //定时10mS
 206   1        TL0  = 0xE0;
 207   1        TCON = 0x11;//启动定时器0,外中断INT0边沿触发
 208   1      }
 209          /**********************************************************
 210          *延时400us
 211          **********************************************************/
 212          void Delay400us() //晶振=12MHz 延时时间=404us
 213           {                                //晶振=11.0592MHz 延时时间≈438us
 214   1              uchar i,j;        //总的延时时间=[(2*i)+1]*j+1+1
 215   1              for (j=4;j>0;j--) //j=2用12MHz,j=4 是24MHz晶振
 216   1                      for (i=100;i>0;i--);
 217   1       }
 218          /**********************************************************
 219          *函数名:Sound()
 220          *功  能:音效子程序
 221          **********************************************************/
 222          void Sound()
 223          {
 224   1       uchar i;
 225   1       for (i=40;i>0;i--)
 226   1       {
 227   2               Beep=~Beep;
 228   2               Delay400us();
 229   2       }
 230   1      }
 231          /*---------------------------------------------------------
 232          函数:main()
 233          说明:主函数
 234          ---------------------------------------------------------*/
 235          main ()
 236          {
 237   1        LCDInit();//液晶初始化
 238   1        Init();       //初始化
 239   1        CopyMap();//复制地图
 240   1        MapCreate(); //生成地图
 241   1        GameDisplay(GDRAM);//地图刷新显示
C51 COMPILER V8.08   SNAKE                                                                 06/20/2007 12:20:21 PAGE 5   

 242   1        while(1)
 243   1        {
 244   2               switch (KeyCoding[2])  //可以放到主程序的while(1)循环中.
 245   2              {//按键判断
 246   3                case  0x51:  //确定键
 247   3                              if (Pause==0)
 248   3                              {
 249   4                                      Pause = 1;
 250   4                                      TR0 = 0;   //暂停
 251   4                              }
 252   3                              else
 253   3                              {
 254   4                                      Pause = 0;
 255   4                                      TR0 = 1;  //继续
 256   4                              }
 257   3                              KeyCoding[2] = 0;
 258   3                              break;
 259   3                case  0x06:  //向上键
 260   3                              if (DownMove ==0)//防止向相反的方向运动
 261   3                              { 
 262   4                                      UpMove    = 1;//向上移动标志位
 263   4                                      DownMove  = 0;//向下移动标志位
 264   4                                      LeftMove  = 0;//向左移动标志位
 265   4                                      RightMove = 0;//向右移动标志位
 266   4                                      MoveDirection=1;
 267   4                              }
 268   3                              KeyCoding[2] = 0;
 269   3                              break;
 270   3                case  0x44:  //向下键
 271   3                              if (UpMove ==0)
 272   3                              {
 273   4                                      UpMove    = 0;//向上移动标志位
 274   4                                      DownMove  = 1;//向下移动标志位
 275   4                                      LeftMove  = 0;//向左移动标志位
 276   4                                      RightMove = 0;//向右移动标志位
 277   4                                      MoveDirection=2;
 278   4                              }
 279   3                              KeyCoding[2] = 0;
 280   3                              break;
 281   3                case  0x47:  //向左键
 282   3                              if (RightMove==0)
 283   3                              {
 284   4                                      UpMove    = 0;//向上移动标志位
 285   4                                      DownMove  = 0;//向下移动标志位
 286   4                                      LeftMove  = 1;//向左移动标志位
 287   4                                      RightMove = 0;//向右移动标志位
 288   4                                      MoveDirection=3;
 289   4                              }
 290   3                              KeyCoding[2] = 0;
 291   3                              break;
 292   3                case  0x40:  //向右键
 293   3                              if (LeftMove==0)
 294   3                              {
 295   4                                      UpMove    = 0;//向上移动标志位
 296   4                                      DownMove  = 0;//向下移动标志位
 297   4                                      LeftMove  = 0;//向左移动标志位
 298   4                                      RightMove = 1;//向右移动标志位
 299   4                                      MoveDirection=4;
 300   4                              }
 301   3                              KeyCoding[2] = 0;
 302   3                              break;
 303   3                case  0x02:  //第一次按进入设置,第二次退出设置状态
C51 COMPILER V8.08   SNAKE                                                                 06/20/2007 12:20:21 PAGE 6   

 304   3                              KeyCoding[2] = 0;
 305   3                              break;
 306   3                case  0x07:  //系统设定键
 307   3                              KeyCoding[2] = 0;
 308   3                              break;
 309   3              }
 310   2        }
 311   1      }
 312          /*---------------------------------------------------------
 313          函数:Int0()
 314          说明:定时器0溢出中断
 315          ---------------------------------------------------------*/
 316          Int0() interrupt 0
 317          {
 318   1        uchar i,k;
 319   1        EA = 0;                       //关外中断0
 320   1        if (P3_2==0)          //P3.2低电平继续
 321   1        {
 322   2              for (i=8;i>0;i--)       //循环检测10次,低电平引导信号干扰检测(9ms)
 323   2              {
 324   3                      Delay400us(); //延时438us
 325   3                      if (P3_2==1)  //低电平引导信号出现高电平就跳出
 326   3                      { 
 327   4                              EA = 1; //开外中断
 328   4                              return;
 329   4                      }
 330   3              }
 331   2              while(P3_2==0); //等待高电平引导信号到了.
 332   2              for (i=8;i>0;i--)  //循环检测10次,高电平引导信号干扰检测(4.5ms)
 333   2              {
 334   3                      Delay400us();
 335   3                      if (P3_2==0) //高电平引导信号出现低电平就跳出
 336   3                      { 
 337   4                              EA = 1; //开外中断
 338   4                              return;
 339   4                      }
 340   3              }
 341   2              while(P3_2==1); //等待高电平引导信号结束.
 342   2              //接收4个字节的数据
 343   2              for (k=0;k<4;k++)                                                                                                   
 344   2              {
 345   3                      for (i=8;i>0;i--)  //8位数据
 346   3                      {
 347   4                              while(P3_2==0);         //等待第一个地址码的高电平到了.(保证判断每位数据的起点一致)
 348   4                              Delay400us();
 349   4                              Delay400us();           //延时0.876ms去判断P3.2的状态(0.56ms<延时时间<1.125ms)
 350   4                              KeyCoding[k]>>= 1; //右移1位
 351   4                              if(P3_2==1)             //仍是1,最高位写入1,0跳过

⌨️ 快捷键说明

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