STC15单片机驱动WS2812

今夜无眠,写此博客!

我们先来看时序图!STC15单片机驱动WS2812_第1张图片

 

 

#include 
#include "intrins.h"

sbit WS2812 = P1^7;

#define numLEDs 8   //灯的个数
unsigned char buf_R[numLEDs] = {0};//颜色缓存
unsigned char buf_G[numLEDs] = {0};
unsigned char buf_B[numLEDs] = {0};

void RGB_Set_Up();  //送0码
void RGB_Set_Down(); //送1码



void HAL_Delay(unsigned int t)
{
		unsigned int x,y;
	  for(x=114;x>0;x--)
	  for(y=t;y>0;y--);
}


	 
//复位延时
void Delay50us()		//@22.1184MHz
{
	unsigned char i, j;

	_nop_();
	_nop_();
	i = 2;
	j = 15;
	do
	{
		while (--j);
	} while (--i);
}


//1码,高电平850ns 低电平400ns 误差正负150ns
void RGB_Set_Up()
{
		WS2812 = 1;
	  //经过逻辑分析仪调试的的延时
		_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
	  _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); 
		WS2812 = 0;
}

//1码,高电平400ns 低电平850ns 误差正负150ns
void RGB_Set_Down()
{
		WS2812 = 1;
	  //经过逻辑分析仪调试的的延时
		_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();  
		WS2812 = 0;
}

//发送24位数据
void Send_2811_24bits(unsigned char G8,unsigned char R8,unsigned char B8)
{
	  
	  unsigned int n = 0;
	  //发送G8位
		for(n=0;n<8;n++)
		{
			G8<<=n;
			if(G8&0x80 == 0x80)
			{
				RGB_Set_Up();
			}
			else  
			{
			  RGB_Set_Down();
			}
		}
		//发送R8位
		for(n=0;n<8;n++)
		{
			R8<<=n;
			if(R8&0x80 == 0x80)
			{
				RGB_Set_Up();
			}
			else  
			{
				RGB_Set_Down();
			}
			
		}
		//发送B8位
	  for(n=0;n<8;n++)
		{
			B8<<=n;
			if(B8&0x80 == 0x80)
			{
				RGB_Set_Up();
			}
			else  
			{
			  RGB_Set_Down();
			}
		}
}
//复位码
void RGB_Rst()
{
		WS2812 = 0;
		Delay50us();
}
//把24位数据GRB码转RGB
void Set_Colour(unsigned char r,unsigned char g,unsigned char b)
{
	  unsigned char i;
		for(i=0;i>16);
			  buf_G[num] = (unsigned char)(c>>8);
			  buf_B[num] = (unsigned char)(c);
		}
		for(i=0;i


以上是全部代码


 

更多内容请关注微信公众号

STC15单片机驱动WS2812_第2张图片

 

你可能感兴趣的:(ws2812,stc15单片机,ws2812,c语言,stc15单片机)