设计一个程序,实现按不同的按钮,控制LED以不同频率闪烁的功能。
#define LED1 13
#define s1 0
#define s2 35
#define s3 34
int led_time=0;//led灯时间变量
unsigned char led_keynum=0;//led灯按键值
bool led_state=0;//led灯状态变量
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED1, OUTPUT);//设置LED管脚的模式 为输出
digitalWrite(LED1, HIGH);//设置LED1灯最开始的状态熄灭
pinMode(s1, INPUT);//设置按键管脚的模式 为输入
pinMode(s2, INPUT);
pinMode(s3, INPUT);
}
// the loop function runs over and over again forever
void loop() {
if(digitalRead(s1)==0 ||digitalRead(s2)==0 ||digitalRead(s3)==0)//判断是否有按键按下
{
//空运算
}
delay(9);//延迟9ms
if(digitalRead(s1)==0 ||digitalRead(s2)==0 ||digitalRead(s3)==0)//再次判断是否有按键按下
{
if(digitalRead(s1)==0)//s1按下
{
led_keynum=1;//赋予键值
led_time=100;//闪烁的时间
}
if(digitalRead(s2)==0)//s2按下
{
led_time=50;//闪烁的时间
led_keynum=2;//赋予键值
}
if(digitalRead(s3)==0)//s2按下
{
led_time=25;//闪烁的时间
led_keynum=4;//赋予键值
}
}
if(led_time>0)//判断是否有赋予了闪烁的时间
{
led_time--;//每9ms减一下,因为程序执行也需要时间,留1ms当作给程序执行的时间
if(led_time==0)//走到0
{
led_state=!led_state;//状态反转
led_time=100/led_keynum;//按键1是1s闪烁 按键2是0.5s 按键3是0.25s
digitalWrite(LED1, led_state?HIGH:LOW);//设置LED1灯点亮或熄灭
}
}
}
这个程序和以往的程序不同,以往我们要让LED灯闪烁1s,我们需要先将LED管脚电压改变,然后再进行delay(1000)【延迟一秒】,然后该将LED管脚电压改变,再延迟一秒,然后放在loop函数里面,但是这个程序我们需要很快的判断到按键按下这个时刻,而我们的delay函数是一个阻塞的函数,在没有用到中断时,我们按下按键在很长的阻塞延迟下,是很难被判断到的,所以我们需要做一个非阻塞延迟的程序,或者说尽可能避免长时间的delay,所以可以用按键消抖的delay作为一个闪烁时间的一个单位时间,然后在这个基础上进行程序的循环,这样子在loop函数中,每次执行一个,因为我们的代码执行需要时间,所以这里我给了1ms执行时间,把delay改成9ms,近似可以看成10ms总的时长。