[MM32硬件] 用一条IO口实现两个按键功能

[复制链接]
 楼主| jtracy3 发表于 2025-7-21 20:37 | 显示全部楼层 |阅读模式
一条IO实现两个按键,听上去确实挺新奇,既然别人能够实现,我想我也应该可以做到,看来得找找实现的方法。我有一个习惯,遇到某些问题的时候,会在睡觉前想解决方法,想着想着就会睡着了,问题的答案有没有找到则不一定。
我知道有用一条IO实现多个按键的方法,这样的方法大多是选用的IO支持ADC功能,用电阻分压后通过读电压判断键值。如果IO不支持ADC功能,也不是不行,可以用电容充放电的方法实现ADC,从而用普通IO间接进行测量。
这样用一条IO实现两个按键给我的第一感觉是可能需要利用到电容充放电原理,于是在半梦半醒之中找到了实现的方法。
6572168737043d8327.png
先看上图左边部分,如果MCU_IO1为双向IO口,假设单片机程序按以下流程处理,看看会得到什么样的结果?
1.MCU_IO1设定为输出,输出高电平一段时间,此时电容C1会充电,最后C1上的电压接近电源电压。
2.MCU_IO1设定为输入,如果J1、J2均不按下,此时MCU_IO1可以理解成一个阻值很大的电阻接地,电容C1上的电荷会通过这个电阻逐渐释放掉,这样C1上的电压会逐渐降低到零。因为C1上的电压下降需要一个过程,当MCU_IO1设为输入后马上读一下MCU_IO1的状态,此时会读到什么结果?显然是高电平状态1。
3.再将MCU_IO1设定为输出,输出低电平一段时间,显然不管电容C1处于什么状态,只要MCU_IO1输出低电平时间足够长,最后C1上的电压应该接近零。
4.再将MCU_IO1设定为输入,如果J1、J2同样不按下,MCU_IO1读到的是低电平状态0。
如果J1按下,再来看看这四步,此时电容C1已经被强制接到电源上,MCU_IO1对其的充放电已经不起作用,在步骤2中MCU_IO1读到的状态依然是1,但在步骤4中MCU_IO1读到的状态就不再是0,而是变为1。
如果J2按下,同样看这四步,此时电容C1被强制接到地,MCU_IO1对其充放电也失去作用,在步骤2中MCU_IO1读到的状态变为0,但在步骤4中MCU_IO1读到的状态保持为1。
到这里我想大家应该已经明白了实现方法,根据此四步中读到的MCU_IO1状态,就可以判断出J1、J2是否按下。
既然已经找到方法,是不是就万事大吉了呢?不然,我们还得回过头去看看此方法是不是足够可靠。如果J1按下,电容C1直接接到电源上,当MCU_IO1输出低时,MCU_IO1输出的低电平直接与电源短路,弄不好就会烧坏MCU_IO1,同理当J2按下时MCU_IO1输出高也存在同样的问题。
还有比这更严重的问题,如果用户同时按下J1和J2,哈!居然是电源和地直接短路,这样的后果很可能就是整个产品的电源部分一股青烟了事,就别想产品还能不能工作了。
不用担心,看一看前面电路图中的右半部分,在开关J3和J4上分别串联了一个220欧的电阻,这个电路不管J3和J4如何按,都不会出现短路的情况,按前面的四个步骤即可判断出J3和J4有没有按下,不过如果J3和J4同时按下并不能进行识别判断。

AdaMaYun 发表于 2025-7-31 17:18 | 显示全部楼层
那io有默认电平的
maudlu 发表于 2025-8-4 10:58 | 显示全部楼层
可以使用ADC              
macpherson 发表于 2025-8-4 14:18 | 显示全部楼层
利用不同按键产生不同电平特征。              
burgessmaggie 发表于 2025-8-4 17:30 | 显示全部楼层
将两个按键分别通过不同阻值的电阻连接到同一IO口,利用不同按键按下时产生的分压差异,通过MCU内置ADC采样电压值来区分按键
1988020566 发表于 2025-8-4 19:01 | 显示全部楼层
单线多键检测              
ingramward 发表于 2025-8-4 21:12 | 显示全部楼层
硬件分压法                      
jackcat 发表于 2025-8-5 08:56 | 显示全部楼层
并联式接法(支持组合按键)或串联式接法(需注意优先级)。
albertaabbot 发表于 2025-8-5 11:34 | 显示全部楼层
通过两个不同阻值的电阻将两个按键并联到IO口,利用分压原理使IO口在按键按下时呈现不同电压,通过ADC读取电压值区分按键。
updownq 发表于 2025-8-5 13:20 | 显示全部楼层
通过不同的电阻值,可以使得按下不同的按键组合在IO口产生不同的电压水平。
cemaj 发表于 2025-8-5 15:33 | 显示全部楼层
ADC方案需校准电阻精度,避免温度漂移影响分压值。
chenqianqian 发表于 2025-8-6 08:42 来自手机 | 显示全部楼层
一个IO口本来就可以表示两种状态
mollylawrence 发表于 2025-8-7 08:36 | 显示全部楼层
按键按下时可能会产生抖动,需要在软件中进行消抖处理
youtome 发表于 2025-8-7 10:50 | 显示全部楼层
阻分压法、二极管组合法、RC充放电法。
alvpeg 发表于 2025-8-7 13:12 | 显示全部楼层
IO 口先配置为输出模式输出高电平,再切换为输入模式检测电平变化:按下不同按键时,因放电路径不同,电平下降速度有差异,通过检测放电时间区分按键。
pentruman 发表于 2025-8-7 15:29 | 显示全部楼层
分压法              
mickit 发表于 2025-8-8 12:09 | 显示全部楼层
一是ADC采样时的电压波动,建议加滤波电容;二是按键抖动问题,软件上必须做消抖;三是如果系统本身有ADC,复用资源最省成本。
sesefadou 发表于 2025-8-8 16:11 | 显示全部楼层
两个按键的分压值差异明显,避免因电阻相近导致电压重叠造成误判
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

1809

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

20

主题

1809

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部