📄 main.lst
字号:
546 4 Map[pos-1]= 4;//娃娃脸的新位置
547 4 Map[pos] = 0; //清空娃娃脸位置
548 4 }
549 3 break;
550 3 case 5: //移动方向前面是十字执行这里
551 3 //十字的前面不是墙或箱子或十字就可以移动
C51 COMPILER V8.08 MAIN 06/15/2007 17:28:51 PAGE 10
552 3 if (Map[pos-2]==0)
553 3 {
554 4 Map[pos-2]= 3;//显示箱子
555 4 Map[pos-1]= 4;//娃娃脸的新位置
556 4 Map[pos] = 0; //清空娃娃脸位置
557 4 }
558 3 else if (Map[pos-2]==2)
559 3 {
560 4 Map[pos-2]= 5;//显示十字形
561 4 Map[pos-1]= 4;//娃娃脸的新位置
562 4 Map[pos] = 0; //清空娃娃脸位置
563 4 }
564 3 break;
565 3 }
566 2 Refyuan(); //刷新圆形
567 2 MapCreate(); //刷新地图
568 2 GameDisplay(GamePic);//显示游戏界面
569 2 Next(); //判断是否满足进入下一关
570 2 }
571 1 }
572 /**********************************************************
573 *函数名:RightMove()
574 *功 能:娃娃脸向右移动 +1
575 **********************************************************/
576 void RightMove()
577 {
578 1 uchar pos;
579 1 pos = ReadPosition(); //获得娃娃脸的位置
580 1 if (Map[pos+1]!=1) //判断移动方向前面是否是墙
581 1 {
582 2 switch (Map[pos+1])
583 2 {
584 3 case 0: //移动方向前面是空的执行这里
585 3 Map[pos+1] = 4;//娃娃脸的新位置
586 3 Map[pos] =0; //清空娃娃脸位置
587 3 break;
588 3 case 2: //是圆形执行这里
589 3 Map[pos+1] = 4;//娃娃脸的新位置
590 3 Map[pos] =0; //清空娃娃脸位置
591 3 break;
592 3 case 3: //移动方向前面是箱子执行这里
593 3 //箱子的前面不是墙或箱子或十字就可以移动
594 3 if (Map[pos+2]==0)
595 3 {
596 4 Map[pos+2]= 3;//显示箱子
597 4 Map[pos+1]= 4;//娃娃脸的新位置
598 4 Map[pos] = 0; //清空娃娃脸位置
599 4 }
600 3 else if(Map[pos+2]==2)
601 3 {
602 4 Map[pos+2]= 5;//显示十字形
603 4 Map[pos+1]= 4;//娃娃脸的新位置
604 4 Map[pos] = 0; //清空娃娃脸位置
605 4 }
606 3 break;
607 3 case 5: //移动方向前面是十字执行这里
608 3 //十字形的前面不是墙或箱子或十字就可以移动
609 3 if (Map[pos+2]==0)
610 3 {
611 4 Map[pos+2]= 3;//显示箱子
612 4 Map[pos+1]= 4;//娃娃脸的新位置
613 4 Map[pos] = 0; //清空娃娃脸位置
C51 COMPILER V8.08 MAIN 06/15/2007 17:28:51 PAGE 11
614 4 }
615 3 else if(Map[pos+2]==2)
616 3 {
617 4 Map[pos+2]= 5;//显示十字形
618 4 Map[pos+1]= 4;//娃娃脸的新位置
619 4 Map[pos] = 0; //清空娃娃脸位置
620 4 }
621 3 break;
622 3 }
623 2 Refyuan(); //刷新圆形
624 2 MapCreate(); //刷新地图
625 2 GameDisplay(GamePic);//显示游戏界面
626 2 Next(); //判断是否满足进入下一关
627 2 }
628 1 }
629 /**********************************************************
630 *延时400us
631 **********************************************************/
632 void Delay400us() //晶振=12MHz 延时时间=404us
633 { //晶振=11.0592MHz 延时时间≈438us
634 1 uchar i,j; //总的延时时间=[(2*i)+1]*j+1+1
635 1 for (j=4;j>0;j--) //j=2用12MHz,j=4 是24MHz晶振
636 1 for (i=100;i>0;i--);
637 1 }
638 /**********************************************************
639 *函数名:Sound()
640 *功 能:音效子程序
641 **********************************************************/
642 void Sound()
643 {
644 1 uchar i;
645 1 for (i=40;i>0;i--)
646 1 {
647 2 Beep=~Beep;
648 2 Delay400us();
649 2 }
650 1 }
651 /**********************************************************
652 *函数名:IR()
653 *功 能:外中断遥控按键解码程序(108ms)
654 **********************************************************/
655 void IR() interrupt 0
656 {
657 1 uchar i,k;
658 1 EA = 0; //关外中断0
659 1 if (P3_2==0) //P3.2低电平继续
660 1 {
661 2 for (i=8;i>0;i--) //循环检测10次,低电平引导信号干扰检测(9ms)
662 2 {
663 3 Delay400us(); //延时438us
664 3 if (P3_2==1) //低电平引导信号出现高电平就跳出
665 3 {
666 4 EA = 1; //开外中断
667 4 return;
668 4 }
669 3 }
670 2 while(P3_2==0); //等待高电平引导信号到了.
671 2 for (i=8;i>0;i--) //循环检测10次,高电平引导信号干扰检测(4.5ms)
672 2 {
673 3 Delay400us();
674 3 if (P3_2==0) //高电平引导信号出现低电平就跳出
675 3 {
C51 COMPILER V8.08 MAIN 06/15/2007 17:28:51 PAGE 12
676 4 EA = 1; //开外中断
677 4 return;
678 4 }
679 3 }
680 2 while(P3_2==1); //等待高电平引导信号结束.
681 2 //接收4个字节的数据
682 2 for (k=0;k<4;k++)
683 2 {
684 3 for (i=8;i>0;i--) //8位数据
685 3 {
686 4 while(P3_2==0); //等待第一个地址码的高电平到了.(保证判断每位数据的起点一致)
687 4 Delay400us();
688 4 Delay400us(); //延时0.876ms去判断P3.2的状态(0.56ms<延时时间<1.125ms)
689 4 KeyCoding[k]>>= 1; //右移1位
690 4 if(P3_2==1) //仍是1,最高位写入1,0跳过
691 4 KeyCoding[k]|= 0x80;
692 4 while(P3_2==1); //等待高电平结束
693 4 }
694 3 }
695 2 //比较地址码和地址反码,不同解码错误退出
696 2 if (KeyCoding[0]!=~KeyCoding[1]&&KeyCoding[2]!=~KeyCoding[3])
697 2 {
698 3 EA = 1; //开外中断
699 3 return;
700 3 }
701 2 }
702 1 //按键判断也可以放到这里
703 1 Sound(); //解码成功声音提示.
704 1 EA = 1; //开外中断
705 1 }
706 /**********************************************************
707 *函数名:LOGO()
708 *功 能:开机画面
709 **********************************************************/
710 LOGO()
711 {
712 1 uchar i,j;
713 1 LCDWriteCommand(0x30);//基本指令集
714 1 LCDWriteCommand(0x80);//从第一行开始显示
715 1 for (i=0;i<4;i++)
716 1 {
717 2 for (j=0;j<16;j++)
718 2 {
719 3 LCDWriteData(logotab[i][j]);
720 3 }
721 2 }
722 1 }
723 /**********************************************************
724 *函数名:Delay1S()
725 *功 能:初始化
726 **********************************************************/
727 Delay1S(uchar n)
728 {
729 1 uchar i,j,k,l;
730 1 for (l=n;l>0;l--)
731 1 {
732 2 for (i=100;i>0;i--)
733 2 {
734 3 for (j=40;j>0;j--)
735 3 for (k=250;k>0;k--);
736 3 }
737 2 }
C51 COMPILER V8.08 MAIN 06/15/2007 17:28:51 PAGE 13
738 1 }
739 /**********************************************************
740 *函数名:Init(void)
741 *功 能:初始化
742 **********************************************************/
743 void Init()
744 {
745 1 EA = 1; //开总中断
746 1 IT0 = 1; //外中断0边沿触发
747 1 EX0 = 1; //开外中断0
748 1 }
749 /**********************************************************
750 *函数名:main (void)
751 *功能:主函数
752 **********************************************************/
753 void main (void)
754 {
755 1 uint i;
756 1 Delay1S(1);//等待电源稳定
757 1 LCDInit(); //液晶初始化程序
758 1 for (i=1024;i>0;i--) GamePic[i] = 0; //外部RAM清0
759 1 LOGO(); //
760 1 Delay1S(4);
761 1 LCDWriteCommand(0x01);
762 1 Delay400us();
763 1 CopyMap(0); //复制地图数据
764 1 MapCreate(); //地图生成程序
765 1 GameDisplay(GamePic);//游戏界面显示程序
766 1 Readyuan(); //读得圆形的坐标位置和个数
767 1 Init(); //
768 1 while(1)
769 1 {
770 2 switch (KeyCoding[2]) //可以放到主程序的while(1)循环中.
771 2 {//按键判断
772 3 case 0x51: //确定键
773 3 guanka++; //关卡选择(测试地图编辑的是否正确用的)
774 3 if (guanka==20) guanka=0;
775 3 CopyMap(guanka); //复制地图数据
776 3 MapCreate(); //地图生成程序
777 3 GameDisplay(GamePic);//游戏界面显示程序
778 3 Readyuan(); //读圆形的坐标和数目
779 3 KeyCoding[2] = 0;
780 3 break;
781 3 case 0x06: //向上键
782 3 UpMove();
783 3 KeyCoding[2] = 0;
784 3 break;
785 3 case 0x44: //向下键
786 3 DownMove();
787 3 KeyCoding[2] = 0;
788 3 break;
789 3 case 0x47: //向左键
790 3 LeftMove();
791 3 KeyCoding[2] = 0;
792 3 break;
793 3 case 0x40: //向右键
794 3 RightMove();
795 3 KeyCoding[2] = 0;
796 3 break;
797 3 case 0x02: //第一次按进入设置,第二次退出设置状态
798 3 KeyCoding[2] = 0;
799 3 break;
C51 COMPILER V8.08 MAIN 06/15/2007 17:28:51 PAGE 14
800 3 case 0x07: //系统设定键
801 3 KeyCoding[2] = 0;
802 3 break;
803 3 }
804 2 }
805 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1656 ----
CONSTANT SIZE = 1524 ----
XDATA SIZE = 74 ----
PDATA SIZE = ---- ----
DATA SIZE = 1 7
IDATA SIZE = ---- ----
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 + -