利用51单片机+hc595芯片配合在led点阵上玩贪吃蛇 第一篇“显示贪吃蛇”

利用51单片机+hc595芯片配合在led点阵上玩贪吃蛇 第一篇“显示贪吃蛇”

硬件电路分析:

  • 1.采用51单片机和hc595芯片
  • 2.采用led点阵8*8
  • 3.hc595芯片的SER,SRCLK,RCLK分别接入单片机P34,P36,P3^5
  • 4.hc595芯片的Q0~Q7接入led点阵8*8的阳极段
  • led点阵8*8的阴极端接入单片机P0口(切记一定要分清哪边引脚是要输入高电平的,哪边引脚是要输入低电平)

在这里插入图片描述

如果按照示例中的接线方式,我们不难发现,P0是控制led点阵的列,当其中一个io口(例P0^0)输出低电平,

此时Q0~Q7都输出高电平,那么led点阵8*8第一列将全部点亮。如果只有其中一个io口(例Q0)输出高电平,

那么就是第一列第一行的led点亮,可以理解为坐标(1,1)

也就是说hc595的并行输出口Q0~Q7是控制led点阵的行的

函数结构分析

在这里插入图片描述

hc595相关操作函数

既然用到hc595,那么当然是对其三个与单片机相连的io口进行操作,从而使Q0~Q7可以输出高低电平

通过真值表可以知道具体操作:在这里插入图片描述

封装hc595传输数据函数

sbit SER= P3^4;
sbit SRCLK=P3^6;
sbit RCLK=P3^5;

void HC_595(unsigned char date) { unsigned char i; SRCLK = 0; RCLK = 0; for(i=0;i<8;i++) { SER = date>>7; date<<=1; SRCLK = 1; _nop_(); _nop_(); SRCLK = 0; } RCLK = 1; _nop_(); _nop_(); RCLK = 0; }

(包含intrin.h函数库)

显示贪吃蛇

贪吃蛇的显示是这个程序的核心,虽然将led点亮很简单,一边输出一个低电平另一边输出一个高电平即可,但当考虑到后面的操作,简单的对其io口进行高低电平的输入输出显然会令后面程序的蛇会更加复杂。

我们可以将8*8led点阵看做是一个坐标系或者是一个表格,每一盏led灯都有其对应的位置,封装一个显示函数,向其传入需要点亮的led灯的x,y坐标,会更加简单,在后续的操作中,例如改变方向,只要改变led灯x,y坐标即可改变其方向。

unsigned char code X_[8]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE};
unsigned char code Y_[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};

unsigned char x[32]={0},y[32]={0};

**其中的x,y代表led的x,y坐标,X_[8]对应着x,Y_[8]对应着y,例如假设点亮(5,1)这个led灯,则X_[5-1],code Y_[1-1],这两个值组合,即可点亮第五列第1盏灯

在这里插入图片描述

封装显示函数

unsigned char length=3; length的数值取决于你开始点亮多上led灯,点亮3盏就填3。

开始点亮led灯直接往数组填入数值即可:

​ x[0] = 2;
​ y[0] = 3;
​ x[1] = 3;
​ y[1] = 3;
​ x[2] = 4;
​ y[2] = 3;

void appear(void){
unsigned char i;
P0=0xFF;
HC_595(0x00);
for(i=0;i<length;i++)
{
if((x[i]!=0)&&(y[i]!=0))
{
HC_595(Y_[y[i]-1]);
P0=X_[x[i]-1];
delay(5);
}
}
}

(delay函数为短暂延时,没有特别要求,示例是选择了我以前的程序中的ms延时)

显示浆果的函数

显示浆果的函数,比起显示贪吃蛇简单的多,我们只要满足一个条件即可,随机生成显示出来的浆果的berry_x,berry_y坐标不与贪吃蛇的x,y坐标重合即可

即:在生成随机数后判断一下是否与已经存在的x,y值相等,相等,则再次生成。

unsigned char berry_x;
unsigned char berry_y;

void random_berry(void)
{
unsigned char i,random_x,random_y;
do{
flag_repaeat=0;
random_x=(rand()%8)+1;
random_y=(rand()%8)+1;
for(i=0;i<length;i++)
{
if((random_xx[i])&&(random_yy[i]))
flag_repaeat = 1;
}
}while(flag_repaeat);
berry_x=random_x;
berry_y=random_y;
}

(用random_x和random_y存储rand()函数生成的随机数,再进行判断,满足条件则给赋给berry_x和berry_y)

显示浆果的函数

显示浆果我选用了利用定时器进行显示,定时器每1ms进入中断一次,例如类似于显示贪吃蛇的方式显示出浆果,由于刷新速度很快,所以肉眼是看不出浆果led的闪烁的

void Timer0Init()
{
TMOD|=0X01;
TH0=(65536-1000)/256;
TL0=(65536-1000)/256;
ET0=1;
EA=1;
TR0=1;
}

void Timer0(void) interrupt 1
{
P0 = X_[berry_x-1];
HC_595(Y_[berry_y-1]);
}
欢迎大家来我的空间踩踩,大家交流一下嘻嘻~
https://linxinloningg.space/
请大家多多点赞,你们的点赞对我很重要,是我创作的动力

猜你喜欢

转载自blog.csdn.net/linxinloningg/article/details/107237768