利用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/
请大家多多点赞,你们的点赞对我很重要,是我创作的动力