【單片機筆記】關於RGB彩燈WS2812B的驅動

前段時間做了個88顆燈珠的原形燈板,分別用stm8s003和n76e003寫了底層驅動,

根據手冊要求代碼如下:

STM8S003

#include "fy_ws2812b.h"

/*

此代碼針對stm8s003平臺 @16M


燈的性質決定,需要一次性刷新,比如16個燈就必須一次性刷新16個,
而不能一個一箇中間有間隔的刷新,這樣就只有一地個燈亮,
如果需要花樣把不需要亮的燈設置爲不亮0x000000即可

*/

/*以下定義如果沒有需要自行定義*/
//#define BYTE_0(n)                 ((u8)((n) & (u8)0xFF))        /*!< Returns the low color of the 32-bit value */
//#define BYTE_1(n)                 ((u8)(BYTE_0((n) >> (u8)8)))  /*!< Returns the second color of the 32-bit value */
//#define BYTE_2(n)                 ((u8)(BYTE_0((n) >> (u8)16))) /*!< Returns the third color of the 32-bit value */
//#define BYTE_3(n)                 ((u8)(BYTE_0((n) >> (u8)24)))
//#define enableInterrupts()	EA=1
//#define disableInterrupts()	EA=0

//根據平臺定義
#define _nop_() asm("nop")

#define delay1NOP()	_nop_();
#define delay2NOP()	delay1NOP();_nop_();
#define delay3NOP()	delay2NOP();_nop_();
#define	delay4NOP()	delay3NOP();_nop_();
#define	delay5NOP()	delay4NOP();_nop_();
#define	delay6NOP()	delay5NOP();_nop_();
#define	delay7NOP()	delay6NOP();_nop_();
#define	delay8NOP()	delay7NOP();_nop_();
#define	delay9NOP()	delay8NOP();_nop_();
#define	delay10NOP()	delay9NOP();_nop_();
#define	delay11NOP()	delay10NOP();_nop_();
#define	delay12NOP()	delay11NOP();_nop_();
#define	delay13NOP()	delay12NOP();_nop_();
#define	delay14NOP()	delay13NOP();_nop_();
#define	delay15NOP()	delay14NOP();_nop_();

//引腳
#define RGB_PIN_H() GPIOD->ODR |= (uint8_t)GPIO_PIN_5;
#define RGB_PIN_L() GPIOD->ODR &= (uint8_t)(~GPIO_PIN_5)

void Ws2812b_Configuration(void)
{
    GPIO_Init(GPIOD, (GPIO_Pin_TypeDef)GPIO_PIN_5, GPIO_MODE_OUT_PP_HIGH_FAST);
    RGB_PIN_L();
}
#if 0
static void Ws2812b_Write0(void)
{
    RGB_PIN_H();
    delay6NOP();
    RGB_PIN_L();
}

static void Ws2812b_Write1(void)
{
    RGB_PIN_H();
    delay12NOP();
    
    RGB_PIN_L();
}

static void Ws2812b_WriteByte(u8 color)
{
	if(color & 0x80)
		Ws2812b_Write1();
	else
		Ws2812b_Write0();
	if(color & 0x40) 
		Ws2812b_Write1();
	else
		Ws2812b_Write0();
	if(color & 0x20)
		Ws2812b_Write1();
	else
		Ws2812b_Write0();
	if(color & 0x10)
		Ws2812b_Write1();
	else
		Ws2812b_Write0();
	if(color & 0x8)
		Ws2812b_Write1();
	else
		Ws2812b_Write0();
	if(color & 0x4)         
		Ws2812b_Write1();
	else
		Ws2812b_Write0();
	if(color & 0x2)         
		Ws2812b_Write1();
	else
		Ws2812b_Write0();
	if(color & 0x1)         
		Ws2812b_Write1();
	else
		Ws2812b_Write0();
}
#else
/*程序進出都需要耗時的,用下面的方法替代上面更佳*/
static void Ws2812b_WriteByte(u8 color)
{
	if(color & 0x80){
        RGB_PIN_H();
        delay12NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay6NOP();
        RGB_PIN_L();
        delay7NOP();
    }	
    if(color & 0x40){
        RGB_PIN_H();
        delay12NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay6NOP();
        RGB_PIN_L();
        delay7NOP();
    }	
	if(color & 0x20){
        RGB_PIN_H();
        delay12NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay6NOP();
        RGB_PIN_L();
        delay7NOP();
    }	
	if(color & 0x10){
        RGB_PIN_H();
        delay12NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay6NOP();
        RGB_PIN_L();
        delay7NOP();
    }	
	if(color & 0x8) {
        RGB_PIN_H();
        delay12NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay6NOP();
        RGB_PIN_L();
        delay7NOP();
    }	
	if(color & 0x4) {
        RGB_PIN_H();
        delay12NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay6NOP();
        RGB_PIN_L();
        delay7NOP();
    }	
	if(color & 0x2) {
        RGB_PIN_H();
        delay12NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay6NOP();
        RGB_PIN_L();
        delay7NOP();
    }	
	if(color & 0x1) {
        RGB_PIN_H();
        delay12NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay6NOP();
        RGB_PIN_L();
        delay7NOP();
    }	
}

#endif
void Ws2812b_Write(u32 color)
{
#if 0
    Ws2812b_WriteByte(BYTE_1(color));//green
    Ws2812b_WriteByte(BYTE_2(color));//red
    Ws2812b_WriteByte(BYTE_0(color));//blue
#else
/*同理*/    
    //green
	if(color & 0x8000){
        RGB_PIN_H();
        delay12NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay6NOP();
        RGB_PIN_L();
        delay7NOP();
    }	
    if(color & 0x4000){
        RGB_PIN_H();
        delay12NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay6NOP();
        RGB_PIN_L();
        delay7NOP();
    }	
	if(color & 0x2000){
        RGB_PIN_H();
        delay12NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay6NOP();
        RGB_PIN_L();
        delay7NOP();
    }	
	if(color & 0x1000){
        RGB_PIN_H();
        delay12NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay6NOP();
        RGB_PIN_L();
        delay7NOP();
    }	
	if(color & 0x800) {
        RGB_PIN_H();
        delay12NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay6NOP();
        RGB_PIN_L();
        delay7NOP();
    }	
	if(color & 0x400) {
        RGB_PIN_H();
        delay12NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay6NOP();
        RGB_PIN_L();
        delay7NOP();
    }	
	if(color & 0x200) {
        RGB_PIN_H();
        delay12NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay6NOP();
        RGB_PIN_L();
        delay7NOP();
    }	
	if(color & 0x100) {
        RGB_PIN_H();
        delay12NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay6NOP();
        RGB_PIN_L();
        delay7NOP();
    }
    //red
	if(color & 0x800000){
        RGB_PIN_H();
        delay12NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay6NOP();
        RGB_PIN_L();
        delay7NOP();
    }	
    if(color & 0x400000){
        RGB_PIN_H();
        delay12NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay6NOP();
        RGB_PIN_L();
        delay7NOP();
    }	
	if(color & 0x200000){
        RGB_PIN_H();
        delay12NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay6NOP();
        RGB_PIN_L();
        delay7NOP();
    }	
	if(color & 0x100000){
        RGB_PIN_H();
        delay12NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay6NOP();
        RGB_PIN_L();
        delay7NOP();
    }	
	if(color & 0x80000) {
        RGB_PIN_H();
        delay12NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay6NOP();
        RGB_PIN_L();
        delay7NOP();
    }	
	if(color & 0x40000) {
        RGB_PIN_H();
        delay12NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay6NOP();
        RGB_PIN_L();
        delay7NOP();
    }	
	if(color & 0x20000) {
        RGB_PIN_H();
        delay12NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay6NOP();
        RGB_PIN_L();
        delay7NOP();
    }	
	if(color & 0x10000) {
        RGB_PIN_H();
        delay12NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay6NOP();
        RGB_PIN_L();
        delay7NOP();
    }
    //blue
	if(color & 0x80){
        RGB_PIN_H();
        delay12NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay6NOP();
        RGB_PIN_L();
        delay7NOP();
    }	
    if(color & 0x40){
        RGB_PIN_H();
        delay12NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay6NOP();
        RGB_PIN_L();
        delay7NOP();
    }	
	if(color & 0x20){
        RGB_PIN_H();
        delay12NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay6NOP();
        RGB_PIN_L();
        delay7NOP();
    }	
	if(color & 0x10){
        RGB_PIN_H();
        delay12NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay6NOP();
        RGB_PIN_L();
        delay7NOP();
    }	
	if(color & 0x8) {
        RGB_PIN_H();
        delay12NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay6NOP();
        RGB_PIN_L();
        delay7NOP();
    }	
	if(color & 0x4) {
        RGB_PIN_H();
        delay12NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay6NOP();
        RGB_PIN_L();
        delay7NOP();
    }	
	if(color & 0x2) {
        RGB_PIN_H();
        delay12NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay6NOP();
        RGB_PIN_L();
        delay7NOP();
    }	
	if(color & 0x1) {
        RGB_PIN_H();
        delay12NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay6NOP();
        RGB_PIN_L();
        delay2NOP();
        /*程序進出會有延時*/
        //delay7NOP();
    }    
#endif
}

/*********************************************以上爲底層***********************************************/

//設置燈的顏色
//color:顏色(包含亮度)
//num  :總共的led數量
void RGB_Refresh(u32 color,u8 num){
	disableInterrupts();//關閉所有中斷避免打擾
	while(num--){
		Ws2812b_Write(color);
	}
	enableInterrupts();
}

//顏色流水燈
//color:顏色(包含亮度)
//num  :總共的led數量
//speed:延時(單位ms)
void RGB_Cycle(u32 color,u8 num,u16 speed)
{
	u8 i;
	for(i=1;i<=num;i++){		//設置顏色		
		RGB_Refresh(color,i);
		Delay_ms(speed);
	}
	for(i=1;i<=num;i++){		//滅
		RGB_Refresh(0,i);
		Delay_ms(speed);
	}
}

//顏色呼吸燈
//color:顏色(包含亮度)
//num  :總共的led數量
//speed:延時(單位ms)
void RGB_Wave(u32 color,u8 num,u16 speed)
{
	u32 color_step=0;
	u32 color_temp = color;
	color_step |= (BYTE_2(color)?0x010000:0x000000);
	color_step |= (BYTE_1(color)?0x000100:0x000000);
	color_step |= (BYTE_0(color)?0x000001:0x000000);
    
	while(//先把顏色的亮度見到最小
          BYTE_2(color_temp)>=BYTE_2(color_step) &&
              BYTE_1(color_temp)>=BYTE_1(color_step) &&
                  BYTE_0(color_temp)>=BYTE_0(color_step)
                      ){
                          color_temp-=color_step;
                      }
	
	while(		//緩慢變亮	
          BYTE_2(color_temp)<0xff &&
              BYTE_1(color_temp)<0xff &&
                  BYTE_0(color_temp)<0xff
                      )	{
                          color_temp+=color_step;
                          RGB_Refresh(color_temp,num);
                          Delay_ms(speed);
                      }	
	while(//緩慢變暗
          BYTE_2(color_temp)>=BYTE_2(color_step) &&
              BYTE_1(color_temp)>=BYTE_1(color_step) &&
                  BYTE_0(color_temp)>=BYTE_0(color_step)
                      ){
                          color_temp-=color_step;
                          RGB_Refresh(color_temp,num);
                          Delay_ms(speed);
                      }
	RGB_Refresh(0,num);
}
//顏色流水燈
//color:顏色(包含亮度)
//num  :總共的led數量
//speed:延時(單位ms)
//cnt  :閃爍次數
void RGB_Flash(u32 color,u8 num,u16 speed,u8 cnt)
{
	while(cnt--){
		RGB_Refresh(color,num);
		Delay_ms(speed);
		RGB_Refresh(0,num);
		Delay_ms(speed);
	}
}

/*********************************************END OF FILE**********************************************/

N76E003:

#include "fy_ws2812b.h"

/*

此代碼針對n76e003平臺 @16M

1個nop 		佔用87ns

while(1)	佔用194ns

函數調用		佔用570ns

燈的性質決定,需要一次性刷新,比如16個燈就必須一次性刷新16個,
而不能一個一箇中間有間隔的刷新,這樣就只有一地個燈亮

*/

/*以下定義如果沒有需要自行定義*/
//#define BYTE_0(n)                 ((u8)((n) & (u8)0xFF))        /*!< Returns the low byte of the 32-bit value */
//#define BYTE_1(n)                 ((u8)(BYTE_0((n) >> (u8)8)))  /*!< Returns the second byte of the 32-bit value */
//#define BYTE_2(n)                 ((u8)(BYTE_0((n) >> (u8)16))) /*!< Returns the third byte of the 32-bit value */
//#define BYTE_3(n)                 ((u8)(BYTE_0((n) >> (u8)24)))
//#define enableInterrupts()	EA=1
//#define disableInterrupts()	EA=0


#define delay1NOP()	_nop_();
#define delay2NOP()	delay1NOP();_nop_();
#define delay3NOP()	delay2NOP();_nop_();
#define delay4NOP()	delay3NOP();_nop_();
#define delay5NOP()	delay4NOP();_nop_();
#define delay6NOP()	delay5NOP();_nop_();
#define delay7NOP()	delay6NOP();_nop_();
#define delay8NOP()	delay7NOP();_nop_();
#define delay9NOP()	delay8NOP();_nop_();
#define delay10NOP()	delay9NOP();_nop_();
#define delay11NOP()	delay10NOP();_nop_();
#define delay12NOP()	delay11NOP();_nop_();
#define delay13NOP()	delay12NOP();_nop_();
#define delay14NOP()	delay13NOP();_nop_();
#define delay15NOP()	delay14NOP();_nop_();



#define RGB_PIN_H() P06 = 1
#define RGB_PIN_L() P06 = 0

void Ws2812b_Configuration(void)
{
    P0M1 &= ~(1<<6);
    P0M2 |= (1<<6);
    RGB_PIN_L();
}

#if 0
static void Ws2812b_Write0(void)
{
    RGB_PIN_H();
    delay6NOP();
    RGB_PIN_L();
    
}

static void Ws2812b_Write1(void)
{
    RGB_PIN_H();
    delay12NOP();
    
    RGB_PIN_L();
}

static void Ws2812b_WriteByte(u8 byte)
{
	if(byte & 0x80)
		Ws2812b_Write1();
	else
		Ws2812b_Write0();
	if(byte & 0x40) 
		Ws2812b_Write1();
	else
		Ws2812b_Write0();
	if(byte & 0x20)
		Ws2812b_Write1();
	else
		Ws2812b_Write0();
	if(byte & 0x10)
		Ws2812b_Write1();
	else
		Ws2812b_Write0();
	if(byte & 0x8)
		Ws2812b_Write1();
	else
		Ws2812b_Write0();
	if(byte & 0x4)         
		Ws2812b_Write1();
	else
		Ws2812b_Write0();
	if(byte & 0x2)         
		Ws2812b_Write1();
	else
		Ws2812b_Write0();
	if(byte & 0x1)         
		Ws2812b_Write1();
	else
		Ws2812b_Write0();
}
#else
static void Ws2812b_WriteByte(u8 byte)
{
	if(byte & 0x80){
        RGB_PIN_H();
        delay10NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay4NOP();
        RGB_PIN_L();
        delay4NOP();
    }	
    if(byte & 0x40){
        RGB_PIN_H();
        delay10NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay4NOP();
        RGB_PIN_L();
        delay4NOP();
    }	
	if(byte & 0x20){
        RGB_PIN_H();
        delay10NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay4NOP();
        RGB_PIN_L();
        delay4NOP();
    }	
	if(byte & 0x10){
        RGB_PIN_H();
        delay10NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay4NOP();
        RGB_PIN_L();
        delay4NOP();
    }	
	if(byte & 0x8) {
        RGB_PIN_H();
        delay10NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay4NOP();
        RGB_PIN_L();
        delay4NOP();
    }	
	if(byte & 0x4) {
        RGB_PIN_H();
        delay10NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay4NOP();
        RGB_PIN_L();
        delay4NOP();
    }	
	if(byte & 0x2) {
        RGB_PIN_H();
        delay10NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay4NOP();
        RGB_PIN_L();
        delay4NOP();
    }	
	if(byte & 0x1) {
        RGB_PIN_H();
        delay10NOP();
        RGB_PIN_L();
    }
	else{      
        RGB_PIN_H();
        delay4NOP();
        RGB_PIN_L();
        delay4NOP();
    }	
}

#endif

void Ws2812b_Write(u32 color)
{
    Ws2812b_WriteByte(BYTE_1(color));//green
    Ws2812b_WriteByte(BYTE_2(color));//red
    Ws2812b_WriteByte(BYTE_0(color));//blue
}

/*********************************************以上爲底層***********************************************/

//設置燈的顏色
//color:顏色(包含亮度)
//num  :總共的led數量
void RGB_Refresh(u32 color,u8 num){
	disableInterrupts();
	while(num--){
		Ws2812b_Write(color);
	}
	enableInterrupts();
}

//顏色流水燈
//color:顏色(包含亮度)
//num  :總共的led數量
//speed:延時(單位ms)
void RGB_Cycle(u32 color,u8 num,u16 speed)
{
	u8 i;
	for(i=1;i<=num;i++){		//設置顏色		
		RGB_Refresh(color,i);
		Delay_ms(speed);
	}
	for(i=1;i<=num;i++){		//滅
		RGB_Refresh(0,i);
		Delay_ms(speed);
	}
}

//顏色呼吸燈
//color:顏色(包含亮度)
//num  :總共的led數量
//speed:延時(單位ms)
void RGB_Wave(u32 color,u8 num,u16 speed)
{
	u32 color_step=0;
	u32 color_temp = color;
	color_step |= (BYTE_2(color)?0x010000:0x000000);
	color_step |= (BYTE_1(color)?0x000100:0x000000);
	color_step |= (BYTE_0(color)?0x000001:0x000000);

	while(//先把顏色的亮度見到最小
			BYTE_2(color_temp)>=BYTE_2(color_step) &&
			BYTE_1(color_temp)>=BYTE_1(color_step) &&
			BYTE_0(color_temp)>=BYTE_0(color_step)
		){
		color_temp-=color_step;
	}
	
	while(		//緩慢變亮	
			BYTE_2(color_temp)<0xff &&
			BYTE_1(color_temp)<0xff &&
			BYTE_0(color_temp)<0xff
		 )	{
		color_temp+=color_step;
		RGB_Refresh(color_temp,num);
		Delay_ms(speed);
	}	
	while(//緩慢變暗
			BYTE_2(color_temp)>=BYTE_2(color_step) &&
			BYTE_1(color_temp)>=BYTE_1(color_step) &&
			BYTE_0(color_temp)>=BYTE_0(color_step)
		){
		color_temp-=color_step;
		RGB_Refresh(color_temp,num);
		Delay_ms(speed);
	}
	RGB_Refresh(0,num);
}
//顏色流水燈
//color:顏色(包含亮度)
//num  :總共的led數量
//speed:延時(單位ms)
//cnt  :閃爍次數
void RGB_Flash(u32 color,u8 num,u16 speed,u8 cnt)
{
	while(cnt--){
		RGB_Refresh(color,num);
		Delay_ms(speed);
		RGB_Refresh(0,num);
		Delay_ms(speed);
	}
}

/*********************************************END OF FILE**********************************************/

 

頭文件:

#ifndef __FY_WS2812B_H
#define __FY_WS2812B_H

#include "fy_includes.h"


/*顏色宏定義*/								/*R G B*/
#define	COLOR_LIGHTPINK						0xFFB6C1	//	淺粉紅
#define	COLOR_PINK							0xFFC0CB	//	粉紅
#define	COLOR_CRIMSON						0xDC143C	//	猩紅
#define	COLOR_LAVENDERBLUSH					0xFFF0F5	//	臉紅的淡紫色
#define	COLOR_PALEVIOLETRED					0xDB7093	//	蒼白的紫羅蘭紅色
#define	COLOR_HOTPINK						0xFF69B4	//	熱情的粉紅
#define	COLOR_DEEPPINK						0xFF1493	//	深粉色
#define	COLOR_MEDIUMVIOLETRED				0xC71585	//	適中的紫羅蘭紅色
#define	COLOR_ORCHID						0xDA70D6	//	蘭花的紫色
#define	COLOR_THISTLE						0xD8BFD8	//	薊
#define	COLOR_PLUM							0xDDA0DD	//	李子
#define	COLOR_VIOLET						0xEE82EE	//	紫羅蘭
#define	COLOR_MAGENTA						0xFF00FF	//	洋紅
#define	COLOR_FUCHSIA						0xFF00FF	//	燈籠海棠(紫紅色)
#define	COLOR_DARKMAGENTA					0x8B008B	//	深洋紅色
#define	COLOR_PURPLE						0x800080	//	紫色
#define	COLOR_MEDIUMORCHID					0xBA55D3	//	適中的蘭花紫
#define	COLOR_DARKVOILET					0x9400D3	//	深紫羅蘭色
#define	COLOR_DARKORCHID					0x9932CC	//	深蘭花紫
#define	COLOR_INDIGO						0x4B0082	//	靛青
#define	COLOR_BLUEVIOLET					0x8A2BE2	//	深紫羅蘭的藍色
#define	COLOR_MEDIUMPURPLE					0x9370DB	//	適中的紫色
#define	COLOR_MEDIUMSLATEBLUE				0x7B68EE	//	適中的板岩暗藍灰色
#define	COLOR_SLATEBLUE						0x6A5ACD	//	板岩暗藍灰色
#define	COLOR_DARKSLATEBLUE					0x483D8B	//	深巖暗藍灰色
#define	COLOR_LAVENDER						0xE6E6FA	//	薰衣草花的淡紫色
#define	COLOR_GHOSTWHITE					0xF8F8FF	//	幽靈的白色
#define	COLOR_BLUE							0x0000FF	//	純藍
#define	COLOR_MEDIUMBLUE					0x0000CD	//	適中的藍色
#define	COLOR_MIDNIGHTBLUE					0x191970	//	午夜的藍色
#define	COLOR_DARKBLUE						0x00008B	//	深藍色
#define	COLOR_NAVY							0x000080	//	海軍藍
#define	COLOR_ROYALBLUE						0x4169E1	//	皇家藍
#define	COLOR_CORNFLOWERBLUE				0x6495ED	//	矢車菊的藍色
#define	COLOR_LIGHTSTEELBLUE				0xB0C4DE	//	淡鋼藍
#define	COLOR_LIGHTSLATEGRAY				0x778899	//	淺石板灰
#define	COLOR_SLATEGRAY						0x708090	//	石板灰
#define	COLOR_DODERBLUE						0x1E90FF	//	道奇藍
#define	COLOR_ALICEBLUE						0xF0F8FF	//	愛麗絲藍
#define	COLOR_STEELBLUE						0x4682B4	//	鋼藍
#define	COLOR_LIGHTSKYBLUE					0x87CEFA	//	淡藍色
#define	COLOR_SKYBLUE						0x87CEEB	//	天藍色
#define	COLOR_DEEPSKYBLUE					0x00BFFF	//	深天藍
#define	COLOR_LIGHTBLUE						0xADD8E6	//	淡藍
#define	COLOR_POWDERBLUE					0xB0E0E6	//	火藥藍
#define	COLOR_CADETBLUE						0x5F9EA0	//	軍校藍
#define	COLOR_AZURE							0xF0FFFF	//	蔚藍色
#define	COLOR_LIGHTCYAN						0xE1FFFF	//	淡青色
#define	COLOR_PALETURQUOISE					0xAFEEEE	//	蒼白的綠寶石
#define	COLOR_CYAN							0x00FFFF	//	青色
#define	COLOR_AQUA							0x00FFFF	//	水綠色
#define	COLOR_DARKTURQUOISE					0x00CED1	//	深綠寶石
#define	COLOR_DARKSLATEGRAY					0x2F4F4F	//	深石板灰
#define	COLOR_DARKCYAN						0x008B8B	//	深青色
#define	COLOR_TEAL							0x008080	//	水鴨色
#define	COLOR_MEDIUMTURQUOISE				0x48D1CC	//	適中的綠寶石
#define	COLOR_LIGHTSEAGREEN					0x20B2AA	//	淺海洋綠
#define	COLOR_TURQUOISE						0x40E0D0	//	綠寶石
#define	COLOR_AUQAMARIN						0x7FFFAA	//	綠玉\碧綠色
#define	COLOR_MEDIUMAQUAMARINE				0x00FA9A	//	適中的碧綠色
#define	COLOR_MEDIUMSPRINGGREEN				0x00FF7F	//	適中的春天的綠色
#define	COLOR_MINTCREAM						0xF5FFFA	//	薄荷奶油
#define	COLOR_SPRINGGREEN					0x3CB371	//	春天的綠色
#define	COLOR_SEAGREEN						0x2E8B57	//	海洋綠
#define	COLOR_HONEYDEW						0xF0FFF0	//	蜂蜜
#define	COLOR_LIGHTGREEN					0x90EE90	//	淡綠色
#define	COLOR_PALEGREEN						0x98FB98	//	蒼白的綠色
#define	COLOR_DARKSEAGREEN					0x8FBC8F	//	深海洋綠
#define	COLOR_LIMEGREEN						0x32CD32	//	酸橙綠
#define	COLOR_LIME							0x00FF00	//	酸橙色
#define	COLOR_FORESTGREEN					0x228B22	//	森林綠
#define	COLOR_GREEN							0x008000	//	純綠
#define	COLOR_DARKGREEN						0x006400	//	深綠色
#define	COLOR_CHARTREUSE					0x7FFF00	//	查特酒綠
#define	COLOR_LAWNGREEN						0x7CFC00	//	草坪綠
#define	COLOR_GREENYELLOW					0xADFF2F	//	綠黃色
#define	COLOR_OLIVEDRAB						0x556B2F	//	橄欖土褐色
#define	COLOR_BEIGE							0xF5F5DC	//	米色(淺褐色)
#define	COLOR_LIGHTGOLDENRODYELLOW			0xFAFAD2	//	淺秋麒麟黃
#define	COLOR_IVORY							0xFFFFF0	//	象牙
#define	COLOR_LIGHTYELLOW					0xFFFFE0	//	淺黃色
#define	COLOR_YELLOW						0xFFFF00	//	純黃
#define	COLOR_OLIVE							0x808000	//	橄欖
#define	COLOR_DARKKHAKI						0xBDB76B	//	深卡其布
#define	COLOR_LEMONCHIFFON					0xFFFACD	//	檸檬薄紗
#define	COLOR_PALEGODENROD					0xEEE8AA	//	灰秋麒麟
#define	COLOR_KHAKI							0xF0E68C	//	卡其布
#define	COLOR_GOLD							0xFFD700	//	金
#define	COLOR_CORNISLK						0xFFF8DC	//	玉米色
#define	COLOR_GOLDENROD						0xDAA520	//	秋麒麟
#define	COLOR_FLORALWHITE					0xFFFAF0	//	花的白色
#define	COLOR_OLDLACE						0xFDF5E6	//	老飾帶
#define	COLOR_WHEAT							0xF5DEB3	//	小麥色
#define	COLOR_MOCCASIN						0xFFE4B5	//	鹿皮鞋
#define	COLOR_ORANGE						0xFFA500	//	橙色
#define	COLOR_PAPAYAWHIP					0xFFEFD5	//	番木瓜
#define	COLOR_BLANCHEDALMOND				0xFFEBCD	//	漂白的杏仁
#define	COLOR_NAVAJOWHITE					0xFFDEAD	//	納瓦霍白
#define	COLOR_ANTIQUEWHITE					0xFAEBD7	//	古代的白色
#define	COLOR_TAN							0xD2B48C	//	曬黑
#define	COLOR_BRULYWOOD						0xDEB887	//	結實的樹
#define	COLOR_BISQUE						0xFFE4C4	//	(濃湯)乳脂,番茄等
#define	COLOR_DARKORANGE					0xFF8C00	//	深橙色
#define	COLOR_LINEN							0xFAF0E6	//	亞麻布
#define	COLOR_PERU							0xCD853F	//	祕魯
#define	COLOR_PEACHPUFF						0xFFDAB9	//	桃色
#define	COLOR_SANDYBROWN					0xF4A460	//	沙棕色
#define	COLOR_CHOCOLATE						0xD2691E	//	巧克力
#define	COLOR_SADDLEBROWN					0x8B4513	//	馬鞍棕色
#define	COLOR_SEASHELL						0xFFF5EE	//	海貝殼
#define	COLOR_SIENNA						0xA0522D	//	黃土赭色
#define	COLOR_LIGHTSALMON					0xFFA07A	//	淺鮮肉(鮭魚)色
#define	COLOR_CORAL							0xFF7F50	//	珊瑚
#define	COLOR_ORANGERED						0xFF4500	//	橙紅色
#define	COLOR_DARKSALMON					0xE9967A	//	深鮮肉(鮭魚)色
#define	COLOR_TOMATO						0xFF6347	//	番茄
#define	COLOR_MISTYROSE						0xFFE4E1	//	薄霧玫瑰
#define	COLOR_SALMON						0xFA8072	//	鮮肉(鮭魚)色
#define	COLOR_SNOW							0xFFFAFA	//	雪
#define	COLOR_LIGHTCORAL					0xF08080	//	淡珊瑚色
#define	COLOR_ROSYBROWN						0xBC8F8F	//	玫瑰棕色
#define	COLOR_INDIANRED						0xCD5C5C	//	印度紅
#define	COLOR_RED							0xFF0000	//	純紅
#define	COLOR_BROWN							0xA52A2A	//	棕色
#define	COLOR_FIREBRICK						0xB22222	//	耐火磚
#define	COLOR_DARKRED						0x8B0000	//	深紅色
#define	COLOR_MAROON						0x800000	//	栗色
#define	COLOR_WHITE							0xFFFFFF	//	純白
#define	COLOR_WHITESMOKE					0xF5F5F5	//	白煙
#define	COLOR_GAINSBORO						0xDCDCDC	//	亮灰色
#define	COLOR_LIGHTGREY						0xD3D3D3	//	淺灰色
#define	COLOR_SILVER						0xC0C0C0	//	銀白色
#define	COLOR_DARKGRAY						0xA9A9A9	//	深灰色
#define	COLOR_GRAY							0x808080	//	灰色
#define	COLOR_DIMGRAY						0x696969	//	暗淡的灰色
#define	COLOR_BLACK							0x000000	//	純黑

//聲明功能函數
void Ws2812b_Configuration(void);
void Ws2812b_Write(u32 color);


void RGB_Refresh(u32 color,u8 num);
void RGB_Cycle(u32 color,u8 num,u16 speed);
void RGB_Wave(u32 color,u8 num,u16 speed);
void RGB_Flash(u32 color,u8 num,u16 speed,u8 cnt);

#endif

兩者代碼大同小異,關鍵是高低電平時間,這個是我用示波器慢慢測試出來的,親測能用,最高支持整個燈板(88顆燈珠),在調試和測試結果上看STM8優於N76E003。

完整代碼可以加QQ羣下載:733945348

By Urien 2019年8月11日 14:25:04

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章