📄 main.c
字号:
//南阳理工学院
//作者QQ:497259320
//网站:http://proteus.5d6d.com
//临近考试,写的很急,有一些BUG,希望大家指出改正并告诉我!谢!
//此程序为了减小处理器的负担而使用占用大量数据存储器的方法。比如数组length[80]
//绝对可以缩减为length[40],但在算法和存储上更复杂!
//在硬件上实现功能得改一些地方!
#include "12864.h"
#include "zifu.h"
uchar length[80]={0,8,1,8};
bit flag2,flag=0; //0表示行,1表示列 flag1是步进标志 flag2表示是否蛇头遇到蛇身 1表示没有
uchar direction=1;
bit flag3,flag1=0;
uchar k,dengji=2; //flag3是食物是否重选的标志。k是按键号
uchar p=20; //定时次数
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 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;
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; //边延有效
EA=1; //开CPU中断
ET0=1; //开定时器中断
EX0=1; //开外部中断
TL0=0x00;
TH0=0x00; //定时器初值
TR0=1; //启动定时器
do
{
while(!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;
}
}
if(((*(length+(dengji<<1)-2))==food[0])&&((*(length+(dengji<<1)-1))==food[1]))
{
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);
for(i=0;i<dengji;i++)
{
change(length+(i<<1),length+(i<<1)+1);
}
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);
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -