⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 使用51单片机作出来的12864贪吃蛇程序 包含仿真和程序源文件
💻 C
字号:
//南阳理工学院
//作者QQ:497259320
//此程序为了减小处理器的负担而使用占用大量数据存储器的方法。比如数组length[62]
//绝对可以缩减为length[40],但在算法和存储上更复杂!
//在硬件上实现功能得改一些地方!
#include <at89x51.h>
#include "18b20.h"
#include "1302.h"
#include "12864.h"
#include "zifu.h"
#include "key.h"
uchar length[62]={0,8,1,8};	 //存放蛇身的数组;
bit flag2,flag4,flag=0;			 //flag是行列标志,0表示行,1表示列;flag1是步进标志	flag2表示是否蛇头遇到蛇身 1表示没有;
bit flag3,flag5=0;
bit flag1=0;                //flag5是外部中断1的标志位,flag3表示食物是否在蛇身身上;flag4是蛇是否吃食物的标志
uchar k,dengji=2;           //flag3是食物是否重选的标志。k是按键号;
uchar direction=1; 			 //direction表示方向;
uchar p=20;                //定时次数  
systemtime realtime;
/*中断了程序*/ 
/*通过按键的值判断蛇头行走的方向*/           
void zhongduan() interrupt 0 using 0 
  {
	k=(P2>>6);	   
	k=k&0x03;
	if(flag)
	{
	  if(k==1)   direction=3;//左
	  if(k==2)	 direction=1;//右
	}
	else
	{
	  if(k==0)	 direction=4;//上
	  if(k==3)	 direction=2;//下
	}
  }
/*开始暂停键的判断*/
void zhongduan1() interrupt 2 using 2
{
   if(!flag5)
   {
     flag5=1;
   }
   else
   {
     flag5=0;
   }
}
void dingshi() interrupt 1  using 1  //定时程序.产生步进时间
{
   if(p--)
   {
    TL0=0;
	TH0=0xa0;
	flag1=0;
   }
   else
   {
     flag1=1;
	 TL0=0;
	 TH0=0x00;
	 p=20-(dengji>>1);
   }
 }
main()
{
  uchar food[2]={12,8};
  uchar i,x,y;				   //x,y是食物的缓存区
  choose12864(2);
  init12864();
  clear12864();
  for(i=0;i<3;i++)
  {
    play16(0,(2+(i<<1)),0,(xuexiao+(i<<5)));                //屏 列 页  地址
	delay1ms(300);
  }													   //显示“南阳理"
  for(i=0;i<3;i++)
  {
    play16(1,((i<<1)),0,xuexiao+((i+3)<<5));
	delay1ms(300);
  }													   //显示“工学院"
  for(i=0;i<96;i++)
    {
	  dot(16+i,15);
	  delay1ms(2);
	}													//显示直线
  play16(0,4,1,sjz);
  play16(0,6,1,sjz+32);
  play16(1,0,1,sjz+64);									//显示设计者
  delay1ms(450);
  delay1ms(450);
  play16(0,4,2,ming);
  delay1ms(350);
  play16(0,6,2,ming+32);
  delay1ms(350);
  play16(1,0,2,ming+64);
  delay1ms(350);
  play16(1,2,2,ming+96);
  delay1ms(350);
  delay1ms(350);
  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);
  TMOD=1;	  //定时器工作方式
  IT0=1;	  //边延有效
  IT1=1;
  EA=1;		  //开CPU中断
  ET0=1;	  //开定时器中断
  EX0=1;	  //开外部中断
  EX1=1;
  TL0=0x00;
  TH0=0x00;	  //定时器初值
  TR0=1;	  //启动定时器
  do
  {
   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);
   if(flag5!=flag)
	{
      (*(void(*)())0)(); //让PC置程序计数器地址零
	 }			 
  choose12864(2);
  init12864();
  clear12864();
  play8(0,0,0,shu2);		 //屏,列,页,地址
  play8(0,1,0,shu0);
  play16(0,4,0,nian);
  play16(1,0,0,yue);
  play16(1,4,0,ri);
  play16(0,2,1,shi);
  play16(0,6,1,fen);
  play16(1,2,1,miao);
  
  play16(1,0,2,xing);
  play16(1,2,2,qi);
  vertical(3,63,127);
  vertical(3,63,126);
  vertical(3,63,122);
  vertical(3,63,121);
   for(i=0;i<7;i++)
  {
    dot(121+i,3);
	dot(121+i,63);
  }
  for(i=0;i<12;i++)
  {
    dot(123,8+5*i);
  }
  for(i=0;i<7;i++)
  {
    if(i<4)
	{
	  play16(0,i*2,3,yanyu+i*32);
	}
	if(i>=4)
	{
	  play16(1,(i-4)*2,3,yanyu+i*32);
	}
  }
  init_ds1302();
  init_time();
  flag=0;
  flag5=0;
  do
  {
     gettime(&realtime);
	 play8(0,2,0,(shu0+16*datastring[0]));
	 play8(0,3,0,(shu0+16*datastring[1]));
	 play8(0,6,0,(shu0+16*datastring[2]));
	 play8(0,7,0,(shu0+16*datastring[3]));
	 play8(1,2,0,(shu0+16*datastring[4]));
	 play8(1,3,0,(shu0+16*datastring[5]));
	 play8(0,0,1,(shu0+16*datastring[6]));
	 play8(0,1,1,(shu0+16*datastring[7]));
	 play8(0,4,1,(shu0+16*datastring[8]));
	 play8(0,5,1,(shu0+16*datastring[9]));
	 play8(1,0,1,(shu0+16*datastring[10]));
	 play8(1,1,1,(shu0+16*datastring[11]));
	 play16(1,4,2,(yi+32*(datastring[12]-1)));
	 gettemperature();
	 if(flagg)
	 {
	   play8(0,0,2,fu);
	   play8(1,6,3,fu);
	 }
	 else
	  {
	    clear8(6,4,0);
		play8(1,6,3,zheng);
	  }
	 play8(0,4+flagg,2,dian);
     play8(0,5+flagg,2,C);
	 play8(0,0+flagg,2,(shu0+16*temp[0]));
	 play8(0,1+flagg,2,(shu0+16*temp[1]));
	 play8(0,2+flagg,2,xiao);
	 play8(0,3+flagg,2,(shu0+16*temp[2]));
	 play();
	 keyscan();
	 switch(sum)
	 {
	  case 0:x=ds1302_year;break;
	  case 1:x=ds1302_month;break;
	  case 2:x=ds1302_week;break;
	  case 3:x=ds1302_day;break;
	  case 4:x=ds1302_hour;break;
	  case 5:x=ds1302_minute;break;
	  case 6:x=ds1302_second;break;
	  default:break;
	 }
	
	   keyscan();
	   if(sum==7)
	   {
	     set(x,1);
		 sum=0xff;
	   }
	   else if(sum==8)
	   {
	     set(x,0);
		 sum=0xff;
	   }
	 
  }	 
  while(1);
}	
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -