发布网友 发布时间:2022-05-14 19:48
共2个回答
热心网友 时间:2023-10-27 00:00
8个太多了,用3个就够,为什么这么说,请看下文
话不多说,先看原理图,如下:
从图中可以看出,使用了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口的话,使用的二极管的成本都可以外接一个专门的按键识别芯片了,不能实现组合按键功能,也是此设计的弊端,不建议使用。
那么是否还有其他方法呢?下面再介绍一种。
单片机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个二极管哦。
欢迎评论交流,也欢迎大家关注我:单片机嵌入式爱好者。会有源源不断的干货分享,能真正快速帮大家解决实际工作中遇到的问题哦!
热心网友 时间:2023-10-27 00:01
只能用矩阵键盘的方法实现16个按键是可以的,你把每次按下的按键数值赋值给一个变量,只要有按键按下就把这个变量丢给串口发出去就可以了有那么复杂吗