概念

按键是一种电子开关,使用时轻轻按开关按钮就可使开关接通,当松开手时,开关断开。

按钮有两组引脚(触点)。当按下按钮时,它会连接这两个触点,从而关闭电路。一般来说 4 脚开关(轻触按键)相距较远的是相通的,离得较近的是一组开关,最好是测量一下,如果懒得测,接对角肯定是可以的。下图说明了按钮内部的连接:

2025-01-12T05:31:50.png

使用按键的时候,通常情况下需要进行消抖。

该实验中所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。

按键的抖动对于人类来说是感觉不到的,但对单片机来说,则是完全可以感应到的,而且还是一个很漫长的过程,因为单片机处理的速度在微秒级,而按键抖动的时间至少在毫秒级。

与输出不同的是,设置输入引脚时,我们需要配置上拉或下拉电阻,目的是确定某个状态电路中的高电平或低电平。上、下拉电阻的作用是提高电路稳定性,避免引起误动作。按键如果不通过电阻上拉到高电平,那么在上电瞬间可能就发生误动作,因为在上电瞬间单片机的引脚电平是不确定的,上拉电阻的存在保证了其引脚处于高电平状态,而不会发生误动作。

电路设计

2025-01-12T05:32:34.png

代码

#define LED_PIN     2
#define BUTTON_PIN  14


// 定义 LED 逻辑值
int led_logic = 0;
// 判断 LED 的状态是否改变过
bool status = false;


void setup() {  
  pinMode(LED_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT_PULLDOWN);
}

void loop() {
  // 按键消抖
  if (digitalRead(BUTTON_PIN)) {
    // 睡眠 10ms,如果依然为高电平,说明抖动已消失。
    delay(10);
    if (digitalRead(BUTTON_PIN) && !status) {
      led_logic = !led_logic;
      digitalWrite(LED_PIN, led_logic);
      // led 的状态发生了变化,即使我持续按着按键,LED 的状态也不应该改变。
      status = !status;
      }else if (!digitalRead(BUTTON_PIN)) {
        status = false;  
      }
    }
}

发表评论