资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

51单片机学习笔记-创新互联

封装头文件;绘制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"
#includeu8 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;
	}
}

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

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

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


名称栏目:51单片机学习笔记-创新互联
当前链接:http://cdkjz.cn/article/csecph.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220