栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

使用STM32单片机实现炫彩RBG灯程序

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用STM32单片机实现炫彩RBG灯程序

在这里插入代码片
`



#include "bsp_ws281x.h"
#include "bsp_systick.h"

uint8_t pixelBuffer[PIXEL_NUM][GRB];


void ws281x_init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct;
  
  WS281x_GPIO_CLK_FUNCTION(WS281x_GPIO_CLK, ENABLE);
  
  GPIO_InitStruct.GPIO_Pin = WS281x_GPIO_PIN;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(WS281x_GPIOx, &GPIO_InitStruct);
  GPIO_ResetBits(WS281x_GPIOx, WS281x_GPIO_PIN);
  
  ws281x_closeAll();
  delay_ms(100);
}


static void ws281x_delay(uint32_t count)
{
  while(count--);
}


void ws281x_sendTero(void)
{
  //GPIO_SetBits(WS281x_GPIOx, WS281x_GPIO_PIN);
  GPIOA->BSRR = WS281x_GPIO_PIN; 
  ws281x_delay(1);
  //GPIO_ResetBits(WS281x_GPIOx, WS281x_GPIO_PIN);
  GPIOA->BRR = WS281x_GPIO_PIN;
  ws281x_delay(2);
}


void ws281x_sendOne(void)
{
  //GPIO_SetBits(WS281x_GPIOx, WS281x_GPIO_PIN);
  GPIOA->BSRR = WS281x_GPIO_PIN;
  ws281x_delay(2);
  //GPIO_ResetBits(WS281x_GPIOx, WS281x_GPIO_PIN);
  GPIOA->BRR = WS281x_GPIO_PIN;
  ws281x_delay(1);
}


void ws281x_sendReset(void)
{
  GPIO_ResetBits(WS281x_GPIOx, WS281x_GPIO_PIN);
  ws281x_delay(114);  //延时50us
  //GPIO_SetBits(WS281x_GPIOx, WS281x_GPIO_PIN);
}


void ws281x_show(void)
{
  for(uint16_t i = 0; i < PIXEL_NUM; ++i)
  {
    for(uint8_t j = 0; j < GRB; ++j)
    {
      if(pixelBuffer[i][j] == WS_HIGH)
      {
        ws281x_sendOne();
      }
      else
      {
        ws281x_sendTero();
      }
    }
  }
}


void ws281x_closeAll(void)
{
  uint16_t i;
  uint8_t j;
  
  for(i = 0; i < PIXEL_NUM; ++i)
  {
    for(j = 0; j < 24; ++j)
    {
      pixelBuffer[i][j] = WS_LOW;
    }
  }
  ws281x_show(); 
}


uint32_t ws281x_color(uint8_t red, uint8_t green, uint8_t blue)
{
  return green << 16 | red << 8 | blue;
}


void ws281x_setPixelColor(uint16_t n, uint32_t GRBColor)
{
  uint8_t i;
  if(n < PIXEL_NUM)
  {
    for(i = 0; i < GRB; i++)
    {
      pixelBuffer[n][i] = ((GRBColor << i) & 0x800000) ? WS_HIGH : WS_LOW;
    }
  }
}

void ws281x_setPixelRGB(uint16_t n ,uint8_t red, uint8_t green, uint8_t blue)
{
  uint8_t i;
  
  if(n < PIXEL_NUM)
  {
    for(i = 0; i < GRB; ++i)
    {
      pixelBuffer[n][i] = (((ws281x_color(red,green,blue) << i) & 0x800000) ? WS_HIGH : WS_LOW);
    }
  }
}



// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t ws281x_wheel(uint8_t wheelPos) {
  wheelPos = 255 - wheelPos;
  if(wheelPos < 85) {
    return ws281x_color(255 - wheelPos * 3, 0, wheelPos * 3);
  }
  if(wheelPos < 170) {
    wheelPos -= 85;
    return ws281x_color(0, wheelPos * 3, 255 - wheelPos * 3);
  }
  wheelPos -= 170;
  return ws281x_color(wheelPos * 3, 255 - wheelPos * 3, 0);
}

// Fill the dots one after the other with a color
void ws281x_colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/311507.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号