如何检测一个按键是否被按下

 我来答
伟晓莉酆波
2019-05-16 · TA获得超过3万个赞
知道大有可为答主
回答量:1.1万
采纳率:28%
帮助的人:577万
展开全部
看输入,如果同一个按键被以诸如0.5秒这样的间隔不断发出来就可以认为是长按了
更复杂的方法:键盘按下发出来一个scan
code,抬起来的时候还会发出另外一个值.当然这样弄起来
非常底层,非常复杂
默一学长
2020-12-06 · TA获得超过8029个赞
知道大有可为答主
回答量:1.6万
采纳率:97%
帮助的人:769万
展开全部
在单片机系统里,按键是常见的输入设备,在本文将介绍几种按键硬件、软件设计方面的技巧。一般的在按键的设计上,一般有三种方案:

一是GPIO口直接检测单个按键,如图1.1所示;

二是按键较多则使用矩阵键盘,如图1.2所示;

三是将按键接到外部中断引脚上,利用按键按下产生的边沿信号进行按键检测,如图1.3所示;

图1.1方案一

图1.2方案二

图1.3方案三

在以上三种设计上,各有优点和不足。

第一种是最简单和最基础的,对于单片机初学者很容易理解和使用,但是缺点是,需要在主循环中不断检测按键是否按下,并且需要做消抖处理。若主循环中某个函数任务占用时间较长,则按键会有不同程度的“失灵”。

第二种,优点是能够在有限的GPIO情况下,扩展尽可能多的按键。但缺点同上,需要不停检测按键是否按下。

第三种方式是效率最高,不需要循环检测按键是否按下,但是缺点是,需要单片机有足够的外部中断接口以供使用;

在以上的三种常见按键设计的基础上,现在分享我学习和工作中总结的按键方案。

改进一:在原方案一的基础上,加上与门电路,使得任何一个按键按下,都能产生中断,然后在中断里面识别是哪个按键被按下。因此不需要循环扫描,大大提高了效率。方案如图1.5所示。

只需要每个按键对应地增加一个二极管,利用二极管的线与特性,可以实现按下任何按键,都能产生中断信号,但是按键之间互不影响。二极管选用普通整流二极管即可,本人亲测可行。

图1.5 改进一

图1.6 改进二

改进二:在原有的ADC按键的基础上,也可用增加二极管的方式,实现按键中断,并在中断服务程序里进行AD转换,从而识别按键。电路如图1.6所示。

改进三:因为按键不可避免的有抖动,因此按键消抖可以通过硬件消抖和软件消抖。现在分享一个十分简单且有效的硬件消抖方法:给按键并联一个104左右的电容。软件上基本不用处理即可避免抖动。

改进四:在按键扫描检测的方案下,如果主循环中有某个函数占用时间较长,则按键会发生或长或短的“失灵”,现分享我的一个解决方案。将按键扫描放到定时器中断里面,这样就可周期性地检测按键按下情况,不受主循环的影响。并且,能解析出按键的不同状态,即按下、按住、弹起、为按下这四种状态,用以实现更丰富的功能。

但需注意两点,一是定时器的定时时间,不可过长也不可过短,过长容易检测不到按下,过短会占用大量时间资源。二是中断服务程序需简单明了,只做检测用,通过全局变量传递,在主循环内完成按键响应,中断服务函数内尽量不要占用太多时间。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
幸彦红阴抒
2019-10-31 · TA获得超过2.9万个赞
知道大有可为答主
回答量:9515
采纳率:30%
帮助的人:1056万
展开全部
要想再判断哪个按键按下了,只要在第一个按键按下的同时,再去检测按键值就行了
但是如果你是用延时写的按键程序的话,第一个按键按下后并未释放
你就是一直在延时等待了,单片机做不了别的事
提供一种思路
可以使用定时器中断
定时扫描按键,读取键值
这样第一个按键按下后并未释放,定时中断会去检测按键键值,就可以知道是哪个按键按下了
具体的做法有很多种,根据自己的思路试试吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式