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同时按下并不能进行识别判断。

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

    关注

    6078

    文章

    45601

    浏览量

    674204
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    还在抢信道?Wi-Fi 6E直接给你一条“专属高速路”

    Wi-Fi6E的核心,不在“更快”,而在多了一条全新的6GHz频段。简单理解:以前是两条高速路(2.4GHz/5GHz)现在,直接多了一条“几乎没人走的超级高速路”。结果:
    的头像 发表于 04-29 18:03 301次阅读
    还在抢信道?Wi-Fi 6E直接给你<b class='flag-5'>一条</b>“专属高速路”

    翼辉信息工信部“一条龙”应用计划项目成功验收

    近日,翼辉信息牵头承担的工业和信息化部重点产品、工艺“一条龙”应用计划项目顺利通过验收。这标志着我国工业实时操作系统在关键核心技术自主可控及规模化应用方面取得重要进展。
    的头像 发表于 04-28 16:08 220次阅读
    翼辉信息工信部“<b class='flag-5'>一条</b>龙”应用计划项目成功验收

    管理型工业交换机中,被低估的重要功能

    很多网络工程师会遇到同一个问题:一条网线够不够用?一条链路断了怎么办?尤其是在工业场景中,网络旦不稳定,轻则数据延迟,重则业务中断,后果往往不只是“慢
    的头像 发表于 02-04 09:41 267次阅读
    管理型工业交换机中,<b class='flag-5'>一</b><b class='flag-5'>个</b>被低估的重要<b class='flag-5'>功能</b>

    页面导入导出功能怎么?如何快速合并两个工程,复制粘贴注意事项?

    页面导入导出功能怎么?如何快速合并两个工程,复制粘贴注意事项?
    发表于 02-03 14:16

    页面导入导出功能怎么?如何快速合并两个工程,复制粘贴注意事项?

    页面导入导出功能怎么?如何快速合并两个工程,复制粘贴注意事项?
    发表于 01-28 15:17

    使用博图(TIA Portal)监控PROFINET从站通讯状态的两个方法

    如何使用博图监控Profinet从站通讯状态,这里有两个方法供你选择。 方法 | 使用DeviceStates指令 创建全局数据块 在博图项目中,创建全局数据块(DB),用于存储
    的头像 发表于 01-17 11:21 1578次阅读
    使用博图(TIA Portal)监控PROFINET从站通讯状态的<b class='flag-5'>两个</b>方法

    曙光存储连续斩获两个行业奖项

    近期,曙光存储连续斩获两个行业奖项,自研技术产品在国产突破、AI行业应用等方面的成果获得广泛关注。
    的头像 发表于 01-15 16:28 2750次阅读

    广州唯创电子WTR096A-16S语音芯片:丰富IO口实现个性化定制功能详解

    设计,为多行业提供了全新的定制化解决方案。本文将深入解析该芯片如何通过丰富的IO口实现个性化功能,满足用户对智能化、人性化产品的需求。二、强大的硬件支持:IO口的多样
    的头像 发表于 11-12 08:42 673次阅读
    广州唯创电子WTR096A-16S语音芯片:丰富<b class='flag-5'>IO</b><b class='flag-5'>口实现</b>个性化定制<b class='flag-5'>功能</b>详解

    硬件SPI两个CS操作两个norflash,怎么互斥操作两个norflash?

    硬件SPI两个CS操作两个norflash,怎么互斥操作两个norflash,有
    发表于 09-26 06:18

    基本半导体连获两个行业奖项

    近日,基本半导体凭借在碳化硅模块领域的突出表现,连获“国产SiC模块TOP企业奖”和“年度优秀功率器件产品奖”两个行业奖项。
    的头像 发表于 09-05 16:31 1257次阅读

    两个设备蓝牙音频改用怎么实现

    两个设备蓝牙音频改用怎么实现
    发表于 07-22 09:28

    如何使用 SPI 全双工在两个 5LP MPU 之间连接 RAM?

    我需要将两个 5LP MPU 连接在起以镜像两个 5LP MPU 内的 RAM。 我认为这将是 DMA 的
    发表于 07-15 06:20

    图中两个按键开关是两个干簧管,为什么不直接对GND设计来检测这个干簧管通断呢?

    图中两个按键开关是两个干簧管,为什么不直接对GND设计来检测这个干簧管通断呢? 这样设计的原理是什么?
    发表于 06-17 06:30

    看到STM8L152两个IO两个或非门检测两个通断,是什么原理呢?

    图中两个按键开关是两个干簧管,为什么不直接对GND设计来检测这个干簧管通断呢? 这样设计的原理是什么?
    发表于 06-12 06:25

    AS32X601驱动系列教程 GPIO_按键检测详解

    led熄灭。 硬件设计 评估板板载三机械按键,分别接入MCU的PE10、PB4、PB3,当按键按下时,控制引脚通过按键接地,表现为低电平,当按键
    的头像 发表于 05-23 16:44 999次阅读
    AS32X601驱动系列教程 GPIO_<b class='flag-5'>按键</b>检测详解