📄 main.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 + -