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

📄 main.lst

📁 单片机上用128*64液晶 做的开窗游戏
💻 LST
📖 第 1 页 / 共 2 页
字号:
 256             
 257             {5,2,2,2,(*Stat5)},      //关于这个游戏
 258             {6,3,3,3,(*Stat6)},          //开窗游戏
 259             {7,7,7,1,(*Stat7)}           //关于开窗游戏
 260          };
 261          /*-------------------------------------------------------------*/
 262          void MenuOperate(unsigned char key)
 263          {
 264   1          switch(key)
 265   1              {
 266   2                  case  0:                   //向上的键
 267   2                      {
 268   3                          KeyFuncIndex=KeyTab[KeyFuncIndex].KeyUpState;
 269   3                              break; 
 270   3                      }
 271   2                      case  1:                          //回车键
 272   2                      {
 273   3                              KeyFuncIndex=KeyTab[KeyFuncIndex].KeyEnterState;
 274   3                              break; 
 275   3                      }
 276   2                      case  3:                          //向下的键
 277   2                      {
 278   3                              KeyFuncIndex=KeyTab[KeyFuncIndex].KeyDownState;
 279   3                              break; 
 280   3                      }
 281   2                      //此处添加按键错误代码
 282   2              }
 283   1              //下面是执行按键的操作
 284   1              KeyFuncPtr=KeyTab[KeyFuncIndex].CurrentOperate;
 285   1      
 286   1              (*KeyFuncPtr)();     //执行当前的按键操作
 287   1      }        //*/
 288          /*-------------------------------------------------------------*/
 289          unsigned char keyscan()
 290          {
 291   1          unsigned char key;
 292   1              P2=0xFF;
 293   1              key=P2&0xF8;
 294   1              delayms(8);
 295   1              //在这里加去抖动
 296   1              switch (key)
 297   1              {
 298   2                 case 0xF0: key=0;break;   //P23   up
 299   2                 case 0xE8: key=1;break;       //P24   enter
 300   2                 case 0xD8: key=2;break;   //P25       cancel 
 301   2                 case 0xB8: key=3;break;   //P26       down
 302   2                 case 0x78: key=4;break;   //P27       left
C51 COMPILER V8.05a   MAIN                                                                 02/17/2008 15:54:11 PAGE 6   

 303   2                 case 0xF8:                            //P17   right
 304   2                           {
 305   3                                          key=P1&0x80;
 306   3                                              if(key==0) key=5;
 307   3                                              else key=10;  //key==10时代表没有按键按下
 308   3                           }
 309   2              }
 310   1              return key;
 311   1      }                
 312          /*--------------------------------------------------------------*/
 313          //游戏数据中的0的个数的统计函数
 314          //n=25的时候通过游戏关
 315          unsigned char number_0(void)
 316          {
 317   1          unsigned char i,j,n;
 318   1              n=0;
 319   1              for (j=0;j<5;j++)
 320   1                for (i=0;i<5;i++)
 321   1                {
 322   2                   if(CurLevDat[j][i]==0)
 323   2                          n=n+1;
 324   2                }
 325   1              return n;
 326   1      }
 327          /*--------------------------------------------------------------*/
 328          void GameOperate(unsigned char key)
 329          {
 330   1         switch(key)
 331   1         {
 332   2            case 0:    // up
 333   2                {
 334   3                    FocusStore();           //存放窗户原来的焦点坐标
 335   3                    if(FocusY==0)
 336   3                        {
 337   4                            FocusY=4;
 338   4                        }
 339   3                        else if(FocusY>0&&FocusY<=4)
 340   3                        {
 341   4                            FocusY-=1;
 342   4                        } 
 343   3                    break;
 344   3                }
 345   2                case 1:        //enter :在这里要对游戏数组数据进行修改
 346   2                {
 347   3                    GameEnter();
 348   3                        WindowStateDisp();
 349   3                       //在这里对游戏数据进行检查如果窗户都打开则
 350   3               //游戏玩家顺利过关
 351   3                if(number_0()==25)
 352   3                {
 353   4                            //"You do Good";
 354   4                                en_disp(3,16,12,Asc,s6,1);
 355   4                                delayms(700);
 356   4                            //
 357   4                    Level++;
 358   4                        if(Level==LEVELMAX)
 359   4                           Level=0;
 360   4                        // intial the game data
 361   4                        initGameDat();
 362   4                                //draw the game ground
 363   4                                drawGameGnd();
 364   4                        //draw the window focus
C51 COMPILER V8.05a   MAIN                                                                 02/17/2008 15:54:11 PAGE 7   

 365   4                    FocusDis();
 366   4                    //将游戏数据中窗户的开关状态显示在lcd上
 367   4                        WindowStateDisp();
 368   4                    //Draw the Level Text
 369   4                        LevelText();
 370   4      
 371   4                }
 372   3                    break;
 373   3                }
 374   2                case 2:        //cancel
 375   2                {
 376   3                    //退出到MenuState
 377   3                        keyInputState=0;
 378   3                        //update the LCD
 379   3                KeyFuncIndex=2;    //重新设置菜单的索引
 380   3                        break;
 381   3                }
 382   2                case 3:        //down
 383   2                {
 384   3                    FocusStore();
 385   3                    if(FocusY==4)
 386   3                        {
 387   4                            FocusY=0;
 388   4                        }
 389   3                        else if (FocusY>=0&&FocusY<4)
 390   3                        {
 391   4                            FocusY+=1;
 392   4                        }
 393   3                    break;
 394   3                }
 395   2                case 4:        //left 
 396   2                {
 397   3                    FocusStore();
 398   3                    if(FocusX==0)
 399   3                        {
 400   4                            FocusX=4;
 401   4                        }
 402   3                        else if(FocusX>0&&FocusX<=4)
 403   3                        {
 404   4                            FocusX-=1;
 405   4                        }           
 406   3                    break;
 407   3                }
 408   2                case 5:        //right
 409   2                {
 410   3                    FocusStore();
 411   3                    if(FocusX==4)
 412   3                        {
 413   4                            FocusX=0;
 414   4                        }
 415   3                        else if (FocusX>=0&&FocusX<4)
 416   3                        {
 417   4                            FocusX+=1;
 418   4                        }
 419   3                    break;
 420   3                }
 421   2         }
 422   1      
 423   1         //在这里更新液晶显示
 424   1         FocusDis(); 
 425   1         WindowStateDisp();     
 426   1      }
C51 COMPILER V8.05a   MAIN                                                                 02/17/2008 15:54:11 PAGE 8   

 427          /*--------------------------------------------------------------*/
 428          void SetOperate(key)
 429          {
 430   1               switch (key)
 431   1               {
 432   2                   case 0:          //up
 433   2                       {
 434   3                           Level++;
 435   3                               if(Level==LEVELMAX)
 436   3                                   Level=0;
 437   3                           break;
 438   3                       }
 439   2                       case 1:          //enrer 
 440   2                       {
 441   3                           keyInputState=0;
 442   3                               MenuOperate(1);    //模拟回车按键的动作
 443   3                           break;
 444   3                       }
 445   2                       case 2:              //cancel
 446   2                       {
 447   3                           Level=LevelTemp;
 448   3                               keyInputState=0;
 449   3                               MenuOperate(1);
 450   3                           break;
 451   3                       }
 452   2                       case 3:             //down
 453   2                       {
 454   3                           
 455   3                               if(Level==0)
 456   3                                  Level=LEVELMAX; 
 457   3                               Level--;
 458   3                           break;
 459   3                       }
 460   2                       case 4:             //left
 461   2                       {
 462   3                           Level=0;
 463   3                           break;
 464   3                       }
 465   2                       case 5:         //right
 466   2                       {
 467   3                           Level=LEVELMAX-1;
 468   3                           break;
 469   3                       }
 470   2               }
 471   1               //update the LCD display
 472   1               if(!((key==1)||(key==2)))
 473   1                  LevelText();
 474   1      }
 475          /*--------------------------------------------------------------*/
 476          void int_0(void) interrupt 0   using 0
 477          {
 478   1               unsigned char key;
 479   1               key=keyscan();
 480   1      
 481   1               switch (keyInputState)
 482   1               {
 483   2                  case 0 : MenuOperate(key);break;
 484   2                  case 1 : GameOperate(key);break;
 485   2                  case 2 : SetOperate(key); break; 
 486   2               }
 487   1      }   
 488          /*-------------------------------------------------------------*/
C51 COMPILER V8.05a   MAIN                                                                 02/17/2008 15:54:11 PAGE 9   

 489          void main(void)
 490          {  
 491   1          LCD12864_init();
 492   1              ClearLCD();
 493   1              //开中断
 494   1              EX0=1;
 495   1              //设置电平触发方式
 496   1              IT0=1;
 497   1              //开所有中断
 498   1              EA=1;
 499   1              //
 500   1              MenuOperate(10);
 501   1          while(1)
 502   1          {
 503   2          }  
 504   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   3227    ----
   CONSTANT SIZE    =   3172    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      4      50
   IDATA SIZE       =     35    ----
   BIT SIZE         =   ----       7
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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