263 lines
6.9 KiB
C
263 lines
6.9 KiB
C
|
/*****************************************************************
|
|||
|
;Project: Light
|
|||
|
;MCU:
|
|||
|
;Date:
|
|||
|
;File:
|
|||
|
;Function:
|
|||
|
******************************************************************/
|
|||
|
#include "ws2812.h"
|
|||
|
#include "delay.h"
|
|||
|
#include "gpio.h"
|
|||
|
/*---------------------------------------------------------------*/
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
unsigned char gLedBuffer[LED_NUM][GRB] = {0}; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD>
|
|||
|
/*---------------------------------------------------------------*/
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
static void WS_Port_Init(void);
|
|||
|
static void WS_DIN_Clear(void);
|
|||
|
static void WS_Write_0(void);
|
|||
|
static void WS_Write_1(void);
|
|||
|
/*---------------------------------------------------------------*/
|
|||
|
//WS2812<31><32>ʼ<EFBFBD><CABC>
|
|||
|
void WS_Init(void)
|
|||
|
{
|
|||
|
WS_Port_Init();
|
|||
|
WS_CloseAll();
|
|||
|
}
|
|||
|
/*---------------------------------------------------------------*/
|
|||
|
//WS<57><53><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>
|
|||
|
void WS_Power(FunctionalState NewState)
|
|||
|
{
|
|||
|
GPIO_Set_Output(U32BIT(WS_EN_PIN));
|
|||
|
|
|||
|
if(NewState != DISABLE)
|
|||
|
GPIO_Pin_Set(U32BIT(WS_EN_PIN));
|
|||
|
else
|
|||
|
GPIO_Pin_Clear(U32BIT(WS_EN_PIN));
|
|||
|
}
|
|||
|
/*---------------------------------------------------------------*/
|
|||
|
//<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD>е<EFBFBD>led
|
|||
|
void WS_CloseAll(void)
|
|||
|
{
|
|||
|
unsigned char led_i, color_i;
|
|||
|
|
|||
|
for(led_i=0;led_i<LED_NUM;led_i++)
|
|||
|
{
|
|||
|
for(color_i=0;color_i<GRB;color_i++)
|
|||
|
{
|
|||
|
gLedBuffer[led_i][color_i] = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
WS_Show(); //<2F><><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
//WS_Power(DISABLE); //<2F>ر<EFBFBD>WS<57>Ĺ<EFBFBD><C4B9><EFBFBD>
|
|||
|
}
|
|||
|
/*---------------------------------------------------------------*/
|
|||
|
//--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ledbuff <20><><EFBFBD><EFBFBD>
|
|||
|
void LedBuff_CleanAll(void)
|
|||
|
{
|
|||
|
unsigned char led_i,color_i; //<2F><><EFBFBD><EFBFBD>forѭ<72><D1AD>
|
|||
|
|
|||
|
for(led_i=0;led_i<LED_NUM;led_i++)
|
|||
|
for(color_i=0;color_i<GRB;color_i++)
|
|||
|
gLedBuffer[led_i][color_i] = 0;
|
|||
|
}
|
|||
|
/*---------------------------------------------------------------*/
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>
|
|||
|
void WS_LightAll(void)
|
|||
|
{
|
|||
|
WS_WriteNum(LED_NUM,0xff0000);
|
|||
|
}
|
|||
|
/*---------------------------------------------------------------*/
|
|||
|
//ָ<><D6B8>дij<D0B4><C4B3><EFBFBD><EFBFBD>д<EFBFBD><D0B4>color<6F><72><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD>show<6F><77>
|
|||
|
void LedBuff_WriteOrder(unsigned char ledOrder, unsigned int color)
|
|||
|
{
|
|||
|
unsigned char color_i;
|
|||
|
|
|||
|
// ledOrder = ledOrder-1;
|
|||
|
//<2F>Ȱ<EFBFBD>Ҫ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD>뵽led<65><64>buffer<65><72>
|
|||
|
for(color_i=0;color_i<GRB;color_i++)
|
|||
|
{
|
|||
|
if(color&0x800000)
|
|||
|
{
|
|||
|
gLedBuffer[ledOrder][color_i] = 1;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
gLedBuffer[ledOrder][color_i] = 0;
|
|||
|
}
|
|||
|
color <<= 1;
|
|||
|
}
|
|||
|
}
|
|||
|
/*---------------------------------------------------------------*/
|
|||
|
//ָ<><D6B8>дij<D0B4><C4B3><EFBFBD>Ƶ<EFBFBD>color<6F><72><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>ɫ
|
|||
|
void WS_WriteOrder(unsigned char ledOrder, unsigned int color)
|
|||
|
{
|
|||
|
unsigned char color_i;
|
|||
|
|
|||
|
// ledOrder = ledOrder-1;
|
|||
|
//<2F>Ȱ<EFBFBD>Ҫ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD>뵽led<65><64>buffer<65><72>
|
|||
|
for(color_i=0;color_i<GRB;color_i++)
|
|||
|
{
|
|||
|
if(color&0x800000)
|
|||
|
{
|
|||
|
gLedBuffer[ledOrder][color_i] = 1;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
gLedBuffer[ledOrder][color_i] = 0;
|
|||
|
}
|
|||
|
color <<= 1;
|
|||
|
}
|
|||
|
WS_Show(); //<2F><><EFBFBD><EFBFBD>
|
|||
|
}
|
|||
|
/*---------------------------------------------------------------*/
|
|||
|
//-<2D><>ǰnum<75><6D>ledд<64><D0B4>color,<2C><><EFBFBD><EFBFBD>show
|
|||
|
void LedBuff_WriteNum(unsigned char numLed,unsigned int color)
|
|||
|
{
|
|||
|
unsigned char led_i,color_i; //<2F><><EFBFBD><EFBFBD>forѭ<72><D1AD>
|
|||
|
unsigned int color_temp;
|
|||
|
|
|||
|
for(led_i=0;led_i<numLed;led_i++)
|
|||
|
{
|
|||
|
color_temp = color;
|
|||
|
for(color_i=0;color_i<GRB;color_i++)
|
|||
|
{
|
|||
|
if(color_temp&0x800000)
|
|||
|
{
|
|||
|
gLedBuffer[led_i][color_i] = 1;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
gLedBuffer[led_i][color_i] = 0;
|
|||
|
}
|
|||
|
color_temp <<= 1;
|
|||
|
}
|
|||
|
}
|
|||
|
color_temp <<= 1;
|
|||
|
}
|
|||
|
/*---------------------------------------------------------------*/
|
|||
|
//--<2D><>ǰnum<75><6D>ledд<64><D0B4>color <20><><EFBFBD><EFBFBD>ʾ
|
|||
|
void WS_WriteNum(unsigned char numLed, unsigned int color)
|
|||
|
{
|
|||
|
unsigned char led_i,color_i;
|
|||
|
unsigned int color_temp;
|
|||
|
|
|||
|
//<2F>Ȱ<EFBFBD>Ҫ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD>뵽led<65><64>buffer<65><72>
|
|||
|
for(led_i=0;led_i<numLed;led_i++)
|
|||
|
{
|
|||
|
color_temp = color;
|
|||
|
for(color_i=0;color_i<GRB;color_i++)
|
|||
|
{
|
|||
|
if(color_temp&0x800000)
|
|||
|
{
|
|||
|
gLedBuffer[led_i][color_i] = 1;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
gLedBuffer[led_i][color_i] = 0;
|
|||
|
}
|
|||
|
color_temp <<= 1;
|
|||
|
}
|
|||
|
}
|
|||
|
WS_Show(); //<2F><><EFBFBD><EFBFBD>
|
|||
|
}
|
|||
|
/*---------------------------------------------------------------*/
|
|||
|
//WS<57><53><EFBFBD><EFBFBD>IO<49>ڳ<EFBFBD>ʼ<EFBFBD><CABC>
|
|||
|
static void WS_Port_Init(void)
|
|||
|
{
|
|||
|
PIN_Set_GPIO(U32BIT(WS_DIN_PIN) | U32BIT(WS_EN_PIN),PIN_SEL_GPIO); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ó<EFBFBD><C3B3><EFBFBD>ͨIO<49><4F>
|
|||
|
GPIO_Set_Output(U32BIT(WS_DIN_PIN) | U32BIT(WS_EN_PIN)); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ģʽ
|
|||
|
GPIO_Pin_Clear(U32BIT(WS_DIN_PIN)|U32BIT(WS_EN_PIN)); //WS<57><53><EFBFBD><EFBFBD>IO<49><4F>ʹ<EFBFBD><CAB9>IO<49><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
}
|
|||
|
/*---------------------------------------------------------------*/
|
|||
|
//<2F>ƴ<EFBFBD><C6B4><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
|
|||
|
void WS_Show(void)
|
|||
|
{
|
|||
|
unsigned led_i, color_i;
|
|||
|
|
|||
|
WS_Power(ENABLE);
|
|||
|
|
|||
|
__disable_irq(); //<2F>ر<EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD>жϣ<D0B6><CFA3><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD>ϣ<EFBFBD>
|
|||
|
//<2F><><EFBFBD><EFBFBD>д10<31><30><EFBFBD><EFBFBD>
|
|||
|
for(led_i=0; led_i<LED_NUM; led_i++)
|
|||
|
{
|
|||
|
//<2F><><EFBFBD><EFBFBD>д<EFBFBD><D0B4>ÿ<EFBFBD><C3BF><EFBFBD>Ƶ<EFBFBD>24bitʱ<74><CAB1>
|
|||
|
for(color_i=0;color_i<GRB;color_i++)
|
|||
|
{
|
|||
|
if(gLedBuffer[led_i][color_i] != 0) //д<><D0B4>
|
|||
|
{
|
|||
|
WS_Write_1();
|
|||
|
}
|
|||
|
else //д<><D0B4>
|
|||
|
{
|
|||
|
WS_Write_0();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
WS_DIN_Clear();
|
|||
|
delay_us(300); //ʵ<><CAB5>֤<EFBFBD><D6A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>20us<75><73><EFBFBD><EFBFBD>
|
|||
|
__enable_irq(); //<2F><><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD>ж<EFBFBD>
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/*---------------------------------------------------------------*/
|
|||
|
//<2F>ƴ<EFBFBD><C6B4><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><F3B2BBB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
|||
|
void WS_Show_Disable_irq(void)
|
|||
|
{
|
|||
|
unsigned led_i, color_i;
|
|||
|
|
|||
|
WS_Power(ENABLE);
|
|||
|
|
|||
|
__disable_irq(); //<2F>ر<EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD>жϣ<D0B6><CFA3><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD>ϣ<EFBFBD>
|
|||
|
//<2F><><EFBFBD><EFBFBD>д10<31><30><EFBFBD><EFBFBD>
|
|||
|
for(led_i=0; led_i<LED_NUM; led_i++)
|
|||
|
{
|
|||
|
//<2F><><EFBFBD><EFBFBD>д<EFBFBD><D0B4>ÿ<EFBFBD><C3BF><EFBFBD>Ƶ<EFBFBD>24bitʱ<74><CAB1>
|
|||
|
for(color_i=0;color_i<GRB;color_i++)
|
|||
|
{
|
|||
|
if(gLedBuffer[led_i][color_i] != 0) //д<><D0B4>
|
|||
|
{
|
|||
|
WS_Write_1();
|
|||
|
}
|
|||
|
else //д<><D0B4>
|
|||
|
{
|
|||
|
WS_Write_0();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
WS_DIN_Clear();
|
|||
|
delay_us(300); //ʵ<><CAB5>֤<EFBFBD><D6A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>20us<75><73><EFBFBD><EFBFBD>
|
|||
|
}
|
|||
|
/*---------------------------------------------------------------*/
|
|||
|
//WS<57><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
static void WS_DIN_Clear(void)
|
|||
|
{
|
|||
|
GPIO_Set_Output(U32BIT(WS_DIN_PIN));
|
|||
|
GPIO_Pin_Clear(U32BIT(WS_DIN_PIN));
|
|||
|
}
|
|||
|
/*---------------------------------------------------------------*/
|
|||
|
//дbit_0
|
|||
|
static void WS_Write_0(void)
|
|||
|
{
|
|||
|
WS_DIN_HIGH;
|
|||
|
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
|
|||
|
WS_DIN_LOW;
|
|||
|
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
|
|||
|
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
|
|||
|
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
|
|||
|
}
|
|||
|
/*---------------------------------------------------------------*/
|
|||
|
//дbit_1
|
|||
|
static void WS_Write_1(void)
|
|||
|
{
|
|||
|
WS_DIN_HIGH;
|
|||
|
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
|
|||
|
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
|
|||
|
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
|
|||
|
WS_DIN_LOW;
|
|||
|
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
|
|||
|
}
|
|||
|
/*---------------------------------------------------------------*/
|