DebugLab
发表于 2024-8-5 11:11:00
#include <STC8.H>
#include <intrins.h>
#define WS2812 P33 //GPIO
#define LED 10 //灯珠个数
unsigned char RED,GREEN,BLUE;
/*----------------------------延时10us@STC-Y6@11.0592MHz----------------------------*/
void Delay_10us(void)
{
unsigned char i;
i=35;
while(--i);
}
/*----------------------------延时x10us----------------------------*/
void Delay_x10us(unsigned char x)
{
while(x--)
Delay_10us();
}
/*----------------------------延时10ms@STC-Y6@11.0592MHz----------------------------*/
//void Delay_10ms(void)
//{
// unsigned char i,j;
// _nop_();
// _nop_();
// i=144;
// j=157;
// do
// {
// while(--j);
// }while(--i);
//}
/*----------------------------延时x10ms----------------------------*/
//void Delay_x10ms(unsigned char x)
//{
// while(x--)
// Delay_10ms();
//}
void WS2812_Reset(void)
{
WS2812=0;
Delay_x10us(10);
}
void WS2812_Write_Byte(unsigned char data temp) //STC-Y6@11.0592MHz 0:375ns+1350ns 1:925ns+1350ns
{
unsigned char data i=8;
while(i)
{
temp<<=1;
WS2812=1;
if(CY)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
WS2812=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
i--;
}
}
void WS2812_Write(void)
{
unsigned char i;
WS2812_Reset();
for(i=0;i<LED;i++) //10个灯
{
WS2812_Write_Byte(GREEN);
WS2812_Write_Byte(RED);
WS2812_Write_Byte(BLUE);
}
}
void Init(void)
{
P3M0=0x08;
P3M1=0x00;
}
void main(void)
{
Init();
while(1)
{
RED=128; //红 0~255
GREEN=128; //绿 0~255
BLUE=128; //蓝 0~255
WS2812_Write();
}
}
DebugLab
发表于 2024-8-5 11:11:30
DebugLab 发表于 2024-8-5 11:11
#include
#include
#define WS2812 P33 //GPIO
改一下就能用了,时钟11.0592M
好学天上
发表于 2024-8-5 11:11:57
wnagming 发表于 2024-8-5 10:47
先点灯,慢慢来,一步一步来
是直接发FF FF FF第一个灯就会亮全白吗,还是这个FF FF FF是我写的协议{:3_57:}
好学天上
发表于 2024-8-5 11:40:03
DebugLab 发表于 2024-8-5 11:11
改一下就能用了,时钟11.0592M
改成P54口了,还是一个灯都点不亮,这个程序功能是我说的那个吗{:3_57:}
DebugLab
发表于 2024-8-5 12:28:41
好学天上 发表于 2024-8-5 11:40
改成P54口了,还是一个灯都点不亮,这个程序功能是我说的那个吗
功能不同,改一下
复位和字节发送是通用的
时序用示波器调一下,我的是STC-Y6@11.0592MHz
好学天上
发表于 2024-8-5 13:32:17
DebugLab 发表于 2024-8-5 12:28
功能不同,改一下
复位和字节发送是通用的
时序用示波器调一下,我的是 ...
天老爷,是我太蠢了,我忘记该P54推挽输出了{:3_55:}
还有就是我这块板上有五百个灯,我把灯数量改成五百,然后i也改成int类型了,但没办法全部点亮,而且灯的颜色也变成暖黄了,是什么原因呀,还有个别灯会不亮或者显示别的颜色
好学天上
发表于 2024-8-5 13:58:21
DebugLab 发表于 2024-8-5 12:28
功能不同,改一下
复位和字节发送是通用的
时序用示波器调一下,我的是 ...
如果在发送字节的循环里,要前面的灯不亮,是把GREE和RED还有YELLOW的值改为0吗,试了好像不行{:3_57:}
DebugLab
发表于 2024-8-5 14:01:03
好学天上 发表于 2024-8-5 13:58
如果在发送字节的循环里,要前面的灯不亮,是把GREE和RED还有YELLOW的值改为0吗,试了好像不行 ...
发一大堆0,然后发数据,再发一大堆0
DebugLab
发表于 2024-8-5 14:01:44
好学天上 发表于 2024-8-5 13:32
天老爷,是我太蠢了,我忘记该P54推挽输出了
还有就是我这块板上有五百个灯,我把灯数量改成五百,然后i ...
灯太多可能是电流不够
好学天上
发表于 2024-8-5 14:12:22
DebugLab 发表于 2024-8-5 14:01
发一大堆0,然后发数据,再发一大堆0
怎么发呀 void WS2812_Write(void)
{
unsigned int i;
WS2812_Reset();
for(i=0;i<LED;i++) //10个灯
{
WS2812_Write_Byte(0);
WS2812_Write_Byte(0);
WS2812_Write_Byte(0);
if(i == (LED-1))
{
WS2812_Write_Byte(GREEN);
WS2812_Write_Byte(RED);
WS2812_Write_Byte(BLUE);
}
}
}
这样式吗