51单片机学习笔记_7 绘制LED动画:Merry Christmas 滚动字幕

文章介绍了如何在C语言中将常用函数封装到头文件中,以供其他源文件调用,特别是针对LED动画的绘制函数。通过正确设置头文件的包含路径,避免重复定义,并使用#ifndef...#endif防止头文件重复包含。文中还展示了如何编写延迟函数和矩阵LED的动画函数,并给出了一个具体的矩阵LED动画实现例子,该动画基于预先定义的字模序列进行逐行绘制。

封装头文件;绘制LED动画

类似C语言的语法,部分函数等内容可以封装到头文件里,需要的时候引入到source file 中,再在 include 中指明即可正常使用。

编写.h文件:如:

image-20230103162731330

引入.h文件:右键左侧的.c文件→options for file→C51→include path→找到.h文件所在的文件夹并选中,注意一定不能有中文路径。然后就可以使用.h文件中定义的变量和函数了,注意不能重复定义
h文件最好在开头加上#ifndef,在结尾加上#endif,这是防止重复因用头文件时出错的。
使用头文件的时候还注意到了一件事,在以前学习c语言时没有注意到。尽量在h文件中声明函数名。 因为后来写一个多文件项目时,里面包含了好几个c文件、对应的h文件和main.c文件。结果那几个c文件中定义函数会出错,原因是必须要在h文件中先声明。

接下来就自己试着先把delay函数和矩阵LED绘制函数写入头文件,然后制作矩阵动画,这样动起来也会更方便一些。

//h file
#ifndef
#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;

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


void hc_write_data(unsigned char c)
{
	// 要传入8个输入,需要循环
	int i = 0;
	for (i; i < 8; i++)
	{
		// 注意 芯片传数据先传高位 再传低位,所以要反着写
		// 通过移位获取
		SER = c >> 7;
		// 想获取下一位寄存器,需要移位寄存器移位。需要创造上升沿
		SRCLK = 0;
		// 芯片一般给定一个延时时间,经过这个时间之后才能处理完毕
		delay(1);
		SRCLK = 1;
		delay(1);
		// 让传入数据的次高位变为下次循环的高位
		c <<= 1;
	}
	// 最后通过存储寄存器的上升沿,传输全部数据
	rCLK = 0;
	delay(1);
	rCLK = 1;
}

void matrix_led_animation(u8 hc_led_arr[])
{
	unsigned char col[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
	int i=0;
	P0=0x00;
	
	for(i;i<8;i++){
		P0=col[i];
		hc_write_data(hc_led_arr[i]);
        //不知道为什么,下面两部分不写图形会偏移。不知道会不会有大佬解答一下
		delay(1);
		hc_write_data(0x00);
	}
	
}
#endif

然后就是利用取模软件得到要绘制的图案的字模。这里我选定的图案是之前圣诞节临摹过的像素画中”Merry Christmas“的字体。参照来源:圣诞节 像素画 圣诞树🎄_哔哩哔哩_bilibili

image-20230104123321341

绘制部分代码:

#include "reg52.h"
#include <MyHFile.H>
u8 anime_row[]={
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C,
 0x40, 0x7C, 0x40, 0x7C, 0x00, 0x1C, 0x14, 0x18,
 0x00, 0x1C, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x1D,
 0x05, 0x1F, 0x00, 0x7C, 0x44, 0x44, 0x44, 0x00,
 0x7C, 0x10, 0x1C, 0x00, 0x1C, 0x10, 0x00, 0x5C,
 0x00, 0x04, 0x1C, 0x10, 0x00, 0x7C, 0x14, 0x00,
 0x1C, 0x10, 0x1C, 0x10, 0x1C, 0x00, 0x0C, 0x14,
 0x1C, 0x00, 0x04, 0x1C, 0x10, 0x00, 0x00, 0x00,
 0x00, 0x00, 0x00, 0x00, 0x00
 };
void main()
{
	int cnt = 0;
	while (1)
	{
	for(cnt;cnt<62;cnt++){
		u8 row[8]={0,0,0,0,0,0,0,0};
		row[0]=anime_row[cnt];
		row[1]=anime_row[cnt+1];
		row[2]=anime_row[cnt+2];
		row[3]=anime_row[cnt+3];
		row[4]=anime_row[cnt+4];
		row[5]=anime_row[cnt+5];
		row[6]=anime_row[cnt+6];
		row[7]=anime_row[cnt+7];
		matrix_led_animation(row);
		delay(5000);
	}
	cnt=0;
	}
}

虽然因为每次绘制完成必须擦除再重新绘制,导致看起来一闪一闪的。

不过最终的动画效果还是不错的~
最终的动画效果演示可以见动态

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灰海宽松

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值