?? 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 + -