|
本人使用STC15單片機(jī)驅(qū)動RGB彩燈 時(shí)鐘為30M 通過IO口反轉(zhuǎn)來產(chǎn)生彩燈的數(shù)據(jù)時(shí)序(0碼和1碼)根據(jù)官方給出資料已經(jīng)成功亮燈:
WS2812數(shù)據(jù)時(shí)間.png (109.13 KB, 下載次數(shù): 42)
下載附件
2021-4-21 11:14 上傳
想跟老鐵請教幾個(gè)問題:
現(xiàn)在的這種全彩燈跟普通LED不太一樣比如要實(shí)現(xiàn)最簡單跑馬燈 花樣流水燈好像比一般的LED要復(fù)雜一些(只是我個(gè)人覺得
可能是我還不太了解)
目前實(shí)現(xiàn)單個(gè)顏色點(diǎn)亮和切換顏色已經(jīng)實(shí)現(xiàn) 數(shù)據(jù)手冊中寫道一顆燈就需要24Bit 即3個(gè)字節(jié)的數(shù)據(jù)并且需要接收完畢24Bit才能點(diǎn)亮(我的這是GRB順序)
那么我的是八個(gè)燈珠 就需要循環(huán)發(fā)送24個(gè)字節(jié)即可點(diǎn)亮8個(gè)燈珠 原理是大致弄明白了一些,
《比如實(shí)現(xiàn)流水燈 這數(shù)據(jù)應(yīng)該怎么發(fā)???》這幾天一直在研究這問題,到網(wǎng)站查資料結(jié)果都是STM32 的較多沒找到比較相近的參考。!
所以向論壇的老鐵求助以下了!
以下為部分單片機(jī)驅(qū)動代碼:
此代碼只是在本人單片機(jī)里調(diào)試結(jié)果可以驅(qū)動 如果別的單片機(jī)可能需要對_nop_(); 做適當(dāng)調(diào)整
//========================================================================
// 描述: 1碼,高電平850ns 低電平400ns 誤差正負(fù)150ns.
// 參數(shù): none.
// 返回: none.
//========================================================================
void WS2812_Write_1()
{
WS2812_Data_GPIO = 1;
//經(jīng)過邏輯分析儀調(diào)試的的延時(shí)
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
WS2812_Data_GPIO = 0;
}
//========================================================================
// 描述: 0碼,高電平400ns 低電平850ns 誤差正負(fù)150ns.
// 參數(shù): none.
// 返回: none.
//========================================================================
void WS2812_Write_0()
{
WS2812_Data_GPIO = 1;
//經(jīng)過邏輯分析儀調(diào)試的的延時(shí)
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
WS2812_Data_GPIO = 0;
}
//========================================================================
// 描述: 發(fā)送24位數(shù)據(jù).
// 參數(shù): 綠色8位,紅色8位,藍(lán)色8位.
// 返回: none.
//========================================================================
void rgb_write(uint8 G8, uint8 R8, uint8 B8)
{
unsigned int n = 0;
//發(fā)送G8位
EA = 0;
for (n = 0; n < 8; n++)
{
if ((G8 & 0x80) == 0x80)
{
rgb_set_up();
}
else
{
rgb_set_down();
}
G8 <<= 1;
}
//發(fā)送R8位
for (n = 0; n < 8; n++)
{
if ((R8 & 0x80) == 0x80)
{
rgb_set_up();
}
else
{
rgb_set_down();
}
R8 <<= 1;
}
//發(fā)送B8位
for (n = 0; n < 8; n++)
{
if ((B8 & 0x80) == 0x80)
{
rgb_set_up();
}
else
{
rgb_set_down();
}
B8 <<= 1;
}
}
|
|