本人使用STC15單片機驅動RGB彩燈 時鐘為30M 通過IO口反轉來產生彩燈的數據時序(0碼和1碼)根據官方給出資料已經成功亮燈:
WS2812數據時間.png (109.13 KB, 下載次數: 42)
下載附件
2021-4-21 11:14 上傳
想跟老鐵請教幾個問題:
現在的這種全彩燈跟普通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;
}
}
|