单片机用一个 IO 口采集多个按键信号方案
原理
多个按键通过不同阻值的电阻连接到一个 ADC 输入口。
例如:
VCC | R1 | +------ ADC_IO | 按键1 | GND VCC | R2 | +------ ADC_IO | 按键2 | GND
不同按键按下后,ADC 读取不同电压。
例如:
| 按键 | 电阻 | ADC电压 |
|---|---|---|
| 无按键 | - | 3.3V |
| KEY1 | 1K | 0.3V |
| KEY2 | 2.2K | 0.8V |
| KEY3 | 4.7K | 1.4V |
| KEY4 | 10K | 2.2V |
软件判断 ADC 值即可。
软件判断
例如 STM32 12bit ADC:
ADC范围:0~4095 KEY1: 0~400 KEY2: 600~1000 KEY3: 1200~1800 KEY4: 2200~2800
程序:
uint16_t adc;adc = HAL_ADC_GetValue(&hadc1);if(adc < 400)
{ KEY1();
}else if(adc < 1000)
{ KEY2();
}else if(adc < 1800)
{ KEY3();
}else if(adc < 2800)
{ KEY4();
}优点
✅ 一个 IO 可以接几十个按键
✅ 成本低
✅ PCB简单
✅ 常用于产品量产
缺点:
❌ 必须使用 ADC
❌ 同时按多个键无法准确识别
方案二:矩阵键盘扫描(节省 IO)
例如 4×4 键盘:
C1 C2 C3 C4 R1 □ □ □ □ R2 □ □ □ □ R3 □ □ □ □ R4 □ □ □ □
16个按键:
需要:
4个行IO + 4个列IO =8个IO
扫描:
拉低R1 读取C1-C4 拉低R2 读取C1-C4 ...
优点:
✅ 可以检测多个按键
✅ 适合键盘
缺点:
❌ 需要多个 IO
方案三:电容触摸方式
利用触摸芯片:
例如:
TTP223
AT42QT
STM32 Touch
一个芯片可以管理多个触摸按键。
优点:
✅ 无机械按键寿命问题
缺点:
❌ 成本高一些
方案四:外部按键检测芯片
例如:
I2C按键扩展
按键 | PCF8574 | I2C | MCU
一个 I2C:
SCL SDA
可以扩展几十个按键。
常用:
PCF8574
MCP23017
TCA9535
方案五:电阻编码 + 普通 IO(无 ADC)
利用不同时间/脉冲编码:
例如:
按键:
KEY1 → 输出1个脉冲 KEY2 → 输出2个脉冲 KEY3 → 输出3个脉冲
MCU计数判断。
应用较少。
实际产品推荐
| 需求 | 推荐方案 |
|---|---|
| 4~20个按键 | ADC电阻分压 |
| 几十个按键 | 矩阵扫描 |
| 面板按键 | 触摸 |
| 工业设备 | I2C扩展 |
| 成本最低 | ADC按键 |
ADC按键设计注意事项
1. 电阻不要差距太小
例如:
不好:
1K 1.2K 1.5K
ADC容易误判。
推荐:
1K 2.2K 4.7K 10K 22K
采用倍增关系。
2. 增加滤波
ADC输入:
10K VKEY ----/\/\/---- ADC | 100nF | GND
可以减少按键抖动。
3. 留足电压间隔
例如3.3V系统:
不要设计:
KEY1 = 1.20V KEY2 = 1.25V
建议:
至少:
300~500mV
间隔。
一个实际 8 键方案
3.3V | 10K | +------ ADC | +--KEY1--1K--GND | +--KEY2--2.2K--GND | +--KEY3--4.7K--GND | +--KEY4--10K--GND | +--KEY5--22K--GND
一个 ADC:
可以识别:
5~20个按键。
对于 STM32、AVR、PIC、8051 等单片机,ADC电阻分压按键是最经典、成本最低、量产最多的方案。如果是工业控制板,我一般推荐 ADC按键 + 软件滤波 + 长按/短按状态机,可靠性最高。


售前客服