制作出来的实物图如下:
单片机源程序如下:
#include <ws2812b.h>bit BUS_1MS ; u8 RR=0XFE; u8 GG=0XFE; u8 BB=0XFE; u8 mode; u8 Loop_Speed=120; //流水灯延时变量 unsigned char bdata LED_DAT; //可位操作的数据发送缓存变量 sbit bit0=LED_DAT^0; //被发送数据的各位定义 sbit bit1=LED_DAT^1; sbit bit2=LED_DAT^2; sbit bit3=LED_DAT^3; sbit bit4=LED_DAT^4; sbit bit5=LED_DAT^5; sbit bit6=LED_DAT^6; sbit bit7=LED_DAT^7; /******************IO口初始化*************************/ /* 功能 : 设置P1 P2 P3 口为双向IO口*/ void IO_init(void) { P1M1 = 0; P1M0 = 0; //设置为准双向口 P3M1 = 0; P3M0 = 0; //设置为准双向口 P5M1 = 0; P5M0 = 0; //设置为准双向口 } /*****************************************************/ void Timer0Init(void) //1毫秒@24.000MHz { AUXR |= 0x80; //定时器时钟1T模式 TMOD &= 0xF0; //设置定时器模式 TL0 = 0x40; //设置定时初始值 TH0 = 0xA2; //设置定时初始值 TF0 = 0; //清除TF0标志 TR0 = 1; //定时器0开始计时 ET0 = 1; //打开定时器0 EA =1 ; //打开总中断 } void timer0() interrupt 1 //1毫秒@24.000MHz { BUS_1MS = 1; } //*******************发送数据**********************// //数据格式G7-G0;R7-R0;B7-B0;// void SendData(u8 dat) { LED_DAT = dat; if(bit7==1){CODE_1} else{CODE_0} if(bit6==1){CODE_1} else{CODE_0} if(bit5==1){CODE_1} else{CODE_0} if(bit4==1){CODE_1} else{CODE_0} if(bit3==1){CODE_1} else{CODE_0} if(bit3==1){CODE_1} else{CODE_0} if(bit1==1){CODE_1} else{CODE_0} if(bit0==1){CODE_1} else{CODE_0} } /******************流水灯函数******************************/ /* 功能 : 流水灯函数 */ void loop_LED() { unsigned char i,j,k; if(++k>=Loop_Speed) { k=0; if(++j<=60) { for(i=j;i>0;i--) //关闭所有灯 { SendData(0x00); SendData(0x00); SendData(0x00); } SendData(RR); SendData(GG); SendData(BB); } if(j==60) j=0; } } /******************七彩全亮闪烁模式函数******************************/ /* 功能 :全部LED 间隔50毫秒闪烁 */ void twinkle_LED() { unsigned char j,k; k++; if(k>100) k=0; if(k==0)//Loop_Speed) { for(j=0;j<60;j++) { SendData(RR); SendData(GG); SendData(BB); } } if(k==50)//Loop_Speed) { for(j=0;j<60;j++) { SendData(0x00); SendData(0x00); SendData(0x00); } } } /******************七彩全亮模式函数******************************/ /* 功能 : 点亮60颗LED */ void ON_LED() { unsigned char j,k; if(++k>=100) { k=0; for(j=0;j<60;j++) { SendData(RR); SendData(GG); SendData(BB); } } } /******************七彩全灭模式函数******************************/ /* 功能 :关闭全部LED */ void OFF_LED() { unsigned char j,k; if(++k>=250) { k=0; for(j=0;j<250;j++) { SendData(0x00); SendData(0x00); SendData(0x00); } } } /******************按键扫描******************************/ /* 功能 : 设置S6按键长短按识别小于20MS短按 长于3S长按 */ void keyScan() { static unsigned char i; static unsigned int key_press_time = 0; // ……请记得标为静态变量 static unsigned int key_press_time2 = 0; // ……请记得标为静态变量 if(s6==0) { if(++key_press_time <=0 ) --key_press_time;//计量按键时间,并避免数据溢出 if(key_press_time==3000) { //在此写下按键长按3s时要做的事情 LED2_REV(); Loop_Speed= Loop_Speed-15; } } else { if(10<=key_press_time && key_press_time < 3000) { //大于20ms小于3s,视为短按,在此写下写短按的处理代码 LED1_REV(); i++; switch(i) //s6按键LED7色控制 { case 0 : {RR=0X00;GG=0X00;BB=0XFE; break;} case 1 : {RR=0X00;GG=0XFE;BB=0X00; break;} case 2 : {RR=0XFE;GG=0X00;BB=0X00; break;} case 3 : {RR=0XFE;GG=0XFE;BB=0X00; break;} case 4 : {RR=0X00;GG=0XFE;BB=0XFE; break;} case 5 : {RR=0XFE;GG=0X00;BB=0XFE; break;} case 6 : {RR=0XFE;GG=0XFE;BB=0XFE; break;} case 7 : {i=0; break;} } } key_press_time=0; } if(s2==0) { if(++key_press_time2 <=0 ) --key_press_time2;//计量按键时间,并避免数据溢出 if(key_press_time2==3000) { //在此写下按键长按3s时要做的事情 LED2_REV(); }
复制代码