51单片机游戏(贪吃蛇)
一、电路设计
此电路由AT89C51最小系统、74HC595位移缓存器、8*8点阵LED屏和按键组成。
74HC595位移缓存器
74HC595是一个8位串行输入、并行输出的位移缓存器:并行输出为三态输出。在SCK
的上升沿,串行数据由SDL输入到内部的8位位移缓存器,并由Q7’输出,而并行输出则是在LCK的上升沿将在8位位移缓存器的数据存入到8位并行输出缓存器。当串行数据输入端OE的控制信号为低使能时,并行输出端的输出值等于并行输出缓存器所存储的值。
符号 | 引脚 | 描述 |
---|---|---|
Q0~Q7 | 第15脚,第1-7脚 | 8位并行数据输出 |
GND | 第8脚 | 地 |
Q7’ | 第9脚 | 串行数据输出 |
/MR | 第10脚 | 主复位(低电平有效) |
SH_CP | 第11脚 | 数据输入时钟线 |
ST_CP | 第12脚 | 输出存储器锁存时钟线 |
/OE | 第13脚 | 输出有效(低电平有效) |
DS | 第14脚 | 串行数据输入 |
VCC | 第16脚 | 电源 |
二、运行结果
三、部分代码
#include "config.h"
static struct Food
{
unsigned char x; // 食物的横坐标
unsigned char y; // 食物的纵坐标
// unsigned char yes;
}food; // 食物结构体
struct Snake
{
char x[SNAKE_Max_Long];
char y[SNAKE_Max_Long];
unsigned char Long; // 蛇的长度
unsigned char Life; // 蛇的生命
// unsigned char Score; // 蛇的分数,本例中没使用
unsigned char Level; // 蛇的等级
unsigned char Dir; // 蛇移动方向
}snake; // 蛇结构体
void startSnake()
{
uchar i=0;
initSnake();
while(snake.Life)
{
changeDir(keyValue);
// 蛇运行的速度,由speedLevel决定
if(tCount >= speedLevel)
{
tCount=0;
runSnake();
}
// 限定蛇活动范围,超范围就dead
if((snake.x[0]>(WIDTH-1)) || (snake.x[0]<0) || (snake.y[0]>(LENGTH-1)) || (snake.y[0]<0))
{
snake.Life=0;
snake.Level=1;
speedLevel=25;
keyVal=right;
}
// 蛇自杀检测
for(i=4; i<=snake.Long; i++)
{
if(snake.x[i-1]==snake.x[0] && snake.y[i-1]==snake.y[0])
{
snake.Life=0;
snake.Level=1;
speedLevel=25;
keyVal=right;
}
}
// 等级越高速度越快
if(snake.Long >= SNAKE_Max_Long)
{
delayMs(500); // 延一下时
initSnake();
speedLevel-=5;
keyVal=right;
if(++snake.Level > 5)
{
snake.Level=1;
speedLevel=25;
}
tCount=0;
}
drawSnake();
}
}