c51单片机贪吃蛇8x8点阵
时间: 2023-11-29 12:06:12 浏览: 91
基于51单片机和点阵屏实现的贪吃蛇小程序。
5星 · 资源好评率100%
c51单片机贪吃蛇8x8点阵的实现需要以下几个步骤:
1.初始化:设置行线和列线的IO口方向,初始化蛇的位置和方向,初始化食物的位置。
2.扫描按键:通过扫描按键来改变蛇的方向。
3.移动蛇:根据蛇的方向移动蛇的位置,同时判断是否吃到了食物,如果吃到了,则增加蛇的长度。
4.更新显示:根据蛇的位置和长度以及食物的位置来更新点阵的显示。
下面是一个简单的c51单片机贪吃蛇8x8点阵的代码示例:
```c
#include <reg52.h>
#define u8 unsigned char
#define u16 unsigned int
sbit SRCLK = P3^6;
sbit RCLKS = P3^5;
sbit SER = P3^4;
u8 Rows[8] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F}; //行线值
u8 Cols[8] = {0x7F, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD, 0xFE}; //列线值
u8 Snake[50][2]; //蛇的位置
u8 Food[2]; //食物的位置
u8 SnakeLen = 3; //蛇的长度
u8 SnakeDir = 1; //蛇的方向
void Delay(u16 i)
{
while(i--);
}
void Led(u8 dat,8 dat2) //dat为行线值,dat2为列线值
{
u16 i;
RCLKS = 1;
SRCLK = 1;
for(i=0;i<8;i++)
{
SER = dat & 0x80;
dat = dat << 1; SRCLK = 0;
SRCLK = 1;
}
for(i=0;i<8;i++)
{
SER = dat2 & 0x80;
dat2 = dat2 << 1;
SRCLK = 0;
SRCLK = 1;
}
RCLKS = 0;
RCLKS = 1;
}
void Init()
{
u8 i;
P0 = 0xFF;
P1 = 0xFF;
P2 = 0xFF;
P3 = 0xFF;
for(i=0;i<SnakeLen;i++)
{
Snake[i][0] = 3 + i;
Snake[i][1] = 4;
}
Food[0] = 5;
Food[1] = 2;
}
void ScanKey()
{
if(P1 == 0xFE) //向上
{
SnakeDir = 0;
}
else if(P1 == 0xFD) //向下
{
SnakeDir = 1;
}
else if(P1 == 0xFB) //向左
{
SnakeDir = 2;
}
else if(P1 == 0xF7) //向右
{
SnakeDir = 3;
}
}
void MoveSnake()
{
u8 i;
for(i=SnakeLen-1;i>0;i--)
{
Snake[i][0] = Snake[i-1][0];
Snake[i][1] = Snake[i-1][1];
}
switch(SnakeDir)
{
case 0: //向上
Snake[0][0]--;
break;
case 1: //向下
Snake[0][0]++;
break;
case 2: //向左
Snake[0][1]--;
break;
case 3: //向右
Snake[0][1]++;
break;
}
if(Snake[0][0] == Food[0] && Snake[0][1] == Food[1]) //吃到食物
{
SnakeLen++;
Food[0] = rand() % 8;
Food[1] = rand() % 8;
}
}
void UpdateDisplay()
{
u8 i, j;
u8 LedData[8] = {0};
for(i=0;i<SnakeLen;i++)
{
LedData[Snake[i][0]] |= (1 << Snake[i][1]);
}
LedData[Food[0]] |= (1 << Food[1]);
for(i=0;i<8;i++)
{
Led(Rows[i], Cols[LedData[i]]);
}
}
void main()
{
Init();
while(1)
{
ScanKey();
MoveSnake();
UpdateDisplay();
Delay(50000);
}
}
```
阅读全文