我摘录的这编代码学WS2812灯带,不知道为什么,只能点亮一个灯,灯的颜色没错,说明时序对的,请各大大指点指点那有问题怎样修改,已确认灯带没有问题


/*程序功能:用stc89c52rc单片机控制ws2812 RGB输出,显示全色彩
/*备        注:51单片机晶振24M
/********************************************************/

#include<reg52.h>
#include<intrins.h>
#include"math.h"
#define uchar unsigned char
sbit Send_Dat=P0^1;               //数据输出,上拉后接ws2812 IN脚
//sbit SJ=P1^4;       //LED发光管的使能端
//sbit k1=P3^1;
//sbit k2=P3^0;
//sbit k3=P3^2;
//sbit k4=P3^3;

//存储一个转化后的RGB2进制数  共24bits
struct My_24bits                    //结构体
{
    uchar G_VAL;                 //绿色  0-255
    uchar R_VAL;                  //红色 0-255
    uchar B_VAL;                  //蓝色0-255
};
/*写入数据时序*/
void Send_A_bit(uchar VAL)
{
    if (VAL==1)
    {
        Send_Dat=1;//
        _nop_(); 
        _nop_();
        Send_Dat=0;
    }
    else
    {
        Send_Dat=1;
        _nop_();
        Send_Dat=0;
    }

}
/*小延时函数  一个指令大概是0.25us*/
/* 100us*/

void delay()
{
    uchar i,j;
    for (i=0; i<4; i++)
    {
        for (j=0; j<100; j++);
    }
}
void delays(uchar ms)
{
    uchar i,j;
    for(j = ms; j > 0; j--)
        for (i=0; i<4; i++)
        {
            delay();
        }
}


/*发送24位字符(包含RGB信息各8位)*/
void Send_24bits(struct My_24bits RGB_VAL)
{
    uchar i;
    for(i=0; i<8; i++)
    {
        Send_A_bit(RGB_VAL.G_VAL>>(7-i)&0x01);
    }
    for(i=8; i<16; i++)
    {
        Send_A_bit(RGB_VAL.R_VAL>>(15-i)&0x01);
    }
    for(i=16; i<24; i++)
    {
        Send_A_bit(RGB_VAL.B_VAL>>(23-i)&0x01);
    }
}
/*主函数*/
void main()
{
    struct My_24bits d;
    uchar temp,c;
    Send_Dat=0;
    d.G_VAL = 0x00;
    d.R_VAL = 0xaa;
    d.B_VAL = 0x00;
    while(1)
    {
        for(c=0; c<4; c++) //发送led数据侦,一总发送四个灯的数据
        {
            Send_24bits(d);
            delays(200);
        }
        //
    }
}

你要一次发送n个灯乘以rgb数据,而不是一个rgb数据发送n次。只有一组rgb数据只会控制一个灯。