内容介绍
内容介绍
(仅供学习使用,如有错误,欢迎指正)
如视频所示,雪花灯的内两圈实现了外圈与内圈的同时闪烁,外三圈实现了不同颜色的阶梯式闪烁(由内向外)。其实现思路大致为,将不同的闪烁方式进行函数的封装,然后通过另一个集成函数,在不设置冲突代码的情况下,对多个下级函数进行不相互冲突的组合和调用(比如:在子函数1中写了让第二圈闪烁的代码,则在子函数2的代码中中应该避免对第二圈进行赋值等操作),最后可以在主函数里通过调用这个集成函数来实现同时对多种复杂流水闪烁逻辑的直接调用。下表给出了每个函数的作用;通过在集成函数里调用其它函数组成不互相冲突的流水灯逻辑,可以大大加强主函数的可读性,简化代码的复杂度。
函数名 | 功能说明 |
WS2812_Close(void) | 对每个灯进行置零操作,使得灯全部熄灭,可能存在一定延时 |
WS2812_1_5Line(unsigned char *p,unsigned char line) | 让其整圈一起点亮,传递两个参数,第一个参数为显示颜色,第二个参数是让第几圈点亮,圈数1-5,指针参数是颜色的数组,line参数为第几圈(1-5) |
WS2812_LineIn_Single(unsigned char *p,unsigned char line) | 让对应圈的灯流水点亮,内圈不灭,传递两个参数;指针参数是颜色的数组,line参数为第几圈(2-5) |
Flash_xyf(unsigned char *p1,unsigned char *p2,unsigned char *p3,unsigned char *p4,unsigned char line) | 集成函数:有四个颜色变量,用于组合不同颜色的闪烁方式,line参数为圈数。 |
#include "STC15W.h"
#include "ws2812.h"
#include "delay.h"
#include "uart.h"
void WS2812_Close(void);
void WS2812_1_5Line(unsigned char *p,unsigned char line);
void WS2812_LineIn_Single(unsigned char *p,unsigned char line);
void Change_Color(unsigned char *p);
void sovle(unsigned char m);
unsigned char green[3]={50,0,0};
unsigned char red[3]={0,50,0};
unsigned char blue[3]={0,0,50};
unsigned char org[3]={5,80,0};
unsigned char close[3]={0,0,0};
void Flash_xyf(unsigned char *p1,unsigned char *p2,unsigned char *p3,unsigned char *p4,unsigned char line);
void main()
{
unsigned char count=0;
DelayMs(1000);
ResetDataFlow();
WS2812_Close();
DelayMs(1000);
while(1)
{
DelayMs(1000);
Flash_xyf(red,green,blue,org,2);
}
}
void Flash_xyf(unsigned char *p1,unsigned char *p2,unsigned char *p3,unsigned char *p4,unsigned char line)
{
WS2812_LineIn_Single(p1,line);
DelayMs(1000);
WS2812_1_5Line(p2,line+1);
DelayMs(1000);
WS2812_1_5Line(p3,line+2);
DelayMs(1000);
WS2812_1_5Line(p4,line+3);
}
void WS2812_LineIn_Single(unsigned char *p,unsigned char line)
{
unsigned char count;
unsigned char count_sum;
unsigned char m=1;
switch(line)
{
case 2:
for(count_sum=0;count_sum<37;count_sum++)
{
for(count=0;count<=count_sum;count++)
{
if(count%6==0)
{
SendOnePix(p);
}
else
SendOnePix(close);
}
DelayMs(20);
}
ResetDataFlow();
break;
case 3:
for(count_sum=0;count_sum<36;count_sum++)
{
for(count=0;count<=count_sum;count++)
{
if(count%6==1)
{
SendOnePix(p);
}
else if(count%6==0)
{
SendOnePix(p);
}
else
SendOnePix(close);
}
// ResetDataFlow();
DelayMs(20);
}
ResetDataFlow();
break;
case 4:
for(count_sum=0;count_sum<36;count_sum++)
{
for(count=0;count<=count_sum;count++)
{
if(count%6==2)
{
SendOnePix(p);
}
else if(count%6==1)
{
SendOnePix(p);
}
else if(count%6==0)
{
SendOnePix(p);
}
else
SendOnePix(close);
}
// ResetDataFlow();
DelayMs(20);
}
ResetDataFlow();
break;
case 5:
for(count_sum=0;count_sum<36;count_sum++)
{
for(count=0;count<=count_sum;count++)
{
if(count==3*m)
{
SendOnePix(p);
// m+=2;
}
else if(count==(3*m)+1)
{
SendOnePix(p);
}
else if(count==(3*m)+2)
{
SendOnePix(p);
m+=2;
}
else if(count%6==2)
{
SendOnePix(p);
}
else if(count%6==1)
{
SendOnePix(p);
}
else if(count%6==0)
{
SendOnePix(p);
}
else
SendOnePix(close);
}
DelayMs(70);
m=1;
}
ResetDataFlow();
break;
}
}
void WS2812_1_5Line(unsigned char *p,unsigned char line)
{
unsigned char count_sum;
unsigned char m=1;
switch(line)
{
case 1:
for(count_sum=0;count_sum<=36;count_sum++)
{
if(count_sum==36)
{
SendOnePix(p);
}
else
SendOnePix(close);
}
ResetDataFlow();
break;
case 2:
for(count_sum=0;count_sum<36;count_sum++)
{
if(count_sum%6==0)
{
SendOnePix(p);
}
else
SendOnePix(close);
}
ResetDataFlow();
break;
case 3:
for(count_sum=0;count_sum<36;count_sum++)
{
if(count_sum%6==1)
{
SendOnePix(p);
}
else
SendOnePix(close);
}
ResetDataFlow();
break;
case 4:
for(count_sum=0;count_sum<36;count_sum++)
{
if(count_sum%6==2)
{
SendOnePix(p);
}
else
SendOnePix(close);
}
ResetDataFlow();
break;
case 5:
for(count_sum=0;count_sum<36;count_sum++)
{
if(count_sum==3*m)
{
SendOnePix(p);
}
else if(count_sum==(3*m)+1)
{
SendOnePix(p);
}
else if(count_sum==(3*m)+2)
{
SendOnePix(p);
m+=2;
}
else
SendOnePix(close);
}
m=1;
ResetDataFlow();
break;
}
}
void WS2812_Close(void)
{
unsigned char count_sum;
for(count_sum=0;count_sum<37;count_sum++)
{
SendOnePix(close);
}
ResetDataFlow();
}
潜在的改进方案:
该参考代码将灯的颜色以指针的方式固定的传入集成函数中进行调用,可以将颜色的变化也封装成函数,做出呼吸灯或者渐变的效果,然后在调用,可以做出复杂度更高的流水灯效果。
团队介绍
团队成员
Yifeng. Xu 徐颐丰
Student EEE XJTLU
评论
0 / 100
查看更多
猜你喜欢
硬禾学堂雪花灯实验报告: 苏州圣诞来点雪~本报告为雪花灯实验报告,旨在学习嵌入式系统编程的基本开发流程,并且对于嵌入式系统模块和功能有进一步的认识[2]。今天正好是2020圣诞节,这个可爱的雪花灯实验报告,就圣诞礼物送给大家啦~
sgdteng
1944
以STC15W24驱动的Ws2812LED雪花灯板的创意设计基于STC15W24单片机作为控制器、Ws2812作为LED灯,做了个由37个LED形成的LED雪花灯板、通过c语言编程驱动实现了绚丽的闪灯组合、可用于节日装饰。
1234567888888
1815
FastBond2阶段2-基于模拟按键的控制LED闪烁方式装置Click板与十二指神探对应接口连接,使用Click板上的六个模拟按键来控制十二指神探上LED灯的闪烁方式。每个按键对应一种闪烁模式,按下相应的按键后,LED灯将根据所选模式进行闪烁。实现了三种不同的闪烁方式:快速闪烁、慢速闪烁和常亮。
hhhh
934