Arduino学习笔记④ 经典按键实验

知识共享许可协议 版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons

1.前言

    我们讲了数字IO口介绍以及做了流水灯演示(主要用到IO口的输出功能),这节课我们讲解一下IO口的输入功能,说到输入功能,最经典的例子莫过于按键实验。废话少说,赶紧上车。

2.实验材料

  • 按键模块

image

  • LED模块(这里属于共阳极LED模块)

image

  • Mega2560板子
    注意:这课实验是基于第三课实验材料进行的。

3.实验内容

3.1 按键实验1

实验内容:
当按住按键时点亮LED,当放开按键后熄灭LED;

实验代码:

/**
* @Desc 按键灯(当按住按键时点亮LED,当放开按键后熄灭LED)
* @author 单片机菜鸟
* @Date  2016/12/3
* 注意:LED的一端接到5V,另外一端接到输出引脚,低电平亮
*       按键是高电平有效
*/
 
#define LED  2
#define KEY  10
 
int buttonState = HIGH;//记录当前按键状态
 
void setup() {
  //配置2号引脚作为输出引脚
   pinMode(LED,OUTPUT);
   digitalWrite(LED,HIGH);//灭掉LED
   //配置10号引脚为输入引脚 如果是自己连接普通按键 pinMode(KEY,INPUT_PULLUP),弱上拉
   pinMode(KEY,INPUT);
}
 
void loop() {
 
  buttonState = digitalRead(KEY);//读取当前按键状态
  if(buttonState == HIGH){
    //按键按下
    digitalWrite(LED,LOW);//点亮LED
  }else{
    //按键放开
    digitalWrite(LED,HIGH);//熄灭LED
  }
  
}

3.2 按键实验2

实验内容:
当点击一次按键时点亮LED,当再次点击一次按键时熄灭LED(就跟家里灯一样)

实验代码:

/**
* @Desc 按键灯(当点击一次按键时点亮LED,当再次点击一次按键时熄灭LED)
* @author 单片机菜鸟
* @Date  2016/12/3
* 注意:LED的一端接到5V,另外一端接到输出引脚,低电平亮
*       按键是高电平有效
*/
 
#define LED  2
#define KEY  10
 
int buttonState = HIGH;//记录当前按键状态
int flag = HIGH;//默认当前灭灯
 
void setup() {
  //配置2号引脚作为输出引脚
   pinMode(LED,OUTPUT);
   digitalWrite(LED,flag);//灭掉LED
   //配置10号引脚为输入引脚 如果是自己连接普通按键 pinMode(KEY,INPUT_PULLUP),弱上拉
   pinMode(KEY,INPUT);
}
 
void loop() {
  buttonState = digitalRead(KEY);//读取当前按键状态
  if(buttonState == HIGH){
    //按键按下
    delay(40);//做一个防抖动延时(确保真是按下了按键而不是错误)
    buttonState = digitalRead(KEY);//再一次读取按键状态
    if(buttonState==HIGH){
      //再次确认是否真的按下了按键,是的话就置反当前灯的状态
      flag = !flag;
      digitalWrite(LED,flag);
    }
  }
}

我的按键模块的实验结果是:偶尔可以,偶尔又不可以,证明只是简单防抖动肯定是不行的。后面经过查资料用以下防抖动方法:

/**
* @Desc 按键灯(当点击一次按键时点亮LED,当再次点击一次按键时熄灭LED)
* @author 单片机菜鸟
* @Date  2016/12/3
* 注意:LED的一端接到5V,另外一端接到输出引脚,低电平亮
*       按键是高电平有效
*/
 
#define LED  2
#define KEY  10
 
int flag = HIGH;//默认当前灭灯
 
// 定义记录按键当前状态的变量
int state_btn;
// 定义记录按键最近一次状态变化的变量,并初始化状态为LOW。
int lastButtonState = LOW;
// 定义记录最近一次抖动的时间变量,并初始化时间为0毫秒。
long lastDebounceTime = 0;
// 定义延迟抖动的时间变量
long debouncdDelay = 60;
 
void setup() {
  //配置2号引脚作为输出引脚
   pinMode(LED,OUTPUT);
   digitalWrite(LED,flag);//灭掉LED
   //配置10号引脚为输入引脚 如果是自己连接普通按键 pinMode(KEY,INPUT_PULLUP),弱上拉
   pinMode(KEY,INPUT);
}
 
void loop() {
  int buttonState = digitalRead(KEY);//读取当前按键状态
 
  if(buttonState != lastButtonState){
     //如果按键发生了变化  则重新设置最近一次抖动的时间
     //方法millis()可以获取当前时间,单位统一为毫秒。
     lastDebounceTime = millis();  
  }
  
  // 判断按键按下状态时间间隔是否大于延迟抖动的时间长度。
  if(millis()-lastDebounceTime>debouncdDelay){
    // 判断当前的按键状态是否和之前有所变化
    if(buttonState != state_btn){
       // 如果发生了变化,
       // 则更新按键状态变量。
       state_btn = buttonState;
       if(state_btn == HIGH){
        //再次确认是否真的按下了按键,是的话就置反当前灯的状态
         flag = !flag;
         digitalWrite(LED,flag);
       }
    }
  }
  // 更新按键最近一次状态变化的变量
     lastButtonState = buttonState;
}

    这里的防抖算法的思路是:
    需要记录一个最近状态 lastButtonState (每读一次引脚状态就记录一次),然后在抖动间隔内(60ms)判断最新状态,只要间隔内状态改变,就不断更新抖动时间的起始点(也就是 lastDebounceTime = millis(); ),直到防抖动满足 millis()-lastDebounceTime>debouncdDelay。之后再判断一下当前状态和之前状态是否改变 buttonState != state_btn (以防用户按太久了)。

4.总结

    这节课我们主要学习数字IO口的输入功能,整体上还算简单,主要是注意按键防抖动。

猜你喜欢

转载自blog.csdn.net/dpjcn1990/article/details/92831392
今日推荐