如何使用CD4067BE多路复用器库实现多按键接入读取
CD74HC4067多路复用器接多按键解决方案
你当前的代码仅固定读取通道0的输入,只能检测1个按键的状态,要对接多个按键可按以下方案调整:
硬件确认
- 每个按键一端接CD4067的CH0~CHn通道引脚,另一端统一接GND
- CD4067的控制引脚S0~S3已正确接Arduino的2、3、4、5号引脚,公共引脚接Arduino的6号引脚,供电引脚正常接5V和GND
代码修改说明
- 遍历所有接入按键的通道,切换通道后加短延迟保证信号稳定
- 增加按键消抖逻辑,避免机械按键误触发
- 支持自定义接入按键的数量,无需遍历全部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
相关产品推荐
相关产品推荐

