一、功能简介

本项目使用Proteus8仿真51单片机控制器,使用按键、LCD12864等。
主要功能:
系统运行后,LCD12864显示游戏界面,可按任意键进入游戏选择界面,按上下键可选择,按确认键进入游戏,当游戏需要暂停和开始,可按下确认键。


二、软件设计

/*
作者:嗨小易(QQ技术交流群:570487280)

*/



/*贪吃蛇子程序*/
void tanchishe(void)													   
{	   
  uchar xdata length[102]={0,8,1,8};	 //存放蛇身的数组;
  uchar food[2]={12,8};
  uchar i,x,y;
  bit flag2,flag3,flag4;
  TMOD=1;	  //定时器工作方式
  IT0=1;	  //边延有效
  IT1=1;
  EA=1;		  //开CPU中断
  ET0=1;	  //开定时器中断
  EX0=1;	  //开外部中断
  EX1=1;
  TL0=0x00;
  TH0=0x00;	  //定时器初值
  TR0=1;	  //启动定时器

  dengji=2;
  p=20;
  direction=1;
  flag5=0;
  
  choose12864(2);
  clear12864();	
  vertical(1,61,30);
  vertical(1,61,127);
  for(i=0;i<98;i++)
  {
    dot(30+i,1);
	dot(30+i,62);
  }
  play16(0,0,0,tan);
  play16(0,0,1,chi);
  play16(0,0,2,she);
  change(length,(length+1));
  change((length+2),(length+3));
  change(food,food+1);
  for(;;)
  {
    do
   {
    first=1;
    while(flag5|!flag1);
    x=*(length);                               
    y=*(length+1);
    switch(direction)			   //右
	{
	  case 1:
	    {
	      for(i=0;i<dengji-1;i++)
	       {
	         *(length+(i<<1))=*(length+(i<<1)+2);
		     *(length+(i<<1)+1)=*(length+(i<<1)+3);
	       }
	       (*(length+(dengji<<1)-2))++;
		   flag=0;
		   break;
	      }
	   	case 2:					  //下
		 {
	      for(i=0;i<dengji-1;i++)
	       {
	         *(length+(i<<1))=*(length+(i<<1)+2);
		     *(length+(i<<1)+1)=*(length+(i<<1)+3);
	       }
		    (*(length+(dengji<<1)-1))++;
			flag=1;
			break;
		  }
		case 3:					//左
		 {
	       for(i=0;i<dengji-1;i++)
	       {
	         *(length+(i<<1))=*(length+(i<<1)+2);
		     *(length+(i<<1)+1)=*(length+(i<<1)+3);
	       }
	       (*(length+(dengji<<1)-2))--;
		   flag=0;
		   break;
		 }
		case 4:
		 {			//上
		 for(i=0;i<dengji-1;i++)
	       {
	         *(length+(i<<1))=*(length+(i<<1)+2);
		     *(length+(i<<1)+1)=*(length+(i<<1)+3);
	       }
		    (*(length+(dengji<<1)-1))--;
			flag=1;
			break;
		 }
	 }
	 flag4=((*(length+(dengji<<1)-2))==food[0])&&((*(length+(dengji<<1)-1))==food[1]);
	 if(flag4)	//
	 {
		for(i=dengji;i>0;i--)
		{
		  *(length+(i<<1))=*(length+(i<<1)-2);
		  *(length+(i<<1)+1)=*(length+(i<<1)-1);
		}
		*length=x;
		*(length+1)=y;
		dengji++;
		do
		{
		  flag3=0;
		  food[0]=TL0%24;
	      food[1]=TL0%15;
		  for(i=0;i<dengji-1;i++)	 //食物是否在蛇身身上
		  {
		    if((*(length+(i<<1)))==food[0]&&((*(length+(i<<1)+1))==food[1]))
			{
			  flag3=1;
			  break;
			 }
		  }
		}while(flag3);
		change(food,food+1); 
	 }
     flag2=1;	  //蛇头没有遇到蛇身
	 for(i=0;i<dengji-1;i++)
        {
		   if(*(length+(i<<1))==*(length+(dengji<<1)-2)&&(*(length+(i<<1)+1)==*(length+(dengji<<1)-1)))
		   {
		     flag2=0;
			 break;
			}
		}
	  flag2=flag2&&*(length+(dengji<<1)-2)>=0&&*(length+(dengji<<1)-2)<24;//蛇头是否出边界
	  flag2=flag2&&*(length+(dengji<<1)-1)>=0&&*(length+(dengji<<1)-1)<15;
	  if(flag2)
	   {
	    clear(&x,&y); 
		
	    
	     {
	       change(length+(dengji<<1)-2,length+(dengji<<1)-1);
	     }
		 if(flag4)
		 {
		   change(&x,&y);
		  }
	    flag1=0;
	    play8(0,0,3,shu0+((dengji/10)<<4));
	    play8(0,1,3,shu0+(((dengji)%10)<<4));
	   }
   }
   while(flag2);
   delay1ms(450);
   delay1ms(450);
   choose12864(2);
   clear12864();
   play16(0,4,1,over);
   play16(0,6,1,over+32);
   play16(1,0,1,over+64);
   play16(1,2,1,over+96);
   delay1ms(450);
   delay1ms(450);
   break;
  }
}
//////////////////////////////
main(void)
{
 uchar i;
 uchar count=0;
 P2=0xff;
  EA=1;		  //开CPU中断
  //ET0=1;	  //开定时器中断
  EX0=1;	  //开外部中断
  EX1=1;
 choose12864(2);
 init12864();
 clear12864();
 ////////////////////
 play16(0,4,0,tan);
 play16(0,6,0,chi);
 play16(1,0,0,she);
 ///////////////////
 play16(0,4,1,els);
 play16(0,6,1,els+32);
 for(i=0;i<3;i++)
 {
   play16(1,i<<1,1,(els+64+(i<<5)));
 }
 //////////////////

 play16(0,4,2,wnl);
 play16(0,6,2,wnl+32);
 play16(1,0,2,wnl+64);
 
 //////////////////
 for(;;)
  {
    if((k==0x03)&&((P3&0x04)==0x04))
   {
	count++;
	k=0;
	if(count==4)
	count=1;
	switch(count)
	{
	  case 1:
	         {
			    play16(0,4,2,wnl);
                play16(0,6,2,wnl+32);
                play16(1,0,2,wnl+64);
				play16_fb(0,4,0);
                play16_fb(0,6,0);
                play16_fb(1,0,0);
			 };break;
	  case 2: {
	  		   	 play16(0,4,0,tan);
                 play16(0,6,0,chi);
                 play16(1,0,0,she);
				 play16_fb(0,4,1);
                 play16_fb(0,6,1);
                 for(i=0;i<3;i++)
                 {
                   play16_fb(1,i<<1,1);
                  }
 	           };break;
	  case 3:
	          {
	            
				 play16(0,4,1,els);
                 play16(0,6,1,els+32);
                 for(i=0;i<3;i++)
                 {
                   play16(1,i<<1,1,(els+64+(i<<5)));
                 } 
				 play16_fb(0,4,2);
                 play16_fb(0,6,2);
                 play16_fb(1,0,2); 
	          };break;
	default:break;
	}
  }
  if(P3&0x04)
  first=1;
  if(flag5)
  {
    switch(count)
	{
	  case 1:flag5=0;tanchishe();count=0;flag5=0;k=0;break;
	  case 2:flag5=0;fangkuai();count=0;flag5=0; k=0;break;
//	  case 3:flag5=0;wannianli();count=0;flag5=0;k=0;break;
	  default:count=0;k=3;flag5=0;break;
	}
	 choose12864(2);
     init12864();
     clear12864();
 ////////////////////
     play16(0,4,0,tan);
     play16(0,6,0,chi);
     play16(1,0,0,she);
 ///////////////////
     play16(0,4,1,els);
     play16(0,6,1,els+32);
     for(i=0;i<3;i++)
     {
       play16(1,i<<1,1,(els+64+(i<<5)));
     }
 //////////////////

     play16(0,4,2,wnl);
     play16(0,6,2,wnl+32);
     play16(1,0,2,wnl+64);
 //////////////////
  }
 }

}





三、实验现象

B站演示视频:https://space.bilibili.com/444388619

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

联系作者

视频地址:https://space.bilibili.com/444388619/video
专注于51单片机、STM32、国产32、DSP、Proteus、arduino、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐