项目中用到的ws2811炫彩灯控制程序

WS2811.H

////////////////////////////////////////////////////////////////////////////
//控制灯指令如下
void h_dat1();
void h_dat0();
extern void delay_ms(unsigned char ms);
extern void delay_us(unsigned long int us);
void Reset(void);
void send_single_data();
 void RGB_PWM();
 void RGB_open();
 void Clock_Init();
 void RGB_ALARM();
 void ledlight(void);
/////////////////////////////////////////////////////////////////////////////



WS2811.C

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//=============低速模式数码BIT0(高电平时间:350ns 低电平时间:800ns )=============//
void h_dat0()

  P2OUT|=PWM_WS;////////////////////////////////////////////////////////////////////----yxn
  P2OUT&=~PWM_WS; 
   SomeNOP();
   //_NOP();
}
void h_dat1()

   P2OUT&=~PWM_WS;////////////////////////////////////////////////////////////////////----yxn
   P2OUT|=PWM_WS;
  SomeNOP();
  //_NOP();
  
}
//RGB显示控制程序=======================================================================
void Reset(void)
{
    P2OUT&=~PWM_WS;////////////////////////////////////////////////////////////////////----yxn
    delay_ms(1);
}
//===================发送RGB灰度数据===================
void send_single_data()  //数据格式:G7~G0~R7~R0~B7~B0
{
 
LED_DAT=GG;
if((LED_DAT&0x80)==0x80) h_dat1(); else h_dat0(); ////////////以前的程序全部修改此处
if((LED_DAT&0x40)==0x40) h_dat1(); else h_dat0();
if((LED_DAT&0x20)==0x20) h_dat1(); else h_dat0();
if((LED_DAT&0x10)==0x10) h_dat1(); else h_dat0();
if((LED_DAT&0x08)==0x08) h_dat1(); else h_dat0();
if((LED_DAT&0x04)==0x04) h_dat1(); else h_dat0();
if((LED_DAT&0x02)==0x02) h_dat1(); else h_dat0();
if((LED_DAT&0x01)==0x01) h_dat1(); else h_dat0();
LED_DAT=RR;
if((LED_DAT&0x80)==0x80) h_dat1(); else h_dat0();
if((LED_DAT&0x40)==0x40) h_dat1(); else h_dat0();
if((LED_DAT&0x20)==0x20) h_dat1(); else h_dat0();
if((LED_DAT&0x10)==0x10) h_dat1(); else h_dat0();
if((LED_DAT&0x08)==0x08) h_dat1(); else h_dat0();
if((LED_DAT&0x04)==0x04) h_dat1(); else h_dat0();
if((LED_DAT&0x02)==0x02) h_dat1(); else h_dat0();
if((LED_DAT&0x01)==0x01) h_dat1(); else h_dat0();
LED_DAT=BB;
if((LED_DAT&0x80)==0x80) h_dat1(); else h_dat0();
if((LED_DAT&0x40)==0x40) h_dat1(); else h_dat0();
if((LED_DAT&0x20)==0x20) h_dat1(); else h_dat0();
if((LED_DAT&0x10)==0x10) h_dat1(); else h_dat0();
if((LED_DAT&0x08)==0x08) h_dat1(); else h_dat0();
if((LED_DAT&0x04)==0x04) h_dat1(); else h_dat0();
if((LED_DAT&0x02)==0x02) h_dat1(); else h_dat0();
if((LED_DAT&0x01)==0x01) h_dat1(); else h_dat0();
}
void send_string_data()
{
 
uchar i;
for(i=0;i<size;i++)
{
 
send_single_data();
 
}
   Reset();
 
}
void RGB_open() //RGB长亮
{
send_string_data();
}


//=======================RGB呼吸灯=======================//
void RGB_PWM()
{
uint i;
//RR=255; GG=0; BB=0;
send_string_data(); //发送RGB灰度数据
for(i=0; i<256; i++) 
{
//P1OUT |= 0x02;////////////////////////////////////////////////////////////////待改动
delay_us(i*50);
//P1OUT &= ~0x02;////////////////////////////////////////////////////////////待改动
delay_us((256-i)*50);
}


for(i=256; i>0; i--)
{
//P1OUT |= 0x02;////////////////////////////////////////////////////////////////////待改动
delay_us(i*50);
//P1OUT &= ~0x02;////////////////////////////////////////////////////////////////////待改动
delay_us((256-i)*50);
}


}
void RGB_ALARM()
{
 
RR=0; GG=0; BB=0;
send_string_data(); //发送RGB灰度数据
delay_ms(100);
RR=255; GG=0; BB=0;
send_string_data(); //发送RGB灰度数据
delay_ms(100);
}
//ms延时函数
void delay_ms(unsigned char ms)
{
    delay_us(1000*ms);
}
//us延时函数
void delay_us(unsigned long int us)
{
   unsigned long int j;
   for (j = 25*us; j> 0; j--) ;

}

控制中一定要注意时序的控制应当非常精确,最好用示波器观察0码和1码的具体数值




展开阅读全文

没有更多推荐了,返回首页