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

📄 main.lst

📁 在AT89S52上写的一个扫雷程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
 288   2                   {   SetColumn(i*8);   /*第I列*/
 289   3       	 	  for(j=0;j<8;j++)
 290   3          	         WriteByte(bmp[k*128+i*8+j]);
 291   3                    }
 292   2       	}
 293   1      
 294   1             CS1=0;
 295   1             CS2=1;       /*CS1=0,CS2=1 后写右屏幕*/
 296   1       	SetLine(0);
 297   1       	SetColumn(0);
 298   1       	for(k=0;k<8;k++)
 299   1       	{     SetLine(k); /*第K 行*/ 
 300   2                   for(i=0;i<8;i++)
 301   2                   {   SetColumn(i*8);   /*第I页*/
 302   3       	 	  for(j=0;j<8;j++)
 303   3          	         WriteByte(bmp[k*128+i*8+j+64]);
C51 COMPILER V3.20,  SN-0  MAIN                                                            02/28/07  13:53:15  PAGE 6   

 304   3                    }
 305   2       	}
 306   1          }
 307          
 308          /*------pskey.c-------*/
 309          /*-----------------------------------------------------*/
 310          /*                定义PS/2引脚和一些参数                */
 311          /*-----------------------------------------------------*/
 312          #define Key_CLK  INT1 /*P3_3为外部中断1的输入端,作为PS/2的时钟线*/   
 313          #define Key_data T0   /*P3_4为普通IO口,作为PS/2的数据线*/
 314          
 315          static unsigned char data	IntNum = 0;/*中断次数*/ 
 316          static unsigned char data	KeyV; /*接受到PS/2键盘发送来的数据编码*/
 317          static unsigned char data	DisChar;/*通过查表得到的ASCII码*/
 318          static unsigned char data	Key_UP=0, Shift = 0;/*按键是否放开,Shift是否按下*/
 319          static unsigned char data	BF = 0;/*是否接收到一个完整的数据编码*/
 320          //#define ENTER p
 321          //#define UP w
 322          //#define DOWN s
 323          //#define LEFT a
 324          //#define RIGHT d
 325          //#define ESC e
 326          //#define SPACE u
 327          //#define LOWERF f
 328          //#define UPPERF F
 329          //#define LOWERA o
 330          //#define UPPERA O
 331          //#define LOWERQ q
 332          //#define UPPERQ Q
 333          
 334          /*-----------------------------------------------------------*/
 335          /*                    INT1中断程序                            */
 336          /*-----------------------------------------------------------*/
 337          void Keyboard_out(void) small interrupt 2 
 338          {
 339   1      	if ((IntNum > 0) && (IntNum < 9)) /*从发送来的信号中提取数据*/
 340   1      		{			
 341   2      		       KeyV = KeyV >> 1;
 342   2      		   if (Key_data) KeyV = KeyV | 0x80; 
 343   2      		 }
 344   1      	IntNum++;
 345   1      
 346   1      while(!Key_CLK);/*等到时钟变为低电平*/
 347   1      
 348   1      	if (IntNum > 10)
 349   1      		{
 350   2      		     IntNum = 0; 
 351   2      	   	     BF = 1;/*一个数据编码接收完毕*/
 352   2      		     EA = 0;/*关INT1中断*/
 353   2      		 }
 354   1      }
 355          
 356          
 357          /*-----------------------------------------------------------*/
 358          /*                    解码程序                                */
 359          /*-----------------------------------------------------------*/
 360          void Decode(unsigned char	ScanCode) small
 361          {
 362   1      unsigned char data	TempCyc;	
 363   1      
 364   1      if (!Key_UP)  
 365   1       {
C51 COMPILER V3.20,  SN-0  MAIN                                                            02/28/07  13:53:15  PAGE 7   

 366   2      	switch (ScanCode)
 367   2      		{
 368   3      			case 0xF0 :	/*按键放开时发送来的断码的第一个字节*/
 369   3      				Key_UP = 1;DisChar=0;
 370   3      			break;
 371   3      
 372   3      			case 0x12 :	/*判断Shift是否有被按下*/
 373   3      				Shift = 1;
 374   3      			break;
 375   3      
 376   3      			case 0x59 :
 377   3      				Shift = 1;
 378   3      			break;
 379   3      
 380   3      			default:						
 381   3      				if(!Shift)/*没有按下Shift键时,得到其ASCII码*/
 382   3      					{
 383   4      						for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); 
 384   4      						if (UnShifted[TempCyc][0] == ScanCode) 
 385   4                                                 {
 386   5                                                       DisChar=UnShifted[TempCyc][1];
 387   5                                                       break;
 388   5                                                  }
 389   4      					}
 390   3      
 391   3      				else /*按下Shift键时,得到其ASCII码*/
 392   3      					{
 393   4      						for(TempCyc = 0; (Shifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++);
 394   4      						if (Shifted[TempCyc][0] == ScanCode) 
 395   4                                                 {
 396   5                                                       DisChar=Shifted[TempCyc][1];
 397   5                                                       break;
 398   5                                                  }
 399   4      					}
 400   3      
 401   3      		      break;
 402   3      		}
 403   2      }
 404   1      else/*对于断码只判断Shift键是否放开,其他的不判断*/
 405   1          {	
 406   2      	Key_UP = 0;
 407   2      	switch (ScanCode)
 408   2      		{
 409   3      			case 0x12 :
 410   3      				Shift = 0;
 411   3      			break;
 412   3      
 413   3      			case 0x59 :
 414   3      				Shift = 0;
 415   3      			break;
 416   3      		}DisChar=0;
 417   2            }
 418   1      BF = 0;
 419   1      } 
 420          
 421          /*-----------------------------------------------------------*/
 422          /*                    取得控制的几个按键                      */
 423          /*-----------------------------------------------------------*/
 424          unsigned char  getKey(void) small
 425          { 
 426   1      while(1){			
 427   2           if (BF)
C51 COMPILER V3.20,  SN-0  MAIN                                                            02/28/07  13:53:15  PAGE 8   

 428   2              {Decode(KeyV);break;}
 429   2           else				
 430   2              EA = 1;}
 431   1      switch(DisChar){
 432   2      case 'p'://ENTER:
 433   2      case 'w'://UP:
 434   2      case 's'://DOWN:
 435   2      case 'a': //aLEFT:
 436   2      case 'd': //RIGHT:
 437   2      case 'e'://ESC:
 438   2      case 'u'://SPACE:
 439   2      case 'f'://LOWERF:
 440   2      case 'F'://UPPERF:
 441   2      case 'o'://LOWERA:
 442   2      case 'O'://UPPERA:
 443   2      case 'q'://LOWERQ:
 444   2      case 'Q'://UPPERQ: 
 445   2       return DisChar;break;
 446   2      default:	return	0;
 447   2      }
 448   1      }
 449          
 450          
 451          /*-----------miner.c--------*/
 452          
 453          /*------------------------------------------------------------*/
 454          /*                    一些全局变量的定义                       */
 455          /*------------------------------------------------------------*/
 456          #define ROW 8
 457          #define COL 8
 458          #define STARTX 50
 459          #define STARTY 50
 460          #define SIZEX 20
 461          #define SIZEY 20
 462          #define UNFLAG 0 /*没有被翻开方块*/
 463          #define FLAGED 1 /*被标准上有雷的方块*/
 464          #define QUESTION 20 /*不确定有雷的方块*/
 465          #define EXPLOD 30  /*有雷的方块*/
 466          #define OPEN 40 /*被翻开没有雷的方块*/
 467          
 468          int  xdata	table[ROW][COL]; /*随机生成的8*8点阵的雷区*/
 469          int  xdata	num[ROW][COL];   /*该方块周围有雷的数量*/
 470          int  xdata  flag[ROW][COL];  /*该方块是否被翻开*/
 471          int data pi,pj;
 472          int data	di[8]={-1,-1,0,1,1,1,0,-1};
 473          int data	dj[8]={0,1,1,1,0,-1,-1,-1};
 474          
 475          /*------------------------------------------------------------*/
 476          /*                    随机产生8*8的随机数                      */
 477          /*------------------------------------------------------------*/
 478          void generateMine() small
 479          {       /*产生8*8的随机数矩阵*/
 480   1      int totalMine;
 481   1      int i,k;
 482   1      int ri,rj;
 483   1      int ni,nj;
 484   1      static int seed=0;
 485   1      totalMine = ROW * COL /8; /*雷的数量是1/6*/
 486   1      memset(table, 0 ,sizeof(table));
 487   1      memset(num, 0 ,sizeof(num));
 488   1      srand(seed++);
 489   1      for(i=0;i<totalMine;i++){  /*随机产生1/6的雷*/
C51 COMPILER V3.20,  SN-0  MAIN                                                            02/28/07  13:53:15  PAGE 9   

 490   2      do{
 491   3      ri = rand()%ROW;
 492   3      rj = rand()%COL;
 493   3      }while(table[ri][rj]);
 494   2      for(k=0;k<8;k++){
 495   3      ni = ri + di[k];
 496   3      nj = rj + dj[k];
 497   3      if(ni>=0 && ni< ROW && nj>=0 && nj<COL) num[ni][nj]++;
 498   3      }
 499   2      table[ri][rj] = 1;
 500   2      }
 501   1      memset(flag,UNFLAG,sizeof(flag));
 502   1      }
 503          
 504          
 505          /*------------------------------------------------------------*/
 506          /*                    画一个小方块                              */
 507          /*------------------------------------------------------------*/
 508          void drawBlock(int i, int j) small
 509          {
 510   1       if(i==pi&&j==pj){
 511   2      switch(flag[i][j]){
 512   3      case UNFLAG:
 513   3      photo_disp(i, j, aunflag); /*显示一个未翻开的方块*/
 514   3      break;
 515   3      case FLAGED:
 516   3      photo_disp(i, j, aflaged); /*显示一个插上标记的方块*/
 517   3      break;
 518   3      case QUESTION:
 519   3      photo_disp(i, j, aquestion); /*显示一个不确定的方块*/
 520   3      break;
 521   3      case EXPLOD:
 522   3      photo_disp(i, j, aexplod); /*显示一个炸开的方块*/
 523   3      break;
 524   3      case OPEN:
 525   3      if(num[i][j]>=0 && num[i][j]<=8){
 526   4         switch(num[i][j]){
 527   5         case 0:
 528   5         photo_disp(i, j, azero);break; /*显示一个zero的方块*/
 529   5         case 1:
 530   5         photo_disp(i, j, aone);break; /*显示一个one的方块*/
 531   5         case 2:
 532   5         photo_disp(i, j, atwo);break; /*显示一个one的方块*/
 533   5         case 3:
 534   5         photo_disp(i, j, athree);break; /*显示一个three的方块*/
 535   5         case 4:
 536   5         photo_disp(i, j, afour);break; /*显示一个four的方块*/
 537   5         case 5:
 538   5         photo_disp(i, j, afive);break; /*显示一个five的方块*/
 539   5         case 6:
 540   5         photo_disp(i, j, asix);break; /*显示一个six的方块*/
 541   5         case 7:
 542   5         photo_disp(i, j, aseven) ;break;/*显示一个seven的方块*/
 543   5         case 8:
 544   5         photo_disp(i, j, aeight) ;break;/*显示一个eight的方块*/
 545   5      }
 546   4      break;
 547   4      }
 548   3      }}
 549   1      else
 550   1      {switch(flag[i][j]){
 551   3      case UNFLAG:
C51 COMPILER V3.20,  SN-0  MAIN                                                            02/28/07  13:53:15  PAGE 10  

 552   3      photo_disp(i, j, unflag); /*显示一个未翻开的方块*/
 553   3      break;
 554   3      case FLAGED:
 555   3      photo_disp(i, j, flaged); /*显示一个插上标记的方块*/
 556   3      break;
 557   3      case QUESTION:
 558   3      photo_disp(i, j, question); /*显示一个不确定的方块*/
 559   3      break;
 560   3      case EXPLOD:
 561   3      photo_disp(i, j, explod); /*显示一个炸开的方块*/
 562   3      break;
 563   3      case OPEN:
 564   3      if(num[i][j]>=0 && num[i][j]<=8){
 565   4         switch(num[i][j]){
 566   5         case 0:
 567   5         photo_disp(i, j, zero);break; /*显示一个zero的方块*/
 568   5         case 1:
 569   5         photo_disp(i, j, one);break; /*显示一个one的方块*/
 570   5         case 2:
 571   5         photo_disp(i, j, two);break; /*显示一个one的方块*/
 572   5         case 3:
 573   5         photo_disp(i, j, three);break; /*显示一个three的方块*/
 574   5         case 4:
 575   5         photo_disp(i, j, four);break; /*显示一个four的方块*/
 576   5         case 5:
 577   5         photo_disp(i, j, five);break; /*显示一个five的方块*/
 578   5         case 6:
 579   5         photo_disp(i, j, six);break; /*显示一个six的方块*/
 580   5         case 7:
 581   5         photo_disp(i, j, seven) ;break;/*显示一个seven的方块*/

⌨️ 快捷键说明

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