RGB(附源码)

1.1 看原理图

数据从输入引脚输入,依次传递到下一个RGB灯的地方,这里的输入引脚相对于主控来说是输出。

RGB灯这个模块的名称是WS2812B,我们得去了解这个模块。

1.2 WS2812

每个灯都是独立的,每个灯需要24位数据才能正常显示,数据在经过灯的时候会自动被截留24位数据。

在使用之前需要280us以上的复位时间。

​​​​​​​1.3 RGB24位数据组成

本身比例就是R:G:B=8:8:8

​​​​​​​1.4数据怎么发送??

 

 

发送数据0:数据线持续220ns~380ns的高电平,然后再持续580ns~1us的低电平,此时就是数据0。

发送数据1:数据线持续580ns~1us的高电平,然后再持续220ns~420ns的低电平,此时是数据1。

复位:280us以上的低电平。

话不多说,直接上代码:

​​​​​​​2.1 RGB应用与配置​​​​​​​​​​​​​​

#include "rgb.h"
#include "systick.h"

/**************************************************
*函 数 名:RGB_IOInit
*函数功能:RGBIO口初始化
*返 回 值:无
*入口参数:无
*出口参数:无
*备    注:
**************************************************/
void RGB_IOInit(void)
{
	GPIO_InitTypeDef  GPIO_InitStruct;
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
	//初始化IO口 设为推挽输出
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStruct);
	
	RGB=0;             //复位
	RGB_SendColor(0);  //RGB1默认熄灭
	RGB_SendColor(0);  //RGB2默认熄灭
	RGB_SendColor(0);  //RGB3默认熄灭
	RGB_SendColor(0);  //RGB4默认熄灭
	
}
/****************************************
 * 函 数 名:WS2812_Reset
 * 函数功能:复位RGB灯的数据
 * 入口参数:无
 * 出口参数:无
 * 备    注:拉低数据线280us以上就是复位信号
 ****************************************/
void WS2812_Reset(void)
{
	RGB = 0;
	delay_us(300);	//复位,拉低280us以上
}
/**************************************************
*函 数 名:RGB_WriteByte
*函数功能:WBS2812发送一个字节,先发高位
*返 回 值:无
*入口参数:dat 颜色值
*出口参数:无
*备    注:RGB PB15 内部调用,所以使用static修饰
**************************************************/
static void RGB_WriteByte(u8 dat)
{
	u8 i=0;
	for(;i<8;i++)
	{
		if(dat&0x80)//发送1码 使高电平保持至少1us,低电平保持220ns~420ns
		{
			RGB = 1;
			delay_us(1);
			RGB = 0;
			for(u8 j=0;j<11;j++) ;
		}
		else//发送0码 使高电平保持220ns~380ns,低电平至少保持1us
		{
			RGB = 1;
			for(u8 j=0;j<8;j++) ;
			RGB = 0;
			delay_us(1);
		}
		dat<<=1;//左移一位继续比较
	}	
}

/**************************************************
*函 数 名:RGB_SendColor
*函数功能:发送一种颜色 24位数据
*返 回 值:无
*入口参数:color 颜色像素 例:0x0000FF 发送纯蓝色
*出口参数:
*备    注:先发绿色再到红色、蓝色,一次发八位,先发高位数据
**************************************************/
void RGB_SendColor(u32 color)
{
	RGB_WriteByte(color>>16);//G
	RGB_WriteByte(color>>8);//R
	RGB_WriteByte(color);   //B
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值