打印

如何获得长短按键状态?

[复制链接]
1410|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hu9jj|  楼主 | 2019-5-6 14:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
pi, GPIO, IO, gp, TI
  GD32E231开发板上仅有一个用户按键"Wakeup",而我的项目中至少需要用户输入的两种状态,最简单的方法则通过识别用户的长按或短按。我是这样处理的,设置
按键为
中断方式,在中断处理程序中将全局变量keys = 1,这是中断处理程序的代码:
void EXTI0_1_IRQHandler(void)
{
    if(RESET != exti_interrupt_flag_get(EXTI_0)){
        keys = 1;
        gd_eval_led_toggle(LED4);
  
    }
   
    exti_interrupt_flag_clear(EXTI_0);
}  


    在main循环中检测到keys>0就跳转到按键处理程序,代码如下:
  if(keys > 0)          //有键按下
            key_processing();

    在按键处理程序中通过延时后再检测按键是否仍在按下状态,代码如下:
    delay_1ms(100);
    if(SET == gpio_input_bit_get(GPIOA,GPIO_PIN_0))
        keys = 3;
    delay_1ms(200);
    if(SET == gpio_input_bit_get(GPIOA,GPIO_PIN_0))
        keys = 6;

    中断处理和主循环判断都很正常,但在按键处理中却不能达到目的,无论按键时间长短,keys始终为1。
    我将中断处理程序里面的keys = 1改为keys++,注释掉按键处理这段代码,则返回的keys值会变化,但不能稳定地与按键时间长短对应。
    整个五一节日都在反复调试工,至今仍无法得到满意的结果,请各位大侠帮忙看看是何原因,应该采取何种方式才能达到要求。先谢谢各位!


使用特权

评论回复
沙发
q11726| | 2019-5-6 17:18 | 只看该作者
你这样可以用扫描的方式
也可以用定时器去捕获按键时间来控制

使用特权

评论回复
板凳
lvben5d| | 2019-5-6 19:15 | 只看该作者
本帖最后由 lvben5d 于 2019-5-6 19:17 编辑

按键触发后,单独开个10ms定时器 定时中断来检测按键是否一直按着(同时可以判断是否松开了),是最佳的,可以不阻塞主循环。尤其E系列 定时器多的要命吧, 不像F系列 低容量的只有4个定时器 + systick 共5个。   按住的状态 n++, 当检测到电平反转了就表示松开的时候到了,10ms还可以消抖。

使用特权

评论回复
地板
hu9jj|  楼主 | 2019-5-6 20:43 | 只看该作者
谢谢楼上两位热心回帖,我再开定时器试试。

使用特权

评论回复
5
hu9jj|  楼主 | 2019-5-7 13:25 | 只看该作者
掉在坑里几天都出不来,一直得不到想要的结果,今天豁然开朗,用最简单的轮询按键加延时解决了问题,代码如下:
        keys = 0;
                while(gd_eval_key_state_get(KEY_WAKEUP))
                {
                    keys++;
                        delay_1ms(50);
                }
                if(keys > 0)          //有键按下
                    key_processing();
适当调整延时时间,就可以得到合适的keys值,再根据值的大致范围来确定按键时间长短,我现在很轻松地分辨出点按、长按,长按还可以再分为1秒左右,2秒以上等。
结贴了,谢谢各位热心回复!

使用特权

评论回复
6
lvben5d| | 2019-5-8 17:10 | 只看该作者
hu9jj 发表于 2019-5-7 13:25
掉在坑里几天都出不来,一直得不到想要的结果,今天豁然开朗,用最简单的轮询按键加延时解决了问题,代码如 ...

在某些项目中 CPU没别的事情做  无所谓的。 不过更好的方式是开定时器哦,适用更广,  不会出问题。

使用特权

评论回复
7
hu9jj|  楼主 | 2019-5-9 07:25 | 只看该作者
lvben5d 发表于 2019-5-8 17:10
在某些项目中 CPU没别的事情做  无所谓的。 不过更好的方式是开定时器哦,适用更广,  不会出问题。 ...

等稍空时再练习定时器方式,毕竟随着项目功能扩充,迟早需要提高MCU的效率。

使用特权

评论回复
8
aoyi| | 2019-5-24 08:19 | 只看该作者
方法很多 但是么有什么太巧妙的

使用特权

评论回复
9
drer| | 2019-5-24 08:27 | 只看该作者
这种判断挺麻烦的

使用特权

评论回复
10
gwsan| | 2019-5-24 08:28 | 只看该作者
不过需要做软件防抖动的

使用特权

评论回复
11
hu9jj|  楼主 | 2019-5-24 09:02 | 只看该作者
谢谢上面三位三胞胎弟兄的关注!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:Microchip
简介:让我们来为您提供帮助。我们可提供各种资源来帮助您解决一切问题。是否需要与我们的客户支持团队联系?您可以通过电话、在线聊天功能或电子邮件与他们联系。

151

主题

1059

帖子

11

粉丝