主程序:
#include
#include
#include "ds1302.h"
#define uchar unsigned char
#define uint unsigned int
#define max_length 64
#define up 1
#define down 2
#define left 3
#define right 4
sbit k_up=P3^0;
sbit k_down=P3^3;
sbit k_left=P3^2;
sbit k_right=P3^7;
uchar code zong[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
//显示行的表格数据
uchar code
redblue[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
//显示列的表格数据
uint speed=2000; //控制速度的变量
uchar lastx,lasty,gc=2;
//lastx,lasty,用来存最后一节蛇的坐标,gc是控制速度的
uchar idata snakex[max_length],snakey[max_length];
//蛇每一节的坐标,因为变量很多,所以加idata,声明其存储的区
uchar length; //蛇身长度变量
uchar direction; //蛇头方向
bit live; //蛇死还是活
uchar foodx,foody; //食物的坐标
bit exist;
void delay(uchar i)
{
uchar j;
while(i--)for(j=110;j>0;j--);
}
void move();
void init();
void creatfood();
void drawsnake();
void drawfood();
void playgame();
void keyscan();
void eatfood();
void gameover();
bit zwall();
bit zself();
void main()
{
init();
playgame();
gameover();
}
void init() //初始化
{
snakex[0]=1;
snakey[0]=7;
snakex[1]=0;
snakey[1]=7;
length=2;
direction=4;
live=1;
srand(gettime()); //从ds1302读出秒,作为随机数种子
}
void playgame()
{
uint p;
while(k_right); //按右键开始游戏
delay(5);
while(live)
{
if(zwall()&&zself())
{
if(!exist)creatfood();
exist=1;
eatfood();
for(p=speed;p>0;p--) //循环显示,控制速度
{
drawsnake();
drawfood();
}
move();
}
else live=0;
}
}
void drawsnake() //显示蛇
{
uchar i;
for(i=0;i
{
P0=zong[snakey[i]];
P2=redblue[snakex[i]];
keyscan(); //键盘扫描加到这里,即起到延时作用,又提高按键灵活性
P0=0;
P2=0xff;
}
}
void creatfood()
{
uchar i;
loop: foodx=((int)rand()%8);
foody=((int)rand()%8);
for(i=0;i
{
if((foodx==snakex[i])&&((foody)==snakey[i]))
goto loop;
}
}
void drawfood() //显示食物
{
if(exist)
{
P0=zong[foody];
P1=redblue[foodx];
keyscan(); //键盘扫描加到这里,即起到延时作用,又提高按键灵活性
P0=0;
P1=0xff;
}
}
void keyscan() //键盘扫描
{
if(k_up==0)
{
delay(5);
if(k_up==0)
{
if(direction!=down)direction=up;
}
}
if(k_down==0)
{
delay(5);
if(k_down==0)
{
if(direction!=up)direction=down;
}
}
if(k_left==0)
{
delay(5);
if(k_left==0)
{
if(direction!=right)direction=left;
}
}
if(k_right==0)
{
delay(5);
if(k_right==0)
{
if(direction!=left)direction=right;
}
}
}
void move()
{
uchar k;
lastx=snakex[length-1];
lasty=snakey[length-1];
for(k=length-1;k>0;k--)
{
snakex[k]=snakex[k-1];
snakey[k]=snakey[k-1];
}
switch(direction)
{
case up: snakey[0]++;
break;
case down: snakey[0]--;
break;
case left: snakex[0]--;
break;
case right: snakex[0]++;
break;
}
}
bit zwall() //判断是否撞到墙
{
if((snakex[0]>7)||(snakey[0]>7))return
0;
else return 1;
}
bit zself() //判断是否撞到自己
{
uchar i;
for(i=3;i
{
if((snakex[0]==snakex[i])&&(snakey[0]==snakey[i]))
return 0;
}
return 1;
}
void eatfood()
{
if((snakex[0]==foodx)&&(snakey[0]==foody))
{
length++;
exist=0;
snakex[length-1]=lastx;
snakey[length-1]=lasty;
if(length<20)
{
speed-=gc; //控制速度
gc+=11;
}
else speed-=2;
}
}
void gameover() //游戏结束,全亮
{
P0=0xff;
P2=0;
}
ds1302的驱动程序:
#include
#define uchar unsigned char
sbit ACC7=ACC^7;
sbit ACC0=ACC^0;
sbit scl=P3^6;
sbit sda=P3^4;
sbit rst=P3^5;
void w1byte(uchar date)
{
uchar i;
ACC=date;
for(i=8;i>0;i--)
{
scl=0;
sda=ACC0;
scl=1;
ACC>>=1;
}
}
uchar r1byte()
{
uchar i;
for(i=8;i>0;i--)
{
scl=0;
ACC>>=1;
ACC7=sda;
scl=1;
}
return (ACC);
}
uchar rbyte(uchar command)
{
uchar a;
rst=0;
scl=0;
rst=1;
w1byte(command|0x01);
a=r1byte();
rst=0;
return(a);
}
uchar gettime()
{
uchar readval;
readval=rbyte(0x80);
readval=((readval&0x70)>>4)*10+(readval&0x0f);
return (readval);
}
另外我还做了个基于protues的点阵贪吃蛇,很简单,就画了个图,把键盘扫描改为中断方式,程序没怎么调,速度没调好,懒的调了,可以到http://download.csdn.net/detail/wlx1993/5585257去下载