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);
                                        }
      }
}
这样式吗
页: 1 [2] 3
查看完整版本: STC8G驱动WS2812点亮单独的灯