📄 main.lst
字号:
466 3 else if (Map[pos-2]==2)
467 3 {
468 4 Map[pos-2]= 5;//显示十字形
469 4 Map[pos-1]= 4;//娃娃脸的新位置
470 4 Map[pos] = 0; //清空娃娃脸位置
471 4 }
472 3 break;
473 3 }
474 2 Refyuan();//刷新圆形并判断是否满足(过关!)
475 2 MapCreate(); //刷新地图
476 2 GameDisplay();//显示游戏界面
477 2
478 2 }
479 1 }
480 /**********************************************************
481 *函数名:RightMove()
482 *功 能:娃娃脸向右移动 +1
483 **********************************************************/
484 void RightMove()
485 {
486 1 uchar pos;
487 1 pos = ReadPosition(); //获得娃娃脸的位置
488 1 if (Map[pos+1]!=1)//判断移动方向前面是否是墙
489 1 {
C51 COMPILER V8.08 MAIN 06/14/2007 15:33:59 PAGE 9
490 2 switch (Map[pos+1])
491 2 {
492 3 case 0: //移动方向前面是空的执行这里
493 3 Map[pos+1] = 4;//娃娃脸的新位置
494 3 Map[pos] =0; //清空娃娃脸位置
495 3 break;
496 3 case 2: //是圆形执行这里
497 3 Map[pos+1] = 4;//娃娃脸的新位置
498 3 Map[pos] =0; //清空娃娃脸位置
499 3 break;
500 3 case 3: //移动方向前面是箱子执行这里
501 3 //箱子的前面不是墙或箱子或十字就可以移动
502 3 if (Map[pos+2]==0)
503 3 {
504 4 Map[pos+2]= 3;//显示箱子
505 4 Map[pos+1]= 4;//娃娃脸的新位置
506 4 Map[pos] = 0; //清空娃娃脸位置
507 4 }
508 3 else if(Map[pos+2]==2)
509 3 {
510 4 Map[pos+2]= 5; //显示十字形
511 4 Map[pos+1]= 4;//娃娃脸的新位置
512 4 Map[pos] = 0; //清空娃娃脸位置
513 4 }
514 3 break;
515 3 case 5: //移动方向前面是十字执行这里
516 3 //十字形的前面不是墙或箱子或十字就可以移动
517 3 if (Map[pos+2]==0)
518 3 {
519 4 Map[pos+2]= 3;//显示箱子
520 4 Map[pos+1]= 4;//娃娃脸的新位置
521 4 Map[pos] = 0; //清空娃娃脸位置
522 4 }
523 3 else if(Map[pos+2]==2)
524 3 {
525 4 Map[pos+2]= 5; //显示十字形
526 4 Map[pos+1]= 4;//娃娃脸的新位置
527 4 Map[pos] = 0; //清空娃娃脸位置
528 4 }
529 3 break;
530 3 }
531 2 Refyuan();//刷新圆形并判断是否满足(过关!)
532 2 MapCreate(); //刷新地图
533 2 GameDisplay();//显示游戏界面
534 2 }
535 1 }
536 /**********************************************************
537 *延时400us
538 **********************************************************/
539 void Delay400us() //晶振=12MHz 延时时间=404us
540 { //晶振=11.0592MHz 延时时间≈438us
541 1 uchar i,j; //总的延时时间=[(2*i)+1]*j+1+1
542 1 for (j=2;j>0;j--)
543 1 for (i=100;i>0;i--);
544 1 }
545 /**********************************************************
546 *函数名:Sound()
547 *功 能:音效子程序
548 **********************************************************/
549 void Sound()
550 {
551 1 uchar k;
C51 COMPILER V8.08 MAIN 06/14/2007 15:33:59 PAGE 10
552 1 for (k=40;k>0;k--)
553 1 {
554 2 Beep=~Beep;
555 2 Delay400us();
556 2 }
557 1 }
558
559 /**********************************************************
560 *函数名:IR()
561 *功 能:外中断遥控解码程序
562 **********************************************************/
563 void IR() interrupt 0
564 {
565 1 uchar i,k;
566 1 EA = 0; //关外中断0
567 1 if (P3_2==0) //P3.2低电平继续
568 1 {
569 2 for (i=8;i>0;i--) //循环检测10次,低电平引导信号干扰检测(9ms)
570 2 {
571 3 Delay400us(); //延时438us
572 3 if (P3_2==1) //低电平引导信号出现高电平就跳出
573 3 {
574 4 EA = 1; //开外中断
575 4 return;
576 4 }
577 3 }
578 2 while(P3_2==0); //等待高电平引导信号到了.
579 2 for (i=8;i>0;i--) //循环检测10次,高电平引导信号干扰检测(4.5ms)
580 2 {
581 3 Delay400us();
582 3 if (P3_2==0) //高电平引导信号出现低电平就跳出
583 3 {
584 4 EA = 1; //开外中断
585 4 return;
586 4 }
587 3 }
588 2 while(P3_2==1); //等待高电平引导信号结束.
589 2 //接收4个字节的数据
590 2 for (k=0;k<4;k++)
591 2 {
592 3 for (i=8;i>0;i--) //8位数据
593 3 {
594 4 while(P3_2==0); //等待第一个地址码的高电平到了.(保证判断每位数据的起点一致)
595 4 Delay400us();
596 4 Delay400us(); //延时0.876ms去判断P3.2的状态(0.56ms<延时时间<1.125ms)
597 4 KeyCoding[k]>>= 1; //右移1位
598 4 if(P3_2==1) //仍是1,最高位写入1,0跳过
599 4 KeyCoding[k]|= 0x80;
600 4 while(P3_2==1); //等待高电平结束
601 4 }
602 3 }
603 2 //比较地址码和地址反码,不同解码错误退出
604 2 if (KeyCoding[0]!=~KeyCoding[1]&&KeyCoding[2]!=~KeyCoding[3])
605 2 {
606 3 EA = 1; //开外中断
607 3 return;
608 3 }
609 2 }
610 1 switch (KeyCoding[2])
611 1 {//按键判断
612 2 case 0x51: //确定键
613 2 guanka++;
C51 COMPILER V8.08 MAIN 06/14/2007 15:33:59 PAGE 11
614 2 if (guanka==10) guanka=0;
615 2 CopyMap(guanka); //复制地图数据
616 2 MapCreate(); //地图生成程序
617 2 GameDisplay();//游戏界面显示程序
618 2 Readyuan();//
619 2 KeyCoding[2] = 0;
620 2 Sound(); //解码成功声音提示.
621 2 break;
622 2 case 0x06: //向上键
623 2 UpMove();
624 2 KeyCoding[2] = 0;
625 2 Sound(); //解码成功声音提示.
626 2 break;
627 2 case 0x44: //向下键
628 2 DownMove();
629 2 KeyCoding[2] = 0;
630 2 Sound(); //解码成功声音提示.
631 2 break;
632 2 case 0x47: //向左键
633 2 LeftMove();
634 2 KeyCoding[2] = 0;
635 2 Sound(); //解码成功声音提示.
636 2 break;
637 2 case 0x40: //向右键
638 2 RightMove();
639 2 KeyCoding[2] = 0;
640 2 Sound(); //解码成功声音提示.
641 2 break;
642 2 case 0x02: //第一次按进入设置,第二次退出设置状态
643 2 KeyCoding[2] = 0;
644 2 Sound(); //解码成功声音提示.
645 2 break;
646 2 case 0x07: //系统设定键
647 2 KeyCoding[2] = 0;
648 2 Sound(); //解码成功声音提示.
649 2 break;
650 2 }
651 1 EA = 1; //开外中断
652 1 }
653
654 /**********************************************************
655 *函数名:Init(void)
656 *功能:初始化
657 **********************************************************/
658 void Init()
659 {
660 1 EA = 1; //开总中断
661 1 IT0 = 1; //外中断0边沿触发
662 1 EX0 = 1; //开外中断0
663 1 }
664
665 /**********************************************************
666 *函数名:main (void)
667 *功能:主函数
668 **********************************************************/
669 void main (void)
670 {
671 1 uint i;
672 1 Delay400us();//等待电源稳定
673 1 Init(); //
674 1 LCDInit(); //液晶初始化程序
675 1 for (i=0;i<1024;i++)
C51 COMPILER V8.08 MAIN 06/14/2007 15:33:59 PAGE 12
676 1 {
677 2 GamePic[i] = 0; //外部RAM清0
678 2 }
679 1 CopyMap(0); //复制地图数据
680 1 MapCreate(); //地图生成程序
681 1 GameDisplay();//游戏界面显示程序
682 1 Readyuan(); //读得圆形的坐标位置
683 1 while(1);
684 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1247 ----
CONSTANT SIZE = 816 ----
XDATA SIZE = 1030 ----
PDATA SIZE = ---- ----
DATA SIZE = 5 5
IDATA SIZE = 64 ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -