PASII/CandeII_1.4/Hardware/ws2812.c

263 lines
6.9 KiB
C
Raw Normal View History

/*****************************************************************
;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();
}
/*---------------------------------------------------------------*/