You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用CD4067BE多路复用器库实现多按键接入读取

CD74HC4067多路复用器接多按键解决方案

你当前的代码仅固定读取通道0的输入,只能检测1个按键的状态,要对接多个按键可按以下方案调整:

硬件确认

  • 每个按键一端接CD4067的CH0~CHn通道引脚,另一端统一接GND
  • CD4067的控制引脚S0~S3已正确接Arduino的2、3、4、5号引脚,公共引脚接Arduino的6号引脚,供电引脚正常接5V和GND

代码修改说明

  1. 遍历所有接入按键的通道,切换通道后加短延迟保证信号稳定
  2. 增加按键消抖逻辑,避免机械按键误触发
  3. 支持自定义接入按键的数量,无需遍历全部16个通道节省资源

调整后完整代码

#include <CD74HC4067.h>

// S0 S1 S2 S3控制引脚对应Arduino 2、3、4、5号
CD74HC4067 my_mux(2, 3, 4, 5);
// 公共引脚接6号
const byte g_common_pin = 6;
// 测试用LED引脚
const byte ledPin = 7;
// 接入的按键总数,可根据实际接线调整,最多支持16个
const int KEY_COUNT = 12;
// 按键消抖延迟(毫秒)
const int DEBOUNCE_DELAY = 20;

void setup() {
  Serial.begin(9600);
  // 公共引脚用上拉输入,按键按下时为低电平
  pinMode(g_common_pin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
}

void loop() {
  // 遍历所有接了按键的通道
  for (int channel = 0; channel < KEY_COUNT; channel++) {
    // 切换到当前通道
    my_mux.channel(channel);
    // 等待信号稳定
    delayMicroseconds(100);
    
    // 读取当前通道按键状态
    if (digitalRead(g_common_pin) == LOW) {
      // 消抖判断:延迟后再次确认电平还是低,说明按键确实按下
      delay(DEBOUNCE_DELAY);
      if (digitalRead(g_common_pin) == LOW) {
        // 按下后的逻辑,这里示例打印通道号、点亮LED
        Serial.print("按键按下,通道号:");
        Serial.println(channel);
        digitalWrite(ledPin, HIGH);
        // 等待按键松开,避免重复触发,可根据需求调整
        while (digitalRead(g_common_pin) == LOW);
      }
    } else {
      digitalWrite(ledPin, LOW);
    }
  }
}

使用说明

  • 如需修改按键数量,直接调整KEY_COUNT的数值即可,最多支持16个独立按键
  • 消抖延迟可根据实际按键的手感调整,一般10~30ms都符合使用要求
  • 不需要串口打印的话可删除Serial相关代码,降低单片机资源占用

内容的提问来源于stack exchange,提问作者Austin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 13:36:10