/*程序功能:用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数据只会控制一个灯。