[PIC®/AVR®/dsPIC®产品] 【CuriosityNano测评报告】09.使用定时器的多功能按键实验

[复制链接]
1383|1
 楼主| hu9jj 发表于 2021-6-15 15:50 | 显示全部楼层 |阅读模式
#申请原创#

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


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


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


    在主循环中对按键状态进行判断和对按键结果进行处理,代码如下:
  1. Key0_SetDigitalInput();
  2.     Key1_SetDigitalInput();
  3.    
  4.     while (1)
  5.     {
  6.     // Add your application code
  7.     if(0==Key0_GetValue()){
  8.         DELAY_microseconds(20);     //延时消抖
  9.         Key0s = 0;
  10.         if(0==Key0_GetValue()){
  11.             Key0ok = 1;
  12.             while(!Key0_GetValue());
  13.             Key0ok = 0;
  14.         }
  15.     }
  16.     if(0==Key1_GetValue()){
  17.         DELAY_microseconds(20);     //延时消抖
  18.         Key1s = 0;
  19.         if(0==Key0_GetValue()){
  20.             Key1ok = 1;
  21.             while(!Key1_GetValue());
  22.             Key1ok = 0;
  23.         }
  24.     }

  25.     //显示按键长短值
  26.     if(Key0s>0){
  27.         LCD_write_value(150,4,3,0,0,Key0s);
  28.         Key0s = 0;
  29.     }
  30.     if(Key1s>0){
  31.         LCD_write_value(150,5,3,0,0,Key1s);
  32.         Key1s = 0;
  33.     }
  34.         


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
chenqianqian 发表于 2021-6-15 21:00 来自手机 | 显示全部楼层
思路不错,谢谢楼主的分享。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

151

主题

1063

帖子

11

粉丝
快速回复 在线客服 返回列表 返回顶部