按键是一个比较典型常用的输入器件,单片机可以检测按键的状态从而执行相应的命令,所以题目的合适含义应该是,如何用较少的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用于其它事件计算处理。