標(biāo)題: 這個(gè)WS2812驅(qū)動(dòng)程序,指定點(diǎn)亮具體的那一顆LED燈、什么顏色,應(yīng)該怎么操作呢? [打印本頁(yè)]

作者: 3486635230    時(shí)間: 2021-7-5 19:50
標(biāo)題: 這個(gè)WS2812驅(qū)動(dòng)程序,指定點(diǎn)亮具體的那一顆LED燈、什么顏色,應(yīng)該怎么操作呢?

#include <STC15F2K60S2.H>
#include "intrins.h"

sbit WS2812 = P1^7;

#define numLEDs 8   //燈的個(gè)數(shù)
unsigned char buf_R[numLEDs] = {0};//顏色緩存
unsigned char buf_G[numLEDs] = {0};
unsigned char buf_B[numLEDs] = {0};

void RGB_Set_Up();  //送0碼
void RGB_Set_Down(); //送1碼



void HAL_Delay(unsigned int t)
{
                unsigned int x,y;
          for(x=114;x>0;x--)
          for(y=t;y>0;y--);
}


         
//復(fù)位延時(shí)
void Delay50us()                //@22.1184MHz
{
        unsigned char i, j;

        _nop_();
        _nop_();
        i = 2;
        j = 15;
        do
        {
                while (--j);
        } while (--i);
}


//1碼,高電平850ns 低電平400ns 誤差正負(fù)150ns
void RGB_Set_Up()
{
                WS2812 = 1;
          //經(jīng)過(guò)邏輯分析儀調(diào)試的的延時(shí)
                _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
          _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_();
                WS2812 = 0;
}

//1碼,高電平400ns 低電平850ns 誤差正負(fù)150ns
void RGB_Set_Down()
{
                WS2812 = 1;
          //經(jīng)過(guò)邏輯分析儀調(diào)試的的延時(shí)
                _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();  
                WS2812 = 0;
}

//發(fā)送24位數(shù)據(jù)
void Send_2811_24bits(unsigned char G8,unsigned char R8,unsigned char B8)
{
          
          unsigned int n = 0;
          //發(fā)送G8位
                for(n=0;n<8;n++)
                {
                        G8<<=n;
                        if(G8&0x80 == 0x80)
                        {
                                RGB_Set_Up();
                        }
                        else  
                        {
                          RGB_Set_Down();
                        }
                }
                //發(fā)送R8位
                for(n=0;n<8;n++)
                {
                        R8<<=n;
                        if(R8&0x80 == 0x80)
                        {
                                RGB_Set_Up();
                        }
                        else  
                        {
                                RGB_Set_Down();
                        }
                       
                }
                //發(fā)送B8位
          for(n=0;n<8;n++)
                {
                        B8<<=n;
                        if(B8&0x80 == 0x80)
                        {
                                RGB_Set_Up();
                        }
                        else  
                        {
                          RGB_Set_Down();
                        }
                }
}
//復(fù)位碼
void RGB_Rst()
{
                WS2812 = 0;
                Delay50us();
}
//把24位數(shù)據(jù)GRB碼轉(zhuǎn)RGB
void Set_Colour(unsigned char r,unsigned char g,unsigned char b)
{
          unsigned char i;
                for(i=0;i<numLEDs;i++)
          {
                                buf_R[i] = r; //緩沖
                          buf_G[i] = g;
                          buf_B[i] = b;
                }
                for(i=0;i<numLEDs;i++)
                {
                        Send_2811_24bits(buf_G[i],buf_R[i],buf_B[i]);//發(fā)送顯示
                }
}
//某一個(gè)點(diǎn)顯示的顏色
void SetPointColour(unsigned int num,unsigned char r,unsigned char g,unsigned char b)
{
          unsigned char i;
                for(i=0;i<numLEDs;i++)
          {
                                buf_R[num] = r;//緩沖
                          buf_G[num] = g;
                          buf_B[num] = b;
                }
                for(i=0;i<numLEDs;i++)
                {
                        Send_2811_24bits(buf_G[i],buf_R[i],buf_B[i]);//發(fā)送顯示
                }
}

//顏色交換24位不拆分發(fā)
void SetPixelColor(unsigned char num,unsigned long c)
{
          unsigned char i;
                for(i=0;i<numLEDs;i++)
          {
                                buf_R[num] = (unsigned char)(c>>16);
                          buf_G[num] = (unsigned char)(c>>8);
                          buf_B[num] = (unsigned char)(c);
                }
                for(i=0;i<numLEDs;i++)
                {
                        Send_2811_24bits(buf_G[i],buf_R[i],buf_B[i]);
                }
}

//復(fù)位
void PixelUpdate()
{
        RGB_Rst();
}
//顏色
unsigned long Color(unsigned char r, unsigned char g, unsigned char b)
{
  return ((unsigned long)r << 16) | ((unsigned long)g <<  8) | b;
}

//顏色算法
unsigned long Wheel(unsigned char WheelPos)
{
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85)
        {
    return Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}

//彩虹
void rainbow(unsigned int wait)
{
  unsigned int i, j;

  for(j=0; j<256; j++)
        {
    for(i=0; i<numLEDs; i++)
                {
      SetPixelColor(i, Wheel((i+j) & 255));
    }
                PixelUpdate();
    HAL_Delay(wait);
  }
}

//稍微不同的是,這使得彩虹均勻分布
void rainbowCycle(unsigned int wait)
{
  unsigned int i, j;

  for(j=0;j<256*5;j++)
        { // 5 cycles of all colors on wheel  車輪上所有顏色的5個(gè)循環(huán)
    for(i=0;i<numLEDs;i++)
         {
     SetPixelColor(i, Wheel(((i * 256 / numLEDs) + j) & 255));
    }
          PixelUpdate();
    HAL_Delay (wait);
  }
}

//Theatre-style crawling lights.呼吸燈
void theaterChase(unsigned long c, unsigned int wait)
{
        int j,q;
        unsigned int i;
  for (j=0; j<10; j++)
        {  //do 10 cycles of chasing  做10個(gè)循環(huán)
    for (q=0; q < 3; q++)
                {
      for (i=0; i<numLEDs; i=i+3)
                        {
        SetPixelColor(i+q, c);    //turn every third pixel on  把每一個(gè)第三個(gè)像素
      }
                        PixelUpdate();
      HAL_Delay(wait);

      for (i=0; i<numLEDs; i=i+3)
                        {
       SetPixelColor(i+q, 0);        //turn every third pixel off   把每一個(gè)第三個(gè)像素關(guān)掉
      }
                        PixelUpdate();
    }
  }
}

//Theatre-style crawling lights with rainbow effect
//帶有彩虹效果的戲劇式爬行燈
void theaterChaseRainbow(unsigned int wait)
{
        int j,q;
        unsigned int i;
  for (j=0; j < 256; j++)
        {     // cycle all 256 colors in the wheel 在輪子上循環(huán)所有256色
    for (q=0; q < 3; q++)
                {
      for (i=0; i < numLEDs; i=i+3)
                        {
        SetPixelColor(i+q, Wheel( (i+j) % 255));    //turn every third pixel off 把每一個(gè)第三個(gè)像素
      }
      PixelUpdate();

      HAL_Delay(wait);

      for (i=0; i < numLEDs; i=i+3)
                        {
        SetPixelColor(i+q, 0);        //turn every third pixel off  把每一個(gè)第三個(gè)像素關(guān)掉
      }
    }
  }
}

// Fill the dots one after the other with a color
//用一種顏色填充這些圓點(diǎn)
void colorWipe(unsigned long c, unsigned int wait)
{
        unsigned int i=0;
  for( i=0; i<numLEDs; i++)
        {
    SetPixelColor(i, c);
    PixelUpdate();
    HAL_Delay(wait);
  }
}

void main()
{
          
                while(1)
                {
                          rainbow(45);
        rainbowCycle(40);
        theaterChase(Color(0,0,255),80); // Blue
                          theaterChase(Color(0,255,0),80); // Blue
                          theaterChase(Color(255,0,0),80); // Blue
                    theaterChaseRainbow(40);
                                colorWipe(255,255);
                }
}
作者: 人人學(xué)會(huì)單片機(jī)    時(shí)間: 2021-7-6 20:26
WS2812驅(qū)動(dòng)程序STC89 http://www.torrancerestoration.com/bbs/dpj-170855-1.html
作者: xxd0708    時(shí)間: 2021-7-7 18:52
三個(gè)字節(jié)一組,第一個(gè)led顯示最先發(fā)的第一組,并將之后的教據(jù)向后轉(zhuǎn)發(fā),第二個(gè)led留下第2組……直至無(wú)數(shù)據(jù)
作者: xxd0708    時(shí)間: 2021-7-7 18:54
調(diào)用這個(gè)函數(shù)//發(fā)送24位數(shù)據(jù) void Send_2811_24bits(unsigned char G8,unsigned char R8,unsigned char B8)
作者: kimoye    時(shí)間: 2021-7-8 08:39
二樓基本正確
作者: kimoye    時(shí)間: 2021-7-8 17:22
這代碼也太長(zhǎng)了把。。。
作者: rong433    時(shí)間: 2021-9-23 22:10
這句代碼就可以控制SetPixelColor(5, 255);括號(hào)里第一個(gè)數(shù)字代表第幾個(gè)LED,第二個(gè)數(shù)字代表顏色
作者: 快樂(lè)眼淚    時(shí)間: 2021-12-11 21:34
rong433 發(fā)表于 2021-9-23 22:10
這句代碼就可以控制SetPixelColor(5, 255);括號(hào)里第一個(gè)數(shù)字代表第幾個(gè)LED,第二個(gè)數(shù)字代表顏色

能具體帖個(gè)程序來(lái)嗎?謝謝!
作者: mengzhixinheng    時(shí)間: 2021-12-12 15:45
你需要顯示第幾個(gè)燈就將它前面的幾個(gè)燈的占空比寫0就行了,自己很容易封裝一個(gè)函數(shù)出來(lái)
作者: 快樂(lè)眼淚    時(shí)間: 2021-12-21 19:39
mengzhixinheng 發(fā)表于 2021-12-12 15:45
你需要顯示第幾個(gè)燈就將它前面的幾個(gè)燈的占空比寫0就行了,自己很容易封裝一個(gè)函數(shù)出來(lái)

我等小白能力不夠啊!
作者: MCU_FANS    時(shí)間: 2021-12-22 11:12
做一個(gè)顯存來(lái)存所有燈的狀態(tài),然后需要改變哪個(gè)燈或者哪幾個(gè)燈的顏色或者亮度,就更改對(duì)應(yīng)的顯存,最后把顯存的數(shù)據(jù)發(fā)送到WS2812的總線上。
作者: stman    時(shí)間: 2022-1-14 12:27
三個(gè)字節(jié)一組,第一個(gè)led顯示最先發(fā)的第一組,并將之后的教據(jù)向后轉(zhuǎn)發(fā),第二個(gè)led留下第2組……直至無(wú)數(shù)據(jù)。能做時(shí)鐘!
作者: Berri    時(shí)間: 2022-4-19 15:05
請(qǐng)問(wèn)以下如何只改變燈的亮度而不改變顏色?我試著改變RGB值顏色也會(huì)改變。比如RGB(255,255,255),調(diào)成RGB(128,128,128)就會(huì)從白色變成灰色
作者: glinfei    時(shí)間: 2022-4-19 15:39
Berri 發(fā)表于 2022-4-19 15:05
請(qǐng)問(wèn)以下如何只改變燈的亮度而不改變顏色?我試著改變RGB值顏色也會(huì)改變。比如RGB(255,255,255),調(diào)成R ...

那是因?yàn)槿搜劬?duì)不同色光的敏感不同,對(duì)黃色相對(duì)更敏感,改變亮度時(shí)各個(gè)分色的數(shù)字不是同步減少,你可以用電腦調(diào)好數(shù)值。
作者: DAI031    時(shí)間: 2024-5-17 10:02
Berri 發(fā)表于 2022-4-19 15:05
請(qǐng)問(wèn)以下如何只改變燈的亮度而不改變顏色?我試著改變RGB值顏色也會(huì)改變。比如RGB(255,255,255),調(diào)成R ...

3個(gè)數(shù)值都是一樣的話只是降低亮度了,RGB顏色的閾值不一樣才能改變顏色啊,




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1