uint32_t *RGB;//颜色列表数组
void LED_Init(void);
void PWM_Init(void);
uint32_t set_Color_Loop(uint8_t color_length);
void out_RGB(uint16_t data_Max_Length,uint16_t colorwidth);
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200);
delay_init();
LED_Init();
WS2812B_TIM_init();
uint32_t len = set_Color_Loop(32);//每两种颜色之间的位数
while(1)
{
out_RGB(len,8);//8个灯,每次输出8个数据
delay_ms(80);
}
}
/**
* colorwidth 每次获取多少位
*/
void out_RGB(uint16_t data_Max_Length,uint16_t colorwidth)
{
static uint32_t rgb_position = 0;
for(uint32_t i = 0;i < colorwidth; i++){
uint16_t c = (rgb_position + i) % data_Max_Length;//末尾颜色数据结束时将首位的收据填充到数组
send_Data(RGB[c]);
}
rgb_position ++;
rgb_position %= data_Max_Length;
}
/**
* color_length 每种颜色渐变最大长度,总颜色长度:color_length * 3
* return 颜色数据总长度
*/
uint32_t set_Color_Loop(uint8_t color_length)
{
RGB = (uint32_t*)malloc(color_length*3*sizeof(uint32_t));//分配数组大小,(所有渐变色颜色长度)
color_length -= 1;
for(uint8_t i=0;i<=color_length;i++)
{
RGB[i] = (((0xff/color_length)*i)<<8)|((0xff/color_length)*(color_length-i)); //蓝到绿
RGB[color_length + 1 +i] = (((0xff/color_length)*i)<<16)|((0xff/color_length)*(color_length-i))<<8; //绿到红
RGB[((color_length+1)*2) +i] = ((0xff/color_length)*i)|((0xff/color_length)*(color_length-i))<<16; //红到蓝
}
return color_length*3;
}
|