stm32xiaobai 发表于 2020-7-9 09:52:59

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

现在有18个按键,按键扫描程序已经做好了,我怎么能随时监控有没有按键按下,是外部中断配置全部按键?我还有个定时器,如果把扫描放到主程序循环中,可能会出现进入中断,扫描不到的情况。也就是按键没作用。所以就想中断进入,但看了一下外部中断,我需要配置9个中断。有没有什么更好的办法吖?

jjj 发表于 2020-7-9 09:59:42

中断最好不要进入时间太长, 最好是进中断后置个标志,然后返回主程序处理。

lonely9391 发表于 2020-7-9 10:05:04

干嘛要中断做按键,直接主函数轮询就好了

stm32xiaobai 发表于 2020-7-9 10:09:14

lonely9391 发表于 2020-7-9 10:05
干嘛要中断做按键,直接主函数轮询就好了

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

JY-MCU 发表于 2020-7-9 10:29:01

在主循环也可以定时轮循啊,设置一个变量,进定时器中断就加1,比如主函数判断加到5就查询按键,搜一下三行按键程序,很精妙,主函数调用一下就行了

armok. 发表于 2020-7-9 19:40:42

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

armok. 发表于 2020-7-9 19:41:12

标题不合格,没有打赏。

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

stm32xiaobai 发表于 2020-7-10 14:19:45

armok. 发表于 2020-7-9 19:41
标题不合格,没有打赏。

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


下次改进{:lol:}

epwwm 发表于 2020-7-10 14:54:53

定时很久吗?按键的反应起码也是在ms级别了吧,10ms扫一次没觉得有问题吧

天下乌鸦一般黑 发表于 2020-7-10 15:25:15

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

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

chunjiu 发表于 2020-7-10 15:39:51

本帖最后由 chunjiu 于 2020-7-10 15:41 编辑

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



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

PS 补充,

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

hzpyl 发表于 2020-7-10 16:27:17

10ms扫描一次,5次稳定的键,算有效的键,

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

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

andy 发表于 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;//P1输出对应的按键值
}
}

amigenius 发表于 2020-7-10 19:15:34

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

hameyou 发表于 2020-7-11 01:38:41

我做的20ms 扫描一次,连续两次都扫描到,判定为按下,很灵敏,快速轻按,也不会漏掉

iamseer 发表于 2020-7-11 02:25:49

红白机还是使用CD4021扫描按键呢。也没人觉得有延迟。

cpumaker 发表于 2020-7-11 05:05:47

真巧,我也是做了18个按键,打算用来玩拳皇的。代码还没开始弄,打算用定时器扫描的方法
https://gitee.com/AIxG/STM32F103_Duo

https://gitee.com/AIxG/STM32F103_Duo/raw/master/images/joystick.jpg

cpumaker 发表于 2020-7-11 05:27:55

iamseer 发表于 2020-7-11 02:25
红白机还是使用CD4021扫描按键呢。也没人觉得有延迟。

时代不同了,现在玩游戏,60Hz的显示器都觉得有延时,144Hz是标配了
页: [1]
查看完整版本: 18个按键怎么能随时监控有没有按键按下?