搜索
bottom↓
回复: 17

18个按键怎么能随时监控有没有按键按下?

[复制链接]

出0入0汤圆

发表于 2020-7-9 09:52:59 | 显示全部楼层 |阅读模式
现在有18个按键,按键扫描程序已经做好了,我怎么能随时监控有没有按键按下,是外部中断配置全部按键?我还有个定时器,如果把扫描放到主程序循环中,可能会出现进入中断,扫描不到的情况。也就是按键没作用。所以就想中断进入,但看了一下外部中断,我需要配置9个中断。有没有什么更好的办法吖?

出0入0汤圆

发表于 2020-7-9 09:59:42 | 显示全部楼层
中断最好不要进入时间太长, 最好是进中断后置个标志,然后返回主程序处理。

出0入0汤圆

发表于 2020-7-9 10:05:04 | 显示全部楼层
干嘛要中断做按键,直接主函数轮询就好了

出0入0汤圆

 楼主| 发表于 2020-7-9 10:09:14 | 显示全部楼层
lonely9391 发表于 2020-7-9 10:05
干嘛要中断做按键,直接主函数轮询就好了

还有个定时中断在使用,主循环进行是可以用,但会影响按键响应,比如刚扫描了行,进入定时中断,恢复时已经松开按键,几率是比较小,但对于按键体验来说并不好感觉。

出0入0汤圆

发表于 2020-7-9 10:29:01 | 显示全部楼层
在主循环也可以定时轮循啊,设置一个变量,进定时器中断就加1,比如主函数判断加到5就查询按键,搜一下三行按键程序,很精妙,主函数调用一下就行了

出16170入6148汤圆

发表于 2020-7-9 19:40:42 来自手机 | 显示全部楼层
 【关于按键扫描设置的问题】标题不合格。警告一次。这次我帮你修改了。
    发表主题帖子,标题必须充分说明帖子内容
     比如你要问AVR的ADC如何才能测量得比较准确,使用标题:“AVR的ADC如何消除干扰测量得比较准确?”。以下的标题不合格:
           不合格举例1:小女子冰天雪地裸体跪求解决方法
          不合格举例2:高手请出招,一个无法解决的AVR问题
          不合格举例3:一个困扰学习单片机初学者,惊动单片机开发者的难题 
          不合格举例4:AVR的ADC测量   (点评:问问题,或是有技术心得与大家分享?)

出16170入6148汤圆

发表于 2020-7-9 19:41:12 来自手机 | 显示全部楼层
标题不合格,没有打赏。

庆祝论坛“打赏”功能实施, 现在开始发技术主题,可以获得打赏
https://www.amobbs.com/thread-5735948-1-1.html

出0入0汤圆

 楼主| 发表于 2020-7-10 14:19:45 | 显示全部楼层
armok. 发表于 2020-7-9 19:41
标题不合格,没有打赏。

庆祝论坛“打赏”功能实施, 现在开始发技术主题,可以获得打赏

下次改进

出0入34汤圆

发表于 2020-7-10 14:54:53 | 显示全部楼层
定时很久吗?按键的反应起码也是在ms级别了吧,10ms扫一次没觉得有问题吧

出20入62汤圆

发表于 2020-7-10 15:25:15 | 显示全部楼层
epwwm 发表于 2020-7-10 14:54
定时很久吗?按键的反应起码也是在ms级别了吧,10ms扫一次没觉得有问题吧

我习惯5ms扫一次按键,这样可以做一些防抖滤波。

出280入168汤圆

发表于 2020-7-10 15:39:51 | 显示全部楼层
本帖最后由 chunjiu 于 2020-7-10 15:41 编辑

一个多输入与门就搞定了。



线1 ---|◄---+------ MCU 中断
                  |
线2 ---|◄---+
                  |
线3 ---|◄---+
                  |
线4 ---|◄---+
                  |
线5 ---|◄---+
                  |
线6 ---|◄---+
                  |
线7 ---|◄---+
                  |
线8 ---|◄---+
                  |
线9 ---|◄---+            

PS 补充,

如果想要电气保证,就自己再加两级反相器。      

出90入0汤圆

发表于 2020-7-10 16:27:17 | 显示全部楼层
10ms扫描一次,5次稳定的键,算有效的键,

50ms,你的手,足够快了。

记得,以前的电脑键盘,这么多键,用一个51芯片的。

出0入104汤圆

发表于 2020-7-10 17:35:02 来自手机 | 显示全部楼层
hzpyl 发表于 2020-7-10 16:27
10ms扫描一次,5次稳定的键,算有效的键,

50ms,你的手,足够快了。

不是用8051系列单片机,正确是选用8048系列单片机(低一个数量级的)。

键盘扫描不只有(轮询)扫描一种
还有一种最高效率的(线反转法)键盘扫描,但(教科书)只教以上一种,很少提及(线反转法)这种。


不用说大家都知道最经典的键盘扫描程序是查询式的扫描法,或者更高级一点的再加个中断。但是,有一种叫“线反转法”的键盘扫描程序,比一般的查询式的要高级一点,或许在实际应用中也几乎感觉不到快多少ms,但是了解一下总是有好处的吧!


Step1:将列线作为输出线,行线作为输入线。置输出线全部为0,此时行线中呈低电平0的为按键所在行,如果全部都不是0,则没有按键按下。

Step2:将第一步反过来,即将行线作为输出线,列线作为输入线。置输出线全部为0,此时列线呈低电平的为按键所在的列。这样,就可以确定了按键的位置(X,Y)。

当然还要注意软件去抖动啦~

参考C代码(部分):

while(1)
{
P0=0x0F;
if((P0&0x0F)!=0x0F)
{
switch(P0)
{
case0x07:i=3;break;
case0x0b:i=2;break;
case0x0d:i=1;break;
case0x0e:i=0;break;
default:break;
}
}
delay10ms();//软件去抖动
P0=0xF0;//反转行和列上的电平
if((P0&0xF0)!=0xF0)
{
switch(P0)
{
case0x70:j=3;break;
case0xb0:j=2;break;
case0xd0:j=1;break;
case0xe0:j=0;break;
default:break;
}
P1=num[j];//P1输出对应的按键值
}
}

出140入158汤圆

发表于 2020-7-10 19:15:34 | 显示全部楼层
兄弟是加藤鹰?指速这么惊人?
其实您在定时中断内扫描所有按键就可以了,消抖后,置位一个标志位和按键码(或者像电脑键盘那样加个按键队列也可以,不过一般没必要)。然后主循环检查标志位和按键码,爱咋处理咋处理。对于不是加藤鹰那种等级的人类,按键100ms内处理就不会感觉到明显的反应迟钝,不会影响体验,当然加藤鹰另说。题外话,如果您有摸过广数的系统,体验过按键1~2秒后才有反应的,就能体会加藤鹰的无奈。

出0入420汤圆

发表于 2020-7-11 01:38:41 | 显示全部楼层
我做的20ms 扫描一次,连续两次都扫描到,判定为按下,很灵敏,快速轻按,也不会漏掉

出0入309汤圆

发表于 2020-7-11 02:25:49 | 显示全部楼层
红白机还是使用CD4021扫描按键呢。也没人觉得有延迟。

出55入66汤圆

发表于 2020-7-11 05:05:47 | 显示全部楼层
真巧,我也是做了18个按键,打算用来玩拳皇的。代码还没开始弄,打算用定时器扫描的方法
https://gitee.com/AIxG/STM32F103_Duo

出55入66汤圆

发表于 2020-7-11 05:27:55 | 显示全部楼层
iamseer 发表于 2020-7-11 02:25
红白机还是使用CD4021扫描按键呢。也没人觉得有延迟。

时代不同了,现在玩游戏,60Hz的显示器都觉得有延时,144Hz是标配了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-18 20:35

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表