led引脚定义
想做一个氛围灯,于是参考了一些资料进行学习。
数据传输
由于这个rgb灯只有一根数据线,所以只能通过串行的方式进行数据发送,发送规则为高位先发,RGB三种颜色一共占用3个字节。如果需要连接多个灯珠,需要进行多次发送由级联电路自动转发。
LED初始化
void LED_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
LED2 = 0;
}
LED颜色渐变
//延迟
void delay_ns(u32 ns)
{
while(ns--);
}
//写入每一位的数据 data=1写1,data=0写0
void RGBWrite_Bit(u8 data)
{
if(data)
{
LED2=1;delay_ns(7);
LED2=0;delay_ns(1);
}
else
{
LED2=1;delay_ns(1);
LED2=0;delay_ns(7);
}
}
//写一个字节数据
void RGBWrite_Byte(u8 byte)
{
u8 i=0;
for(i=0;i<8;i++)
{
RGBWrite_Bit(byte&0x80);
byte<<=1;
}
}
//定义灯珠的颜色
void Write_Color(u8 G, u8 R, u8 B)
{
RGBWrite_Byte(G);
RGBWrite_Byte(R);
RGBWrite_Byte(B);
}
u8 a,b=0xff,c;
int main(void)
{
LED_Init(); //初始化与LED连接的硬件接口
while(1)
{
for(u8 i=0;i<255;i++)//数值渐变
{
Write_Color(a,b,c);delay_ms(10);
a++;b--;
}
for(u8 i;i>0;i--)//数值渐变
{
Write_Color(a,b,c);delay_ms(10);
a--;b++;
}
delay_ms(20);
c=rand()%255; //获取随机值作为rgb颜色主导
}
}
第一次发学习笔记....