RBG软灯带是,等灯饰配件中常见的负载。一般作为背景灯装饰,以及护栏管。程序实现功能,利用墙壁开关,控制RGB灯带,分成4档,第一档:RGB之间实现渐变效果。第二档:R亮,第三档,B亮,第四档:G亮。当然还有其他很多花样。本程序难点,构造简单实用的RGB渐变函数,第二,如何在渐变中检测交流电掉电。实验器材:PIC12F509一片,RGB灯带一条,RGB控制线路板一块。
程序如下:
#include
__CFIG(0X01A);
#define uchar unsigned char
#define uint unsigned int
#define ME_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 { 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 { 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() { S=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; } else if(num==2) { GP0=0; GP1=1;//红色亮 } else if(num==3) { GP0=0; GP1=0; } } } RGB函数构造比较巧妙,不知道原创者是谁?不想多费唇舌。交流掉电检测才是要说的重点,
GP4=0;
GP4=0;
GP4=1;//蓝色亮
if()
{}
else
{}
格式,开始时,如果GP5口上有低电平出现,对变量key2_time_cnt进行自加,当数值大于1000,(大概是12MS)左右,认为是交流电掉电了,让断电标志key_flag置1 ,当GP5口变为高电平的时候,把key2_time_cnt清零,同时判断断电标志是否有效,如果有效,让分档变量num加1,如果有4种功能那么从0加到3就要归零。此交流检测函数简单实用,可以放在主程序循环中,检测掉电不会漏档。如何在渐变中响应交流检测,就是利用检测函数作为延时的循环主体。这样既可以延时,又可以检测IO口的变化。
-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。
自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。