RBG軟燈帶是,等燈飾配件中常見的負載。一般作為背景燈裝飾,以及護欄管。程序實現功能,利用墻壁開關,控制RGB燈帶,分成4檔,第一檔:RGB之間實現漸變效果。第二檔:R亮,第三檔,B亮,第四檔:G亮。當然還有其他很多花樣。本程序難點,構造簡單實用的RGB漸變函數,第二,如何在漸變中檢測交流電掉電。實驗器材:PIC12F509一片,RGB燈帶一條,RGB控制線路板一塊。
程序如下:
#include<pic.h>
__CONFIG(0X01A);
#define uchar unsigned char
#define uint unsigned int
#define TIME_MAX 1000
uint key2_time_cnt;//按鍵去抖計數器
uchar num;
uchar key_flag;
uint PWM;
uint a,c;
uchar i,p,num,f,k;
uint r,g,b;
void delay(uint x)
{
uint c,d;
for(c=x;c>0;c--)
for(d=110;d>0;d--);
}
void timer1(uint t)
{
uint n;
for(n=0;n<t;n++)
{
if(GP5==0)//
{
key2_time_cnt++;
if(key2_time_cnt==TIME_MAX)
{
key_flag=1;
}
}
else
{
key2_time_cnt=0;
if(key_flag==1)
{
key_flag=0;
num=1;
}
}
}
}
void timer2(uint t)
{
uint n;
for(n=0;n<t;n++)
{
if(GP5==0)//
{
key2_time_cnt++;
if(key2_time_cnt==TIME_MAX)
{
key_flag=1;
}
}
else
{
key2_time_cnt=0;
if(key_flag==1)
{
key_flag=0;
num=3;
}
}
}
}
void led1_on()
{
GP0=1;
if(g!=0&&b==5)
{
g--;
r++;
}
if(r!=0&&g==5)
{
r--;
b++;
}
if(b!=0&&r==5)
{
b--;
g++;
}
if(g+r+b!=50)
{
g=40;
r=5;
b=5;
}
for(a=0;a<30;a++)
{
if(g!=0) //綠色漸變
{
GP1=0;
timer1(g);
GP1=1;
}
if(r!=0) //紅色漸變
{
GP2=0;
timer1(r);
GP2=1;
}
if(b!=0) //藍色漸變
{
GP4=0;
timer1(b);
GP4=1;
}
}
}
void key_scan()
{
if(GP5==0)//按鍵按下
{
key2_time_cnt++;
if(key2_time_cnt==TIME_MAX)
{
key_flag=1;
}
}
else
{
key2_time_cnt=0;
if(key_flag==1)
{
key_flag=0;
num++;
if(num>3)num=0;
}
}
}
void main()
{
TRIS=0b00110000;
GP0=1;
GP1=0;
GP2=0;
g=40;
r=5;
b=5;
while(1)
{
key_scan();
if(num==0)
{
led1_on();
}
else if(num==1)
{
GP0=1;//綠色亮
GP1=0;
GP4=0;
}
else if(num==2)
{
GP0=0;
GP1=1;//紅色亮
GP4=0;
}
else if(num==3)
{
GP0=0;
GP1=0;
GP4=1;//藍色亮
}
}
}
RGB函數構造比較巧妙,不知道原創者是誰?不想多費唇舌。交流掉電檢測才是要說的重點,
if()
{}
else
{}
格式,開始時,如果GP5口上有低電平出現,對變量key2_time_cnt進行自加,當數值大于1000,(大概是12MS)左右,認為是交流電掉電了,讓斷電標志key_flag置1 ,當GP5口變為高電平的時候,把key2_time_cnt清零,同時判斷斷電標志是否有效,如果有效,讓分檔變量num加1,如果有4種功能那么從0加到3就要歸零。此交流檢測函數簡單實用,可以放在主程序循環中,檢測掉電不會漏檔。如何在漸變中響應交流檢測,就是利用檢測函數作為延時的循環主體。這樣既可以延時,又可以檢測IO口的變化。