📄 snake.lst
字号:
554 4 else My_snake.Game_Mode=GAME_OVER;
555 4 return ;
556 4 }
557 3 break;
558 3 case LEFT:
559 3 {
560 4 if(Press_Oppsite_Direction())
561 4 {
562 5 My_snake.direction=RIGHT;
563 5 return ; //如果是按了相反方向那么就返回并把方向转过来
564 5 }
565 4 else if(Sure_No_Stock()) //看看有障碍物
566 4 Go_Ahead();
567 4 else My_snake.Game_Mode=GAME_OVER;
568 4 return ;
569 4 }
570 3 break;
571 3 case UP:
572 3 {
573 4 if(Press_Oppsite_Direction())
574 4 {
575 5 My_snake.direction=DOWN;
576 5 return ; //如果是按了相反方向那么就返回并把方向转过来
577 5 }
578 4 else if(Sure_No_Stock()) //看看有障碍物
579 4 Go_Ahead();
580 4 else My_snake.Game_Mode=GAME_OVER;
581 4 return ;
582 4 }
583 3 break;
584 3 case DOWN:
585 3 {
586 4 if(Press_Oppsite_Direction())
587 4 {
588 5 My_snake.direction=UP;
589 5 return ; //如果是按了相反方向那么就返回并把方向转过来
590 5 }
591 4 else if(Sure_No_Stock()) //看看有障碍物
592 4 Go_Ahead();
593 4 else My_snake.Game_Mode=GAME_OVER;
594 4 return ;
595 4 }
596 3 break;
597 3 default:
598 3 break;
599 3 return;
600 3 }
601 2 return;
602 2
603 2 }
604 1 return ;
605 1
606 1 }
607
C51 COMPILER V7.20 SNAKE 12/23/2007 22:27:19 PAGE 11
608
609 /*-------------------写数据或指令到LCD-------------*/
610 void wr_lcd (bit dat_comm,uchar content) /*-------------------写数据或指令到LCD-------------*/
611 {
612 1 chk_busy ();
613 1 if(dat_comm)
614 1 {
615 2 rs=1; //data
616 2 rw=0; //write
617 2 }
618 1 else
619 1 {
620 2 rs=0; //command
621 2 rw=0; //write
622 2 }
623 1 P0=content; //output data or comm
624 1 e=1;
625 1 ;
626 1 ;
627 1 e=0;
628 1 }
629
630 void init_lcd (void) //初始化定时器
631 {
632 1
633 1
634 1 wr_lcd (comm,0x30); /*--30---基本指令动作--*/
635 1 wr_lcd (comm,0x01); /*--清屏,地址指针指向00H--*/
636 1 wr_lcd (comm,0x06); /*---光标的移动方向--*/
637 1 wr_lcd (comm,0x0c); /*---开显示,关游标--*/
638 1 }
639
640
641
642
643 /*------------显示一个整屏----------*/
644 void display_all_screen (uchar screen_num)
645 {
646 1 uchar counter;
647 1 wr_lcd (comm,0x30); /*30---基本指令动作*/
648 1 wr_lcd (comm,0x01); /*清屏,地址指针指向00H*/
649 1
650 1 wr_lcd (comm,0x34);
651 1 wr_lcd (comm,0x30);
652 1
653 1 wr_lcd (comm,clear_screen);//这里是写入清屏指令
654 1 wr_lcd (comm,0x80); //置AC为0
655 1 for(counter=0;counter<64;counter++)
656 1 {
657 2 wr_lcd (dat,screen_data[screen_num][counter]);
658 2 }
659 1 // screen_num
660 1
661 1 }
662
663
664 /*---------------检测忙信号----------------*/
665 void chk_busy (void) /*---------------检测忙信号----------------*/
666 {
667 1 P0=0xff;
668 1 rs=0;
669 1 rw=1;
C51 COMPILER V7.20 SNAKE 12/23/2007 22:27:19 PAGE 12
670 1 e =1;
671 1 while(busy==1);
672 1 e =0;
673 1 }
674 void Erasure() //擦除屏幕函数 这是在绘图模式下 (uchar data1,uchar data2)
675 {
676 1 uchar i,j,k,x;
677 1 wr_lcd (comm,0x30); /*30---基本指令动作*/
678 1 wr_lcd (comm,0x01); /*清屏,地址指针指向00H*/
679 1 x=0x80;
680 1 for(k=0;k<2;k++)
681 1 {
682 2 for(j=0;j<16;j++)
683 2 {
684 3 for(i=0;i<8;i++)
685 3 {
686 4 wr_lcd (comm,0x34);
687 4 wr_lcd (comm,0x80+j*2);
688 4 wr_lcd (comm,x+i);
689 4 wr_lcd (comm,0x30);
690 4 wr_lcd (dat,0x00);
691 4 wr_lcd (dat,0x00);
692 4 }
693 3 for(i=0;i<8;i++)
694 3 {
695 4 wr_lcd (comm,0x34);
696 4 wr_lcd (comm,0x80+j*2+1);
697 4 wr_lcd (comm,x+i);
698 4 wr_lcd (comm,0x30);
699 4 wr_lcd (dat,0x00);
700 4 wr_lcd (dat,0x00);
701 4 }
702 3 }
703 2 x=0x88;
704 2 }
705 1 wr_lcd (comm,0x36);
706 1 }
707
708 void Write_Screen_Data_To_Screen(uchar x,uchar y)//这个函数是用来将缓存数据定入LCD的其中两个参数是缓存坐标
709 {
710 1 uchar Screen_x=0,Screen_y=0,i,j;
711 1
712 1 if(y<8) {
713 2 Screen_x=0x80+x;
714 2 Screen_y=0x80+y*4;
715 2 }
716 1 else
717 1 {
718 2 Screen_x=0x88+x;
719 2 Screen_y=0x80+(y-8)*4;
720 2 } //游戏中的坐标和屏上的坐标不一样,要换一下
721 1 for(i=0;i<4;i++)
722 1 {
723 2 j=0;
724 2 wr_lcd (comm,0x34);
725 2 wr_lcd (comm,Screen_y+i);
726 2 wr_lcd (comm,Screen_x);
727 2 wr_lcd (comm,0x30);
728 2 wr_lcd (dat,My_snake.Screen_data[j++][i]);
729 2 wr_lcd (dat,My_snake.Screen_data[j++][i]);
730 2 j=0;
731 2 }
C51 COMPILER V7.20 SNAKE 12/23/2007 22:27:19 PAGE 13
732 1 wr_lcd (comm,0x36);
733 1
734 1 }
735 void Re_Build_Buffer(uchar x,uchar y)//这个是用来重构缓存数据
736 {
737 1 uchar i,j,k;
738 1 for(i=0;i<2;i++)
739 1 for(j=0;j<4;j++)
740 1 {
741 2 My_snake.Screen_data[i][j]=0x00;
742 2 }
743 1
744 1 for(i=0;i<SNAKE_LONG;i++)
745 1 {
746 2 if(My_snake.Snake_body[i][X_POT]/4==x&&My_snake.Snake_body[i][Y_POT]==y)
747 2 {
748 3 j=My_snake.Snake_body[i][X_POT]%4;
749 3 switch(j)
750 3 {
751 4 case 0:
752 4 {
753 5 for(k=0;k<4;k++)
754 5 {
755 6 My_snake.Screen_data[0][k]=My_snake.Screen_data[0][k]|0xf0;
756 6 }
757 5 }
758 4 break;
759 4 case 1:
760 4 {
761 5 for(k=0;k<4;k++)
762 5 {
763 6 My_snake.Screen_data[0][k]=My_snake.Screen_data[0][k]|0x0f;
764 6 }
765 5 }
766 4 break;
767 4 case 2:
768 4 {
769 5 for(k=0;k<4;k++)
770 5 {
771 6 My_snake.Screen_data[1][k]=My_snake.Screen_data[1][k]|0xf0;
772 6 }
773 5 }
774 4 break;
775 4 case 3:
776 4 {
777 5 for(k=0;k<4;k++)
778 5 {
779 6 My_snake.Screen_data[1][k]=My_snake.Screen_data[1][k]|0x0f;
780 6 }
781 5 }
782 4 break;
783 4 default:
784 4 break;
785 4 }
786 3 }
787 2 }
788 1 if(My_snake.Food_Postion.x/4==x&&My_snake.Food_Postion.y==y)
789 1 {
790 2 j=My_snake.Food_Postion.x%4;
791 2 switch(j)
792 2 {
793 3 case 0:
C51 COMPILER V7.20 SNAKE 12/23/2007 22:27:19 PAGE 14
794 3 {
795 4 for(k=0;k<4;k++)
796 4 {
797 5 My_snake.Screen_data[0][k]=My_snake.Screen_data[0][k]|0xf0;
798 5 }
799 4 }
800 3 break;
801 3 case 1:
802 3 {
803 4 for(k=0;k<4;k++)
804 4 {
805 5 My_snake.Screen_data[0][k]=My_snake.Screen_data[0][k]|0x0f;
806 5 }
807 4 }
808 3 break;
809 3 case 2:
810 3 {
811 4 for(k=0;k<4;k++)
812 4 {
813 5 My_snake.Screen_data[1][k]=My_snake.Screen_data[1][k]|0xf0;
814 5 }
815 4 }
816 3 break;
817 3 case 3:
818 3 {
819 4 for(k=0;k<4;k++)
820 4 {
821 5 My_snake.Screen_data[1][k]=My_snake.Screen_data[1][k]|0x0f;
822 5 }
823 4 }
824 3 break;
825 3 default:
826 3 break;
827 3 }
828 2 }
829 1 }
830
831 void delay_ms(unsigned int ms)////延时毫秒级的
832 { unsigned int i,j;
833 1 uchar timer;
834 1 for(i=0;i<ms;i++)
835 1 for(j=0;j<30;j++)
836 1 { for(timer=10;timer>1;timer--)
837 2 {
838 3 ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -