STM32型号:STM32F103C8T6
实现效果:(由于是给别人做生日礼物,所以图案是个蛋糕)
参考网站:
WS2812灯珠的STM32驱动方式(一)——了解对手
WS2812灯珠的STM32驱动方式(二)——DMA+PWM
(有关WS2812的原理介绍可参考链接1,驱动方式和驱动原理可参考链接2)
我是在大佬原有的基础上进行修改
接下来是部分代码介绍:
首先是
WS2812B.c
uint16_t LED_BYTE_Buffer[6200];
根据RGB灯的数量,需要对LED_BYTE_Buffer数组的大小进行修改
void WS2812_one(uint8_t (*color)[3], uint16_t len)
该函数是一个显示函数,依次对需要显示的RGB灯进行显示,color是颜色数组,len是需要显示RGB灯的数量。
main.c
void hz_write(uint8_t (*date)[32],uint8_t (*color)[3]) //显示单个汉字
这个函数是写移位函数时的临时函数,可以不看,完整的移位函数如下:
void hz_left(uint8_t (*date)[32],uint8_t (*color)[3],uint8_t num) //汉字左移 date汉字取模数组,color颜色,num汉字数量,
{
uint8_t i,j,k,flag,dat,rgb_m = 0,rgb_n = 31; //i,j循环标志,flag汉字十六进制标志,dat移位临时数组,rgb_m灯定位,rgb_n灯定位
uint8_t rgb_hz[256][3],cache[2][32]; //rgb_hzRGB显示数组,cache[32]缓存数组
uint8_t len = 0; //len汉字长度
for(i=0;i<32;i++)
{
cache[0][i] = 0x00;
cache[1][i] = date[0][i];
}
while(num - len + 1)
{
for(k = 0;k < 17;k++) //单个汉字移位完成
{
for(i = 0;i < 32;i++) //显示单个汉字
{
if(i%2 == 0)
{
rgb_m = i/2;
rgb_n = 31-i/2;
}
dat = cache[0][i];
for(j = 0;j < 4;j++) //将十六进制转换,通过RGB显示出来
{
flag = dat&0x80;
if(flag == 0x80)
{
rgb_hz[rgb_m][0] = color[0][0];
rgb_hz[rgb_m][1] = color[0][1];
rgb_hz[rgb_m][2] = color[0][2];
}
else
{
rgb_hz[rgb_m][0] = 0;
rgb_hz[rgb_m][1] = 0;
rgb_hz[rgb_m][2] = 0;
}
rgb_m += 32;
dat <<= 1;
flag = dat&0x80;
if(flag == 0x80)
{
rgb_hz[rgb_n][0] = color[0][0];
rgb_hz[rgb_n][1] = color[0][1];
rgb_hz[rgb_n][2] = color[0][2];
}
else
{
rgb_hz[rgb_n][0] = 0;
rgb_hz[rgb_n][1] = 0;
rgb_hz[rgb_n][2] = 0;
}
rgb_n += 32;
dat <<= 1;
}
}
WS2812_one(&rgb_hz[0],256);
delay_ms(200);
for(i=0;i<16;i++) //移位
{
cache[0][2*i] = (cache[0][2*i] <<= 1) | ((cache[0][2*i+1]&0x80) >> 7) ;
cache[0][2*i+1] = (cache[0][2*i+1] <<= 1) | ((cache[1][2*i]&0x80) >> 7) ;
cache[1][2*i] = (cache[1][2*i] <<= 1) | ((cache[1][2*i+1]&0x80) >> 7) ;
cache[1][2*i+1] <<= 1 ;
}
}
len++;
if(num > 2 && len < num)
{
for(i=0;i<32;i++)
{
cache[1][i] = date[len][i];
}
}
}
}
该函数的功能是进行汉字左移,形参date为存放汉字取模的数据,color为颜色,num为汉字数量。
由于取模与16*16的RGB灯行内排序不同,所以需要注意数据存放的数组所在位置,通过这个位置对程序进行修改。
当然,这个代码还有许多值得优化的地方,比如,由于颜色只取单色,可以将color形参设置为一个一维数组等。
汉字取模的格式为
最后,程序文件如下: