打印
[PIC®/AVR®/dsPIC®产品]

【CuriosityNano测评报告】09.使用定时器的多功能按键实验

[复制链接]
1138|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hu9jj|  楼主 | 2021-6-15 15:50 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
#申请原创#

    多功能按键的思路是通过计算按键按下的时间来实现多个功能,按照我的测试,一个按键可以轻松地实现三种以上的状态,即:点按(按下后迅速释放)、正常(按下后稍等片刻释放)、长按(按下约2秒后释放)、超长按(按下3秒后释放)。实现的办法是在主循环中轮询按键状态,当按键按下时让定时器进行计数,按键释放时停止计数,此时根据计数值就可以分辨出按键动作的状态。
    我使用的是TMR2,定时时间为25毫秒:


    除了核心板上的用户Key0外,我在扩展板上还增加了一个按键,接在RC2引脚上,同样也是下拉触发:


    每个按键定义两个全局变量,如Key0ok表示按键状态,Key0s用于定时器计数。在定时器中断函数中根据Key0ok和Key1ok的标志勾确定是否进行计数,代码如下图:


    在主循环中对按键状态进行判断和对按键结果进行处理,代码如下:
Key0_SetDigitalInput();
    Key1_SetDigitalInput();
   
    while (1)
    {
    // Add your application code
    if(0==Key0_GetValue()){
        DELAY_microseconds(20);     //延时消抖
        Key0s = 0;
        if(0==Key0_GetValue()){
            Key0ok = 1;
            while(!Key0_GetValue());
            Key0ok = 0;
        }
    }
    if(0==Key1_GetValue()){
        DELAY_microseconds(20);     //延时消抖
        Key1s = 0;
        if(0==Key0_GetValue()){
            Key1ok = 1;
            while(!Key1_GetValue());
            Key1ok = 0;
        }
    }

    //显示按键长短值
    if(Key0s>0){
        LCD_write_value(150,4,3,0,0,Key0s);
        Key0s = 0;
    }
    if(Key1s>0){
        LCD_write_value(150,5,3,0,0,Key1s);
        Key1s = 0;
    }
        


    测试过程的动画如下,按键数值显示的屏幕右部:

使用特权

评论回复
沙发
chenqianqian| | 2021-6-15 21:00 | 只看该作者
思路不错,谢谢楼主的分享。

使用特权

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

本版积分规则

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

151

主题

1059

帖子

11

粉丝