0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

用一条IO口实现两个按键功能

聚丰开发 2018-10-24 11:24 次阅读

注:本文是作者以前发表在其个人博客,现在发布到“聚丰开发”专栏



之前去到一个朋友那里,提到现在客户对成本要求非常之高,尤其是玩具行业,已经是一分一厘的去计算产品成本。朋友感慨为了省成本,方案商是绞尽脑汁地去想各种实现方法,说遇到过为了节省成本,硬是用单片机一条IO实现了两个按键的功能,让他颇为诧异,好久都没想明白原理。


一条IO实现两个按键,听上去确实挺新奇,既然别人能够实现,我想我也应该可以做到,看来得找找实现的方法。我有一个习惯,遇到某些问题的时候,会在睡觉前想解决方法,想着想着就会睡着了,问题的答案有没有找到则不一定。



我知道有用一条IO实现多个按键的方法,这样的方法大多是选用的IO支持ADC功能,用电阻分压后通过读电压判断键值。如果IO不支持ADC功能,也不是不行,可以用电容充放电的方法实现ADC,从而用普通IO间接进行测量。(参见我之前关于键盘扫描的文章)

这样用一条IO实现两个按键给我的第一感觉是可能需要利用到电容充放电原理,于是在半梦半醒之中找到了实现的方法。



先看上图左边部分,如果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同时按下并不能进行识别判断。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6036

    文章

    44555

    浏览量

    634883
收藏 人收藏

    评论

    相关推荐

    使用片TLV320ADC3101芯片接到同一条i2s总线上,能实现音频数据的同时采集吗?

    我想 请问下,使用片TLV320ADC3101芯片接到同 一条 i2s总线上,能实现音频数据的同时采集吗?目前只实现
    发表于 10-24 07:03

    想使用typec接口实现数据与音频体的功能,有推荐的芯片吗?

    目前我们产品有路音频模拟信号,路usb信号,现在想使用typec接口实现数据与音频体的功能,想问下ti有这方面的芯片吗
    发表于 10-22 06:39

    双稳态电路的两个稳定状态是什么

    两个不同的状态之。这两个状态通常被称为“高电平”和“低电平”,或者“0”和“1”。当外部输入信号作用于双稳态电路时,电路可以从稳定状态
    的头像 发表于 08-11 15:00 1361次阅读

    迟滞比较器的输出为一条直线的原因

    ,如果迟滞比较器的输出为一条直线,这可能是由于多种原因造成的。 迟滞比较器的工作原理 在讨论迟滞比较器输出为一条直线的原因之前,我们首先需要了解其工作原理。迟滞比较器通常由运算放大
    的头像 发表于 07-11 09:36 851次阅读

    CW32数字电压电流表软件教程-实验二:按键检测

    3.1.独立按键基础知识 3.1.1.独立按键结构组成 独立按键实际上是非自锁的轻触开关,有左右两个
    的头像 发表于 05-31 15:16 858次阅读
    CW32数字电压电流表软件教程-实验二:<b class='flag-5'>按键</b>检测

    STM32矩阵按键造成IO口的损坏的原因?

    看了网上的4*4矩阵按键,不带外部中断,可实现多个按键同时按下。发现行线都配置成GPIO_Mode_Out_PP推挽输出,我认为当同一个列线上有两个
    发表于 05-17 06:02

    两个STM32的IO口连接到起,其中IO口被烧坏的原因?

    如题:两个STM32的IO口连接到起,单片机IO设置为输出模式(发送数据),另
    发表于 04-24 07:53

    节省IO的小技巧:GD32 MCU如何使用GPIO实现串口半双工收发

    般情况串口的接受和发送分别需要使用TX和RX两个引脚来实现,但在些UART的实际应用中,通信双方身份为主机和从机,数据流是半双工的,那么当IO
    的头像 发表于 03-15 09:39 1871次阅读
    节省<b class='flag-5'>IO</b>的小技巧:GD32 MCU如何使用<b class='flag-5'>一</b><b class='flag-5'>个</b>GPIO<b class='flag-5'>实现</b>串口半双工收发

    arcgis中如何关联两个属性表

    在ArcGIS中,关联两个属性表是重要的操作,可以通过此操作将两个表中的数据关联起来,以便进行分析和查询。下面是详细介绍如何在ArcGIS中实现
    的头像 发表于 02-25 11:01 4203次阅读

    USB使用两条CC线,是否可以在任何CC线路上的2PD源之间进行选择?

    我知道USB PD通常只使用一条CC线,但是如果使用两条CC线,是否可以在者之间切换并发送数据包或决定连接到哪一条,同时存在两个Rd下拉?
    发表于 02-23 08:05

    没有电位器,两个按钮可以实现变频器调速吗?

    没有电位器,两个按钮可以实现变频器调速吗? 变频器是种广泛应用于电机调速的设备,它能够调节电机的转速,提高电机的效率,并且降低能耗。电位器是变频器调速中常用的组件,但是在某些情况下
    的头像 发表于 02-18 16:55 1784次阅读

    两个电位器地控制变频器,如何接线?

    两个电位器地控制变频器,如何接线? 接线方式如下: 1. 首先,明确需要使用的电器设备。在这个场景中,我们需要两个电位器(即可变电阻器
    的头像 发表于 02-05 10:13 5244次阅读

    想用TC275控制两个永磁电机,GPT12能不能实现两个QEP功能

    想用TC275控制两个永磁电机,不知道GPT12能不能实现两个QEP功能,供路电机使用
    发表于 02-05 07:14

    UCB_SWAP配置信息共16,写入一条有效配置后,上一条需写1使配置无效是为什么?

    死锁。 综上,UCB_SWAP写入一条有效配置后,上一条需写1使配置无效具体作用是什么。 有了解该功能大佬帮忙解释下,感谢! Infineon-AURIX_TC3xx_Part1-UserManual-v02_00-EN.pdf
    发表于 01-24 08:31

    面朝欧洲,迈上“云桥”,走一条无忧丝路

    在云桥上走一条无忧丝路,去到欧罗巴的春天
    的头像 发表于 01-10 09:44 1356次阅读
    面朝欧洲,迈上“云桥”,走<b class='flag-5'>一条</b>无忧丝路