类似C语言的语法,部分函数等内容可以封装到头文件里,需要的时候引入到source file 中,再在 include 中指明即可正常使用。
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名注册、网站空间、营销软件、网站建设、顺庆网站维护、网站推广。编写.h文件:如:
引入.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
绘制部分代码:
#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元起,快前往官网查看详情吧