请教各位大神一个问题,电路图如下,单片机3个IO口检6个按键,还能检到S1和S6同时按下状态,IO内部上拉。

如题所述

实际上就是通过电流方向来检测的,为什么这么说,请看下文

用3个IO口扫描识别16个按键的方法

话不多说,先看原理图,如下:

从图中可以看出,使用了12个二极管和16个按键,此方法识别按键过程如下:

1. 先将3个IO口都配置成1,相当于上拉输入,然后读取IO的值,只要3个IO的值为非全1,就说明按键BT01~BT07有按键按下,如果读取值全为1,则进行下一步扫描识别。

2. 依次的设置其中一个IO口为0,其他两个IO口读,根据要读的两个IO口的状态识别按键BT08~BT16,比如:

设置IO01、02、03依次为011,然后读IO02、03,若IO02读为0,则BT11按下,若IO03为0,则BT13按下,若IO02、03都为0则BT16按下,如此识别其他剩余按键,但此处若BT11和BT13都按下,会误以为是BT16按下。

从上面介绍的可以看出,这种方法运用了逻辑组合的思路,此方法只要用3个IO可以扫描识别16个按键,但是对于有些按键同时按下,会有错误的识别结果。而且使用了较多的二极管,如果用4个IO口的话,使用的二极管的成本都可以外接一个专门的按键识别芯片了,不能实现组合按键功能,也是此设计的弊端,不建议使用。

那么是否还有其他方法呢?下面再介绍一种。

2个IO检测6个按键的方法

单片机IO口如果识别更多的按键,简单的方法就是通过控制按键按下,识别电流的流向。这说可能不是很理解,下面就来介绍下,如下图按键识别电路:

按键S1按下,电流是从R1流向GND的,S2按下是从R2流向GND,S3按下是从R1和R2共同流向GND。

S4按下是从IO1流向IO2,也可以从IO2流向IO1,S5按下是从IO1流向IO2,S6按下是从IO2流向IO1。按键按下和电流流向关系如下:

那么这6个按键单片机要怎么识别呢,下面就说下识别思路流程:

1. 先配置IO1和IO2都为1,然后读IO1和IO2,若读到IO1为0,那么S1按下,若读到IO2为0,那么S2按下,若读到IO1和IO2都为0,那么S3按下,若IO1和IO2都没读到0,那么进行下一步;

2. 配置IO1为0,IO2为1,读IO2,若读IO2为1,进入下一步,若IO2读为0,那么可以判断是S4或S6按下,然后再配置IO2为0,IO1为1,读IO1,若IO1读为0,那么就是S4按下,若IO1读为1就是S6按下了。

3. 配置IO2为0,IO1为1,读IO1,若IO1读为0,那么就是S5按下了。

将上面的电路图再精简下就是下面的图形了,是不是很有美感,下图还比上图省2个二极管哦。

欢迎评论交流,也欢迎大家关注我:单片机嵌入式爱好者。会有源源不断的干货分享,能真正快速帮大家解决实际工作中遇到的问题哦!

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-12-09
这个电路,属于三角键盘。
第2个回答  2015-12-11
问题在哪里