雪花灯颜色与闪烁方式设计
此项目提供了一种在雪花灯板上实现不同闪烁方向和自定义添加闪烁颜色的思路。并通过封装各个子函数,形成了更易于调用的集成函数;该思路易于管理复杂度较高的雪花灯设计,由于在电路层面,其它同学的文档已经说的很详细了,这里我主要对代码进行说明。
标签
嵌入式系统
Yifeng
更新2021-01-04
1031

(仅供学习使用,如有错误,欢迎指正)

如视频所示,雪花灯的内两圈实现了外圈与内圈的同时闪烁,外三圈实现了不同颜色的阶梯式闪烁(由内向外)。其实现思路大致为,将不同的闪烁方式进行函数的封装,然后通过另一个集成函数,在不设置冲突代码的情况下,对多个下级函数进行不相互冲突的组合和调用(比如:在子函数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
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号