久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 626|回復(fù): 22
打印 上一主題 下一主題
收起左側(cè)

輝芒微61E143 如何控制ws2812B燈珠,求大佬幫忙

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1142265 發(fā)表于 2025-4-7 17:20 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
    最近遇到了一個(gè)棘手的問(wèn)題,那就是ws2812B燈珠的驅(qū)動(dòng)問(wèn)題。
我使用的是輝芒微的FT61E143的單片機(jī),主頻是16Mhz  2T的指令周期,一條命令執(zhí)行下來(lái)差不多 125ns左右。
想用它來(lái)驅(qū)動(dòng)ws2812B 3528-BT00燈珠,能驅(qū)動(dòng),但是顏色不對(duì),也無(wú)法關(guān)閉,很奇怪。
下面是我的代碼


#include "SYSCFG.h"

#define WS2812_PIN PB4   // WS2812 信號(hào)引腳
#define LED_NUM 8        // WS2812 顆數(shù)

unsigned char LED_DATA[LED_NUM * 3]; // WS2812 RGB 數(shù)據(jù)存儲(chǔ)

// **精準(zhǔn)延時(shí)**
void delay_us(unsigned char us) {
    while (us--) {
        NOP();
        NOP();
        NOP();
        NOP();
    }
}
// **精準(zhǔn)延時(shí)**
void delay_ns(unsigned char ns) {
    unsigned char i;
    for(i=0;i<(ns/62);i++){
                NOP();
    }
}


// **發(fā)送單個(gè) bit**
void ws2812_send_bit(unsigned char bit_1) {
    if (bit_1) {
        WS2812_PIN = 1; // 發(fā)送 1
        //delay_us(1);  // 高電平 0.7us
        delay_ns(595);
        //NOP();NOP();NOP();NOP();NOP();
        WS2812_PIN = 0;
        //NOP();NOP();NOP();
        delay_ns(295);
    } else {
        WS2812_PIN = 1; // 發(fā)送 0
        //NOP();NOP();NOP();
        delay_ns(292);
        WS2812_PIN = 0;
        delay_ns(595);
        //NOP();NOP();NOP();NOP();NOP();
    }
}

// **發(fā)送一個(gè)字節(jié)**
void ws2812_send_byte(unsigned char byte) {
    for (unsigned char i = 0; i < 8; i++) {
        ws2812_send_bit(byte & (0x80>>i));
    }
}

// **發(fā)送整個(gè) LED 數(shù)組**
void ws2812_send_data() {
    for (unsigned int i = 0; i < LED_NUM * 3; i++) {
        ws2812_send_byte(LED_DATA[i]);
    }
    delay_us(100); // 復(fù)位信號(hào) >50μs
}

void POWER_INITIAL() {
    OSCCON = 0B01110001; // 16MHz 時(shí)鐘
    INTCON = 0;          // 關(guān)閉所有中斷
    PORTB = 0B00000000;
    TRISB = 0B00000000;
    ANSELA = 0B00000000; // 數(shù)字引腳
}

void main() {
    POWER_INITIAL();

    // 設(shè)置 LED 顏色(紅、綠、藍(lán))
    LED_DATA[0] = 0x00; // 紅色最大亮度
    LED_DATA[1] = 0x00; // 綠色
    LED_DATA[2] = 0x00; // 藍(lán)色
        LED_DATA[3] = 0xFF;
    while (1) {
                delay_us(100);
        ws2812_send_data(); // 發(fā)送 WS2812 數(shù)據(jù)
        delay_us(500000);   // 500ms 間隔
    }
}



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:192020 發(fā)表于 2025-4-7 18:26 | 只看該作者
有用邏輯分析儀或者示波器看過(guò)波形嗎?估計(jì)就是時(shí)序不對(duì),有for有移位,這些指令也得算進(jìn)去的,用這單片機(jī)驅(qū)動(dòng)有點(diǎn)勉強(qiáng)。要不用匯編,要不就極限優(yōu)化下代碼
回復(fù)

使用道具 舉報(bào)

板凳
ID:1093493 發(fā)表于 2025-4-8 08:09 | 只看該作者
#include "SYSCFG.h"
/*************************************************
功能說(shuō)明:點(diǎn)亮RGB燈不同顏色閃爍
*************************************************/
#define PIN RA7//  RGB燈
#define  LED_DIRECTION        TRISA7
#define  unchar     unsigned char
#define  unint      unsigned int
#define  unlong     unsigned long
#define NUM 12                                //燈的個(gè)數(shù)(最大73個(gè))

typedef struct {
    unsigned char   r;
    unsigned char   b;
    unsigned char   g;
} ws2812_ptr;

ws2812_ptr          led;  
/*----------------------------------------------------
*        函數(shù)名稱:DelayUs
*        功能:   短延時(shí)函數(shù) --16M-2T--大概快1%左右.
*        輸入?yún)?shù):Time 延時(shí)時(shí)間長(zhǎng)度 延時(shí)時(shí)長(zhǎng)Time Us
*        返回參數(shù):無(wú)
----------------------------------------------------*/
void DelayUs(unsigned char Time)
{
        unsigned char a;
        for(a=0;a<Time;a++)
        {
                NOP();
        }
}                  
/*----------------------------------------------------
*        函數(shù)名稱:DelayMs
*        功能:   短延時(shí)函數(shù)
*        輸入?yún)?shù):Time 延時(shí)時(shí)間長(zhǎng)度 延時(shí)時(shí)長(zhǎng)Time ms
*        返回參數(shù):無(wú)
----------------------------------------------------*/
void DelayMs(unsigned char Time)
{
        unsigned char a,b;
        for(a=0;a<Time;a++)
        {
                for(b=0;b<5;b++)
                {
                         DelayUs(197);                 //快1%
                }
        }
}
/*----------------------------------------------------
*        函數(shù)名稱:DelayS
*        功能:   短延時(shí)函數(shù)
*        輸入?yún)?shù):Time 延時(shí)時(shí)間長(zhǎng)度 延時(shí)時(shí)長(zhǎng)Time S
*        返回參數(shù):無(wú)
----------------------------------------------------*/
void DelayS(unsigned char Time)
{
        unsigned char a,b;
        for(a=0;a<Time;a++)
        {
                for(b=0;b<10;b++)
                {
                         DelayMs(100);                
                }
        }
}
unsigned long int bitflip(unsigned char b);

// transmit the ws2812 led
void ws2812_send(ws2812_ptr* led)
{
    int j;
    long int val;
    // the WS2812 wants bits in the order of:
    // GGGGGGGGRRRRRRRRBBBBBBBB
    // but I want to work in the opposite order. so i'm going to flip
    // the bits around and do some shifting so my order is
    // BBBBBBBBRRRRRRRRGGGGGGGG
    // with the most significant bit on the far right. so the RGB value
    // of 128 64 32, which normally would be:
    // R : 0b10000000
    // G : 0b01000000
    // B : 0b00100000
    // will become:
    // BBBBBBBBRRRRRRRRGGGGGGGG
    // 000001000000000100000010
    val = (bitflip(led->b) << 16) + (bitflip(led->r) << 8) + (bitflip(led->g));

    // now begin shifting them over one at a time      //每次移動(dòng)一個(gè)
    for(j = 0; j < 24; j++)
    {
        // depending on if the currently viewed bit is 1 or 0
        // the pin will stay high for different times

        if (val & 1 == 1)
        {
            // if it is a 1, let it stay higher a bit longer
            PIN = 1;
            NOP();
            NOP();
            PIN = 0;
                        NOP();
           
                       
        }
        
         else
        
        {
            // but a 0 should go high and then low as fast as possible
            PIN = 1;
                        NOP();
           
            PIN = 0;
                        NOP();
                        NOP();
        }
        
        // and then right shift to get the next bit
        val = val >> (unsigned char)1;
    }
}

// reverse the bits in a char
unsigned long int bitflip(unsigned char b)
{
   b = (b & 0xF0) >> 4 | (b & 0x0F) << 4;
   b = (b & 0xCC) >> 2 | (b & 0x33) << 2;
   b = (b & 0xAA) >> 1 | (b & 0x55) << 1;
   return (unsigned long int)b;
}
/*-------------------------------------------------
* 函數(shù)名稱:WDT_INITIAL
* 功能:           初始化設(shè)置看門(mén)狗1S時(shí)間復(fù)位
* 相關(guān)寄存器:
* 1、INTCON
* 2、OPTION
* 3、WDTCON
-------------------------------------------------*/
void WDT_INITIAL (void)
{
        CLRWDT();                          //清看門(mén)狗
        PSA=1;                             //時(shí)鐘分頻分給WDT
        WDTCON = 0B00010100;        //WDTPS=1010=1:32768,PS=000=1:1
                                                                //定時(shí)時(shí)間=(32768*1)/32000=1024ms
}
/*-------------------------------------------------
*  函數(shù)名:initMcu
*        功能:  上電系統(tǒng)初始化
*  輸入:  無(wú)
*  輸出:  無(wú)
--------------------------------------------------*/       
void initMcu (void)
{
        OSCCON = 0B01110001;        //WDT 32KHZ IRCF=111=16MHZ/2=8MHZ,0.125US/T
                                                         //Bit0=1,系統(tǒng)時(shí)鐘為內(nèi)部振蕩器
                                                         //Bit0=0,時(shí)鐘源由FOSC<2:0>決定即編譯選項(xiàng)時(shí)選擇

        INTCON = 0;                          // 暫禁止所有中斷
        LED_DIRECTION = 0;
}


/*-------------------------------------------------
*  函數(shù)名: main
*        功能:  主函數(shù)
*  輸入:  無(wú)
*  輸出:  無(wú)
--------------------------------------------------*/
void main()
{
    unsigned char cnt=0,i,frame =0;i;
                initMcu();                        //系統(tǒng)初始化
        //WDT_INITIAL();
       
        led.r = 0;
        led.g = 255;
        led.b = 255;
        while(1)
        {
                if(frame == 0)
                {
                        for(i=0;i<NUM;i++)
                        {
                                if(i<cnt)
                                {
                                        led.r = 0;
                                        led.g = 255;
                                        led.b = 0;
                                }
                                else
                                {
                                        led.r = 0;
                                        led.g = 0;
                                        led.b = 0;
                                }
                               
                                ws2812_send(&led);
                        }
                        DelayMs(60);
                }
                else if(frame == 1)
                {
                        for(i=0;i<NUM;i++)
                        {
                                if(i<(NUM-cnt))
                                {
                                        led.r = 0;
                                        led.g = 255;
                                        led.b = 0;
                                }
                                else
                                {
                                        led.r = 0;
                                        led.g = 0;
                                        led.b = 0;
                                }
                               
                                ws2812_send(&led);
                        }
                        DelayMs(60);
                }       
                else if(frame == 2)
                {
                        for(i=0;i<NUM;i++)
                        {
                                if(i<cnt)
                                {
                                        led.r = 255;
                                        led.g = 0;
                                        led.b = 0;
                                }
                                else
                                {
                                        led.r = 0;
                                        led.g = 0;
                                        led.b = 0;
                                }
                               
                                ws2812_send(&led);
                        }
                        DelayMs(60);
                }
                else if(frame == 3)
                {
                        for(i=0;i<NUM;i++)
                        {
                                if(i<(NUM-cnt))
                                {
                                        led.r = 255;
                                        led.g = 0;
                                        led.b = 0;
                                }
                                else
                                {
                                        led.r = 0;
                                        led.g = 0;
                                        led.b = 0;
                                }
                               
                                ws2812_send(&led);
                        }
                        DelayMs(60);
                }
                else if(frame == 4)
                {
                        for(i=0;i<NUM;i++)
                        {
                                if(i<cnt)
                                {
                                        led.r = 0;
                                        led.g = 0;
                                        led.b = 255;
                                }
                                else
                                {
                                        led.r = 0;
                                        led.g = 0;
                                        led.b = 0;
                                }
                               
                                ws2812_send(&led);
                        }
                        DelayMs(60);
                }
                else if(frame == 5)
                {
                        for(i=0;i<NUM;i++)
                        {
                                if(i<(NUM-cnt))
                                {
                                        led.r = 0;
                                        led.g = 0;
                                        led.b = 255;
                                }
                                else
                                {
                                        led.r = 0;
                                        led.g = 0;
                                        led.b = 0;
                                }
                               
                                ws2812_send(&led);
                        }
                        DelayMs(60);
                }       
                else if(frame == 6)
                {
                        for(i=0;i<NUM;i++)
                        {
                                if(i<cnt)
                                {
                                        led.r = 255;
                                        led.g = 0;
                                        led.b = 255;
                                }
                                else
                                {
                                        led.r = 0;
                                        led.g = 0;
                                        led.b = 0;
                                }
                               
                                ws2812_send(&led);
                        }
                        DelayMs(60);
                }
                else if(frame == 7)
                {
                        for(i=0;i<NUM;i++)
                        {
                                if(i<(NUM-cnt))
                                {
                                        led.r = 255;
                                        led.g = 0;
                                        led.b = 255;
                                }
                                else
                                {
                                        led.r = 0;
                                        led.g = 0;
                                        led.b = 0;
                                }
                               
                                ws2812_send(&led);
                        }
                        DelayMs(60);
                }       
                if(cnt<NUM)
                        cnt++;
                else
                {
                        cnt = 0;
                        if(frame<7)
                                frame++;
                        else
                                frame =0;
                }
               
        }
}

評(píng)分

參與人數(shù) 1黑幣 +30 收起 理由
copower + 30 贊一個(gè)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

地板
ID:1093493 發(fā)表于 2025-4-8 09:22 | 只看該作者
發(fā)你份出自輝忙群的代碼
回復(fù)

使用道具 舉報(bào)

5#
ID:341045 發(fā)表于 2025-4-8 09:54 | 只看該作者
用匯編寫(xiě),極限優(yōu)化可以。WS2812最低時(shí)序220--380nS,極限優(yōu)化剛好可3T*125=375nS完成電平變換,要點(diǎn)是不用循環(huán),硬寫(xiě)24位色,循環(huán)移動(dòng)數(shù)據(jù)要在長(zhǎng)電平時(shí)間段完成
回復(fù)

使用道具 舉報(bào)

6#
ID:18297 發(fā)表于 2025-4-8 10:51 | 只看該作者
你的這個(gè)時(shí)序不對(duì)。delay延時(shí)時(shí)間長(zhǎng)了。使用匯編輸出控制,我完成過(guò)這個(gè)WS3812的控制程序。
回復(fù)

使用道具 舉報(bào)

7#
ID:1146851 發(fā)表于 2025-4-8 13:49 | 只看該作者
要依據(jù) WS2812B 的數(shù)據(jù)手冊(cè),對(duì)高低電平的延時(shí)時(shí)間進(jìn)行精確調(diào)整。一般而言,發(fā)送邏輯 1 時(shí),高電平持續(xù)時(shí)間約為 0.7µs,低電平持續(xù)時(shí)間約為 0.35µs;發(fā)送邏輯 0 時(shí),高電平持續(xù)時(shí)間約為 0.35µs,低電平持續(xù)時(shí)間約為 0.7µs。WS2812B 燈珠的數(shù)據(jù)傳輸先測(cè)試能否正確點(diǎn)亮單色
回復(fù)

使用道具 舉報(bào)

8#
ID:1142265 發(fā)表于 2025-4-8 16:03 | 只看該作者
我不會(huì)寫(xiě)匯編,今天用邏輯分析儀抓了一下波形,一個(gè)nop要300-400ns去了 時(shí)間也不是很準(zhǔn),然后執(zhí)行一條RA5=1 ;這樣的代碼,要花100ns,如果執(zhí)行while循環(huán)體要400ns左右的時(shí)間,for循環(huán)體是400ns-1.2us的時(shí)間。 想換個(gè)高頻的芯片寫(xiě),但是老板說(shuō)市面上的人都是用這個(gè)芯片跑ws2812的,一定可以跑通的。很糾結(jié)
回復(fù)

使用道具 舉報(bào)

9#
ID:4867 發(fā)表于 2025-4-8 22:35 | 只看該作者
// **精準(zhǔn)延時(shí)**
void delay_us(unsigned char us) {
    while (us--) {
        NOP();
        NOP();
        NOP();
        NOP();
    }
}

// **發(fā)送單個(gè) bit**
void ws2812_send_bit(unsigned char bit_1) {
    if (bit_1) {
        WS2812_PIN = 1; // 發(fā)送 1
        delay_us(1);
        WS2812_PIN = 0;
    } else {
        WS2812_PIN = 1; // 發(fā)送 0
        WS2812_PIN = 0;
    }
}

// **發(fā)送一個(gè)字節(jié)**
void ws2812_send_byte(unsigned char byte) {
    for (unsigned char i = 0; i < 8; i++) {
        ws2812_send_bit(byte & (0x80>>i));
    }
}

// 復(fù)位信號(hào),用于刷新顯示
void reset_ws2812b(void) {
    WS2812B_PIN = 0;
    delay_us(50);  // 低電平持續(xù)時(shí)間大于 280us
}

// **發(fā)送整個(gè) LED 數(shù)組**
void ws2812_send_data() {
    for (unsigned int i = 0; i < LED_NUM * 3; i++) {
        ws2812_send_byte(LED_DATA[i]);
    }
    reset_ws2812b(); // 復(fù)位信號(hào) >50μs
}
回復(fù)

使用道具 舉報(bào)

10#
ID:192020 發(fā)表于 2025-4-9 18:14 | 只看該作者
不用循環(huán),用位bit變量,只用if來(lái)硬寫(xiě)24次賦值,估計(jì)還是可以夠用的
回復(fù)

使用道具 舉報(bào)

11#
ID:1088185 發(fā)表于 2025-4-10 21:40 | 只看該作者
最近才幫客人解決同樣的問(wèn)題, 他還需要同時(shí)接收數(shù)據(jù), 我給的第一條意見(jiàn)就是換MCU。
回復(fù)

使用道具 舉報(bào)

12#
ID:1088185 發(fā)表于 2025-4-10 21:47 | 只看該作者
lzts88 發(fā)表于 2025-4-8 09:54
用匯編寫(xiě),極限優(yōu)化可以。WS2812最低時(shí)序220--380nS,極限優(yōu)化剛好可3T*125=375nS完成電平變換,要點(diǎn)是不用 ...

24位只是一顆燈, 你還要再加個(gè)判斷下一個(gè)燈的數(shù)據(jù)完沒(méi)完, 再加下一數(shù)據(jù)加載, 再來(lái)一個(gè)判斷是否最后一數(shù)據(jù)
回復(fù)

使用道具 舉報(bào)

13#
ID:285258 發(fā)表于 2025-4-11 16:48 | 只看該作者
gods701_LUO 發(fā)表于 2025-4-8 16:03
我不會(huì)寫(xiě)匯編,今天用邏輯分析儀抓了一下波形,一個(gè)nop要300-400ns去了 時(shí)間也不是很準(zhǔn),然后執(zhí)行一條RA5=1 ...

任何單片機(jī)都可以跑ws2812,看燈珠數(shù)量,串聯(lián)的燈珠數(shù)量越多每次刷新獨(dú)霸cpu的時(shí)間就越長(zhǎng)。
回復(fù)

使用道具 舉報(bào)

14#
ID:1113066 發(fā)表于 2025-4-11 17:40 | 只看該作者
您好,我這邊是ws2812的原廠家,你寫(xiě)的時(shí)序不對(duì),可以聯(lián)系我,發(fā)一份示例程序給你。
回復(fù)

使用道具 舉報(bào)

15#
ID:341045 發(fā)表于 2025-4-11 20:49 | 只看該作者
1600277881 發(fā)表于 2025-4-10 21:47
24位只是一顆燈, 你還要再加個(gè)判斷下一個(gè)燈的數(shù)據(jù)完沒(méi)完, 再加下一數(shù)據(jù)加載, 再來(lái)一個(gè)判斷是否最后一 ...

時(shí)序只是對(duì)應(yīng)一個(gè)燈,下一個(gè)燈的延時(shí)不影響
回復(fù)

使用道具 舉報(bào)

16#
ID:341045 發(fā)表于 2025-4-11 20:52 | 只看該作者
1600277881 發(fā)表于 2025-4-10 21:40
最近才幫客人解決同樣的問(wèn)題, 他還需要同時(shí)接收數(shù)據(jù), 我給的第一條意見(jiàn)就是換MCU。

用匯編就可以
回復(fù)

使用道具 舉報(bào)

17#
ID:401564 發(fā)表于 2025-4-12 13:07 | 只看該作者
gods701_LUO 發(fā)表于 2025-4-8 16:03
我不會(huì)寫(xiě)匯編,今天用邏輯分析儀抓了一下波形,一個(gè)nop要300-400ns去了 時(shí)間也不是很準(zhǔn),然后執(zhí)行一條RA5=1 ...

不需要匯編
設(shè)定好之后,一個(gè)NOP就應(yīng)該是對(duì)應(yīng)的125uS,如果是300uS,那就是你代碼或者配置的問(wèn)題
這種單片機(jī)隨便寫(xiě)2812的,不管多少個(gè)燈
寫(xiě)入的時(shí)候是要關(guān)閉所有中斷的,不然顏色很容易出錯(cuò)
如果程序需要高的效率,肯定是不能一下子寫(xiě)完所有的燈,燈多的話,可能會(huì)卡個(gè)幾十mS的,這肯定是不行的
你可以把代碼邏輯優(yōu)化一下,每5mS寫(xiě)一個(gè)燈,然后去執(zhí)行一下主程序的其它代碼,下一個(gè)5mS再寫(xiě)第二個(gè)燈,這樣下來(lái),100個(gè)燈的用時(shí)會(huì)用到500mS,整體效果不會(huì)差太多,或者是改成1mS寫(xiě)入一個(gè)燈
市場(chǎng)上大多的2812都是用這個(gè)低端單片機(jī)控制的,想改不太現(xiàn)實(shí)的
有的是因?yàn)閱纹瑱C(jī)供應(yīng)商是固定的,有的是不想換單片機(jī),產(chǎn)品后期維護(hù)太難,有的就是成本問(wèn)題,大批量產(chǎn)品,1分錢(qián)的成本都是很敏感的
回復(fù)

使用道具 舉報(bào)

18#
ID:1067318 發(fā)表于 2025-4-15 22:22 | 只看該作者
匯編寫(xiě),用STC8單片機(jī)11.0592時(shí)鐘沒(méi)問(wèn)題
回復(fù)

使用道具 舉報(bào)

19#
ID:1142265 發(fā)表于 2025-4-16 13:50 | 只看該作者
我自己修改了一下,先整體實(shí)現(xiàn) 點(diǎn)燈效果,然后再去套for循環(huán)就可以了,如果用for循環(huán)去實(shí)現(xiàn) 根本就點(diǎn)不亮,因?yàn)橐粋(gè)for循環(huán)就要有1.875us的延時(shí),一條if判斷語(yǔ)句要有20多us的延時(shí),不用匯編寫(xiě),只能另辟蹊徑
回復(fù)

使用道具 舉報(bào)

20#
ID:1093493 發(fā)表于 2025-4-16 15:37 | 只看該作者
void write24_GRB2() {  unsigned long  grb;  unsigned char  i;  unsigned long  temp;    grb=0;  temp=0;        grb = (gren | grb) << 8 ;      grb=  (read | grb) << 8;      grb=  (biue | grb) << 8 ;     for(i=0;i<24;i++)    {       temp=grb & 0x80000000;            if(temp)            {                  out1=1;                  DelayUs(1);                  out1=0;                              }          else         {           out1=1;           out1=0;           DelayUs(1);            }              grb <<= 1;     } }        親測(cè)沒(méi)問(wèn)題視頻為證
回復(fù)

使用道具 舉報(bào)

21#
ID:108361 發(fā)表于 2025-4-16 16:43 | 只看該作者
芯片有SPI接口嗎?如果你的SPI能跑到6M的時(shí)鐘,就可以用SPI發(fā)送0xc0作為bit 0,發(fā)送0xf8作為bit 1,來(lái)實(shí)現(xiàn)全部字節(jié)的發(fā)送了
回復(fù)

使用道具 舉報(bào)

22#
ID:401564 發(fā)表于 2025-4-17 12:51 | 只看該作者
gods701_LUO 發(fā)表于 2025-4-16 13:50
我自己修改了一下,先整體實(shí)現(xiàn) 點(diǎn)燈效果,然后再去套for循環(huán)就可以了,如果用for循環(huán)去實(shí)現(xiàn) 根本就點(diǎn)不亮, ...

你這個(gè)代碼本身就有問(wèn)題
第一:  for(j = 0; j < 24; j++),在這里,你定義了int j,那么,j就是一個(gè)16位的數(shù)據(jù)了,就要用到兩個(gè)字節(jié)在存放,8位單片機(jī)處理兩個(gè)字節(jié)數(shù)據(jù)是很耗時(shí)間的,至少在WS2812中是這樣的
第二: 底下定義的val也有問(wèn)題,它是一個(gè) long int val;,這就是4個(gè)字節(jié)的數(shù)據(jù),這不更耗時(shí)了叫嗎?
這是我一個(gè)WS2812的寫(xiě)入程序,用的是16MHZ/4T的,寫(xiě)入完全沒(méi)有問(wèn)題
void write_ws2812(u8 rgb_data)
{
  u8 i;
  for(i = 0; i < 8; i++)
  {
    if(rgb_data & 0x80)//寫(xiě)"1"
    {
      DO = HI;
          delay_750ns
      DO = LOW;
    }
    else //寫(xiě)"0"
    {
      DO = HI;
      DO = LOW;
    }
    rgb_data <<= 1;
  }
}
回復(fù)

使用道具 舉報(bào)

23#
ID:1147008 發(fā)表于 2025-4-17 13:25 | 只看該作者
Y_G_G 發(fā)表于 2025-4-17 12:51
你這個(gè)代碼本身就有問(wèn)題
第一:  for(j = 0; j < 24; j++),在這里,你定義了int j,那么,j就是一個(gè)16位的數(shù) ...

點(diǎn)評(píng)一下,這位大佬,心腸好,技術(shù)高!完畢!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品欧洲 | 亚洲日日 | 久久尤物免费一区二区三区 | av天天看 | 国产在线观看福利 | 国产精品久久久久久久久久久久久久 | 999精品视频 | 一区二区在线不卡 | 精品久久久久久亚洲综合网 | 国产一区二区在线免费观看 | 久草热线 | 九九免费视频 | 国产一级毛片精品完整视频版 | 亚洲欧美日韩精品久久亚洲区 | 伊人国产精品 | 成人国产精品色哟哟 | 欧美国产日韩一区 | 中文成人在线 | 成人在线免费视频 | 亚洲一区久久 | 欧美久久久| 亚洲成网站| 久久高清国产视频 | 日本午夜在线视频 | 亚洲美女一区 | 日本中出视频 | av黄色在线 | av激情影院 | 久久久久成人精品亚洲国产 | 亚洲a在线观看 | 亚洲精品68久久久一区 | 亚洲欧美日韩中文字幕一区二区三区 | 日本不卡在线观看 | 一区二区亚洲 | 九九久久99 | av网址在线 | 九九热精品视频 | 日韩三级电影一区二区 | 国产激情视频网址 | 欧美黄色片| 免费国产一区 |