📄 main.lst
字号:
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 + -