问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

单片机5个IO口扫描25个按键的程序,怎么只能扫描到下面5个键

发布网友 发布时间:2022-04-23 14:54

我来回答

2个回答

热心网友 时间:2023-10-03 06:25

本文以循序渐进的思路,引导大家思考如何用最少的IO驱动更多的按键,并依次给出5种方案原理图提供参考。在实际项目中我们经常会遇到有按键输入的需求,但有的时候为了节省资源成本,我们都会选择在不增加硬件的情况下使用最少的控制器IO驱动更多的按键,那么具体是怎么做的呢,下面我们就以用5个IO引脚为例,讲下怎么设计可以实现更多的按键?共有5种设计思路,下面依次介绍。

思路一

首先通常想到的可能是下面这样的设计:

上图形式的按键就是我们通常说的行列式按键,它的驱动思路是这样的:

1. 对IO1、2、3配置为推挽输出,依次只让其中一个输出为0其他输出为1。

2. 对IO4、5进行读操作,根据读出的结果判断哪个按键按下。

例如:配置IO1、2、3为011,读IO4、5,若IO4为0则SW14按下,若IO5为0则SW15按下;

依次的配置IO1、2、3为101,读IO4、5,若IO4为0则SW24按下,若IO5为0则SW25按下;

依次的配置IO1、2、3为110,读IO4、5,若IO4为0则SW34按下,若IO5为0则SW35按下;

思路二

但是我们在不知道行列式按键之前我们肯定是依次将IO口接一个按键到GND或者到VCC,然后去读IO口去判断哪个按键按下,这也是最简单的方法,但是很浪费IO口,下面这种就结合了这种简单方法和行列式的思路,实现了又多增加3个按键,如下图:

这里我们的思路是先依次读IO1、2、3的电平来识别S1、2、3,哪个按键按下,其后的流程和思路一是一样的,这样就可以识别11个按键了。

思路三

按照扫描的思想,某一时刻设置一个IO口为0,其他IO口读,如果有IO口读到0,则有对应按键按下。比如IO1为0,然后读到IO5也为0,那么K15就是按下的。对照这样的思路,我们可以有下面的设计:

这个电路按键识别思路是这样的:

1. 只配置IO1为0,其他IO读,若IO5读到0,则K15按下,若IO4读到0,则K14按下,依次识别K13,K12;

2. 只配置IO2为0,其他IO读,若IO5读到0,则K25按下,若IO4读到0,则K24按下,依次识别K23;

3. 只配置IO3为0,其他IO读,若IO5读到0,则K35按下,若IO4读到0,则K34按下;

4. 只配置IO4为0,其他IO读,若IO5读到0,则K45按下;

思路四

对于思路3我们发现,如果只配置IO5为0,其他IO读,若IO1读到0,则K15按下,若IO2读到0,则K25按下,依次可识别K35和K45。这样就存在重复,那么有么有好的方法,解决这样的重复呢?我们发现,若配置IO1为0,K15按下,电流流向IO1的,若配置IO5为0,同样K15按下,电流是流向IO5的。这样我们就可以通过区分电流的流向来避免重复。于是就有了下图的设计:

这样就可以避免重复,IO5为0时,按K15,IO1是读不到0的。那么怎样设计,IO5为0时对应一个按键按下IO1为0呢?如是就有人想到下面的设计:

这个电路按键识别思路是这样的:

1. 只配置IO1为0,其他IO读,若IO5读到0,则K51按下,若IO4读到0,则K41按下,依次识别K31,K21;

2. 只配置IO2为0,其他IO读,若IO5读到0,则K52按下,若IO4读到0,则K42按下,依次识别K32,K21';

3. 只配置IO3为0,其他IO读,若IO5读到0,则K53按下,若IO4读到0,则K43按下,依次识别K32’,K31';

4. 只配置IO4为0,其他IO读,若IO5读到0,则K54按下,若IO4读到0,则K43’按下,依次识别K42’,K41';

5. 只配置IO5为0,其他IO读,若IO4读到0,则K54’按下,若IO3读到0,则K53’按下,依次识别K52’,K51'。

思路五

很多人可能认为思路四已经识别20个按键了,但是真的就没有其他方法了吗?不要忘了,我们还没有将思路二你介绍的那种最简单的方法结合进去,于是又可以多5个按键,如下图:

这样我们可以先识别K01、K02、K03、K04、K05,若没有按键按下然后再和思路四的设计一样去识别其他按键。但这样存在一个问题,如果IO1配置为0,IO5读到0,那么怎么知道是K51按下还是K05按下呢,这里只需要在程序里做下判断,先判断下是不是K05按下,若不是就是K51,因为按键K01、K02、K03、K04、K05在5个IO口都为读取的情况下,就可以识别,不需要扫描识别处理,相当于这5个按键优先级高与其他按键。

总结

综合上述,5个IO口最多可以识别25个按键,思路五程序上处理比较麻烦,若实际中只按思路四设计,也可识别20个按键,那么如果有N个IO口可识别多少按键呢?这里给出如下公式:

假设有N个IO口按照思路三可以识别N*(N-1)/2个;

按照思路四可识别N*(N-1)个;

按照思路5可以识别N*(N-1)+N个。

最后再说下,如果实际设计时,还是按思路四设计好,软件也没那么麻烦。如果是你的话你会选择哪种方法呢?你还有没有其他的设计方法呢?

热心网友 时间:2023-10-03 06:25

把读出按键的程序,单独写,用位操作指令,就比较清晰。追问不知道是不是程序问题,按键基本都扫描不到

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
vivo手机死机一直亮屏也关不了 vivo手机死机了怎么办,无法关机 为什么我的vivo手机死机关不了机? 企业经营分析手册图书目录 腾达311R如何设置限速,请指教 计算机系统结构:量化研究方法目录 无线W311R,设置限速! 拼多多投直通车亏(拼多多开直通车亏本) 拼多多烧直通车亏本(拼多多直通车一直亏钱) 拼多多烧直通车亏本(拼多多开直通车赔钱) 按键控制led灯的程序 51单片机的4*4键盘程序 单片机键盘自检程序 矩阵式键盘工作流程主要包括 三个步骤 win7下怎么记录键盘按键过程,就是按过哪些按键 关于单片机温度控制系统C语言程序中的按键设置程序,请求详细的介绍下按键的输入过程。while(1) { if(KeyFl 雪莲果的热量?每天都吃可以吗? VB一个简单的键盘按键响应程序 雪莲果可以天天吃吗,没次吃多少合适,吃多了对身体 求51单片机中断式独立按键的程序流程图,完整一点谢谢。 雪莲果什么时候吃最好?求解。 怎样用程序制作软键盘 雪莲果是水果还是蔬菜,怎么吃? 如何用易语言写网络游戏最小化后 后台按键程序? 雪莲果含糖量是多少? 单片机C语言两个数码管按键计数程序 雪莲果什么时候吃最好? 如何用易语言制作游戏最小化后 后台按键程序。 什么季节吃雪莲果好值 51单片机最有效的按键处理程序 有什么app可以把证件照背景颜色改了 请问有没有改变图片上的文字和背景颜色的手机app? 哪个app可以换照片底色 怎样制做微信二维码红包? 怎么让别人扫我的二维码收红包? 我想设置一个微信二维码,别人扫到就可以得到我发的红包,请问怎么办 唐诗三百首究竟是哪三百首 唐诗三百首是哪300首 唐诗三百首到底有多少首诗? 《唐诗300首》都有哪300首诗把题目,作者 谁知道唐诗有哪300首? 唐诗300首诗句 tang唐诗300首都有哪些? 唐诗300首,主要搜集了哪些人的? 有名的一些古诗(至少300首) 七步洗手法什么时候需要洗手 小翼管家语音权限怎么打开 流水洗手应该采用七步洗手法,具体操作方法是怎样的? 语音权限怎么开 怎么开启语音权限