如何用最少的IO驱动更多的按键?

按键是一个比较典型常用的输入器件,单片机可以检测按键的状态从而执行相应的命令,所以题目的合适含义应该是,如何用较少的IO口检测更多的按键输入。

由于单片机的GPIO口是有限的,要实现更多的按键检测只能通过扩展IO来实现,今天给大家分享的就是通过使用74HC165来实现GPIO口的扩展,可以实现更多按键的输入检测。

74HC165是并入传出的移位寄存器,单片74HC165具有8个输入三个输出,所以通过单片机的三个GPIO口就可以实现8个按键的输入检测,更重要的是该芯片可以级联,通过3个GPIO可以检测更多的按键输入。以三片级联为例,介绍其使用方法,其典型的电路图如下所示。

通过图片可以看出,扩展芯片的第1,2,9三个脚接单片机,通过第10脚和下一片的9脚实现级联。通过3个GPIO就扩展出了24个按键输入检测。其程序如下图所示。

该芯片与74HC595的作用正好相反,74HC是串入并出,可以用来驱动数码管等器件。74HC165的程序与74HC595存在一定的相似之处。在编写程序时,要注意查看芯片的时序图,要在时钟的边沿状态读取数据。

关于更多细节内容大家可以留言讨论。

以上就是这个问题的回答,感谢留言、评论、转发。更多精彩内容请关注本头条号:玩转嵌入式。感谢大家。

题主这个问题很有意思。我们做产品设计中也经常遇到这种困扰,单片机(MCU)的资源是有限的。我们需要考虑怎么用最低的成本做出最好的产品来。如果用IO扩展的方法当然是可行的,但不是节省成本的方案。

下面给大家分享一下驱动(读取)按键时怎么样去节省IO资源。

方案1:矩阵扫描按键读取法

用6个IO(3x3)可以读取9个按键,用8个IO(4x4)可以读取16个按键,用10个IO(5x5)可以读取25个按键,这方案非常适合按键多的方案,下面以3x3读取9个按键为例进行讲解。

原理图如下:

按键读取方法:

  • 设C1,C2,C3这三个IO为输出,设L1,L2,L3这三个IO为带上拉电阻的输入;

  • 然后用分时扫描的方法读取按键;

  • 把C1设为低电平,C2,C3高为高电平,单片机读取L1,L2,L3这三个输入,看看S1,S2,S3有哪些按键被按下,S1按下,L1会读到低电平,S2按下,L2会读到低电平,S4按下,L3会读到低电平;

  • 把C2设为低电平,C1,C3高为高电平,单片机读取L1,L2,L3这三个输入,看看S4,S5,S6有哪些按键被按下,S4按下,L1会读到低电平,S5按下,L2会读到低电平,S6按下,L3会读到低电平;

  • 把C3设为低电平,C1,C2高为高电平,单片机读取L1,L2,L3这三个输入,看看S7,S8,S9有哪些按键被按下,S7按下,L1会读到低电平,S8按下,L2会读到低电平,S9按下,L3会读到低电平

方案二:ADC输入读取按键法

此方法需要单片机带有ADC输入功能,单路ADC可以读取多个按键。一般一路ADC读四、五个按键是绝对没问题的,下面以一路ADC输入读4个按键为例

原理图如下

根据ADC读取到的电压值去判断哪个按键被按下。

  • 无按键按下时,ADC读取到的电压是5V;

  • S1按下时,ADC读取到的电压是3.85V

  • S2按下时,ADC读取到的电压是3.13V

  • S3按下时,ADC读取到的电压是2.63V

  • S4按下时,ADC读取到的电压是2.27V

方案三:IO共用法

此方法适用于电路中需要按键又需要驱动LED或者LCD的情况,下面以一个IO同时驱动LED和按键进行示例

原理图如下:

分时驱动LED和按键,在不扫描按键的时候,I/O是设为输出状态,是用来驱动LED的。

扫描按键时,把I/O设为输入状态,读取按键。

请大家关注一下我的头条号@电子产品设计方案,支持一下,我会把我的设计经验和方案分享给大家

我们以西门子PLC为例说明用少数IO接口连接更多按钮的方法。

接线如图一所示:

梯形图如图二所示:

在这个例子中使用了SB0到SB5共6个按钮,占用6个输入口。操作时,按下按钮SB0,再分别按其它按钮,可以得到5个按钮信号;不按按钮SB0,操作其它按钮,又可以得到5个按钮信号。相当于10个按钮,使用了6个IO口。

例子说明了少数IO口连接更多按钮的原理。应用时根据具体控制要求,举一反三,灵活运用。

敬请关注,有问必答。

有一个非常棒的方法,就是用AD做按键扫描,可以做很多按键,电路也很简单,也不用扩展芯片,很好。电路如图所示

欢迎大家评论、转发、留言、点赞!

如图举例,这是用最少的IO来采集按键数据。使用mcu的adc管脚,按图连接,不同的按键按下去,sw_ad0的电压值都不一样,从而可以检测出具体是哪个按键触发的。

一.sw1具有优先权。

二.理论可以扩展无数个按键,但由于受电压稳定性和adc采集精度影响,实际能使用的按键不会太多。

三.通过调节电压和电阻的值,一般采集十来个按键没问题。

四.图中已经把常用值和公式列出,仅做参考。

我说一个做产品常用到的方法。用按键扫描驱动芯片。比如类似TM1638。不占用系统资源,可以挂很多按键,还能驱动数码管。整个系统分工明确,程序简单。还可以腾出MCU用于其它事件计算处理。

2022-03-20

2022-03-20