在学会点亮小灯、按钮控制小灯、按钮控制RGB以后,可以开始学用定时器检测按钮长按从而控制小灯,在只有独立按钮的时候,如何区分单击、双击、跟长按?打个比方,以0.5S为界限,0.5S内按一次按钮算单击,0.5秒之内按两次按钮算双击,长按的话我们以按住按钮两秒作为标准,那怎么做呢?就可以用到定时器来捕捉按键的状态。
一样的,我们也要开启定时器,我这里用的是定时器0(好像定时器1被用作看门狗定时了,忘记了记不太清了😄),250us做一次,后面我们定义一个static unsigned int k=0;K*250us就是我们定时的时间。
#define IRQ_TIMER0_ENABLE 1
#define IRQ_TIME0_INTERVAL 250 //us
然后我们就可以做个简单的测试了,看看你的定时器能不能正常使用,这里是1秒交替闪红光。代码如下:
void shine(void)
{
static unsigned char i;
static unsigned int k;
if(++k>=4000)
{
k=0;
if(i==0)
{
light_adjust_RGB(100,0,0,50);
gpio_write(LED_ON_OFF_Pin,1);
i=1;
}
else if(i==1)
{
gpio_write(LED_ON_OFF_Pin,0);
i=0;
}
}
可以玩的更花一点,开始绿灯一亮一灭(各0.5S),然后亮一秒红灯,再亮一秒红灯,然后回到红灯,循环往复。代码如下:
void test(void)
{
static unsigned int k=0;
static int lum=30;
static int i=0;
if(i==0)
{
gpio_write(LED_ON_OFF_Pin,1);
light_adjust_RGB(0,200,0,lum);
sleep_us(500000);
gpio_write(LED_ON_OFF_Pin,0);
i++;
}
else if(i==1)
{
++k;
if(k>4000&&k<4000*2)
{
gpio_write(LED_ON_OFF_Pin,1);
light_adjust_RGB_hw(255,0,0,lum);
i++;
}
}
else if(i==2)
{
++k;
if(k>40002&&k<4000*3)
{
light_adjust_RGB_hw(0,0,255,lum);
i++;
}
}
else if(i==3)
{
++k;
if(k>4000*3&&k4<000*4)
{
light_adjust_RGB_hw(0,0,0,lum);
k=0;
i=1;
}
}
}
我们把它运用到按钮那里,效果为:初始白光,长按2S后红光,再次长按2S后关闭,循环往复。代码如下:
void long_key(void)
{
static unsigned int k=0;
static int led_state=0;
gpio_write(LED_ON_OFF_Pin,1);
if(gpio_read(KEY_ON_OFF_Pin)==0&&led_state==0)
{
if(++k>8000)
{
light_adjust_RGB_hw(255,0,0,10);
led_state=1;
k=0;
}
}
else if(gpio_read(KEY_ON_OFF_Pin)==0&&led_state==1)
{
if(++k>8000)
{
light_adjust_RGB_hw(0,0,0,10);
led_state=0;
k=0;
}
}
}
至此你已经学会使用定时器啦,快去用它做点新东西吧。下期再见,ヾ(•ω•`)o88!