本人使用STC15单片机驱动RGB彩灯 时钟为30M 通过IO口反转来产生彩灯的数据时序(0码和1码)根据官方给出资料已经成功亮灯:
想跟老铁请教几个问题:
现在的这种全彩灯跟普通LED不太一样比如要实现最简单跑马灯 花样流水灯好像比一般的LED要复杂一些(只是我个人觉得
可能是我还不太了解)
目前实现单个颜色点亮和切换颜色已经实现 数据手册中写道一颗灯就需要24Bit 即3个字节的数据并且需要接收完毕24Bit才能点亮(我的这是GRB顺序)
那么我的是八个灯珠 就需要循环发送24个字节即可点亮8个灯珠 原理是大致弄明白了一些,
《比如实现流水灯 这数据应该怎么发???》这几天一直在研究这问题,到网站查资料结果都是STM32 的较多没找到比较相近的参考!!!
所以向论坛的老铁求助以下了!
以下为部分单片机驱动代码:
此代码只是在本人单片机里调试结果可以驱动 如果别的单片机可能需要对_nop_(); 做适当调整
//========================================================================
// 描述: 1码,高电平850ns 低电平400ns 误差正负150ns.
// 参数: none.
// 返回: none.
//========================================================================
void WS2812_Write_1()
{
WS2812_Data_GPIO = 1;
//经过逻辑分析仪调试的的延时
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
WS2812_Data_GPIO = 0;
}
//========================================================================
// 描述: 0码,高电平400ns 低电平850ns 误差正负150ns.
// 参数: none.
// 返回: none.
//========================================================================
void WS2812_Write_0()
{
WS2812_Data_GPIO = 1;
//经过逻辑分析仪调试的的延时
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
WS2812_Data_GPIO = 0;
}
//========================================================================
// 描述: 发送24位数据.
// 参数: 绿色8位,红色8位,蓝色8位.
// 返回: none.
//========================================================================
void rgb_write(uint8 G8, uint8 R8, uint8 B8)
{
unsigned int n = 0;
//发送G8位
EA = 0;
for (n = 0; n < 8; n++)
{
if ((G8 & 0x80) == 0x80)
{
rgb_set_up();
}
else
{
rgb_set_down();
}
G8 <<= 1;
}
//发送R8位
for (n = 0; n < 8; n++)
{
if ((R8 & 0x80) == 0x80)
{
rgb_set_up();
}
else
{
rgb_set_down();
}
R8 <<= 1;
}
//发送B8位
for (n = 0; n < 8; n++)
{
if ((B8 & 0x80) == 0x80)
{
rgb_set_up();
}
else
{
rgb_set_down();
}
B8 <<= 1;
}
}
|