一、功能介绍

项目需要实现长按功能,实现按键有2种方式,一种是通过中断、一种KEY_CHANGE事件轮询的方式。由于中断更加的灵敏,这里选择中断的方式。意外的发现,如果开启了中断,那么按键就不会触发KEY_CHANGE事件了。下面说下按键中断实现长按功能的思路:
1. 按下按键 下降沿触发中断(记录触发时间)
2. 更改触发方式为上升沿触发(这样释放按键的时候就会触发中断了)
3. 上升沿触发中断(记录触发时间)
4. 计算时间差,满足条件执行相应功能
5. 别忘了,将触发方式改回来,改成下降沿触发

二、代码实现

我们用的是Z-Stack Home 1.2版本的协议栈。在hal_key.c中已经给出中断处理服务函数

/****************************************************************************************************                                    INTERRUPT SERVICE ROUTINE***************************************************************************************************//*************************************************************************************************** @fn      halKeyPort0Isr** @brief   Port0 ISR** @param** @return**************************************************************************************************/
HAL_ISR_FUNCTION( halKeyPort0Isr, P0INT_VECTOR )
{HAL_ENTER_ISR();if (HAL_KEY_SW_6_PXIFG & HAL_KEY_SW_6_BIT){
    halProcessKeyInterrupt();}/*
    Clear the CPU interrupt flag for Port_0
    PxIFG has to be cleared before PxIF*/HAL_KEY_SW_6_PXIFG = 0;HAL_KEY_CPU_PORT_0_IF = 0;CLEAR_SLEEP_MODE();HAL_EXIT_ISR();
}

我们只需要实现halProcessKeyInterrupt方法就行了。我这里的按键是P0_5。

/*************************************************************************************************** @fn      halProcessKeyInterrupt** @brief   p0端口中断回到函数*** @param** @return**************************************************************************************************/
void halProcessKeyInterrupt( void )
{
    bool valid = FALSE;
    uint32 HAL_KEY_interval_time;
    if( HAL_KEY_PXIFG & HAL_KEY_BIT5 ) /* Interrupt Flag has been set */
    {        HAL_KEY_PXIFG &= ~HAL_KEY_BIT5;
        if(PICTL & 1) //当前下降沿触发(按下按键),记录初始时间
        {            Onboard_wait(50);//消除抖动
            if(P0_5==1)
              return;            HAL_KEY_starting_time = HAL_KEY_starting_time == 0 ? osal_GetSystemClock():HAL_KEY_starting_time ;
        }else         //当前上升沿触发(释放按键),计算时间
        {            HAL_KEY_interval_time = osal_GetSystemClock()-HAL_KEY_starting_time;
            if(HAL_KEY_interval_time > HAL_KEY_FILTER_TIME)//小于HAL_KEY_FILTER_TIME ms的电平变化都会被过滤掉
            {                valid = TRUE;
            }
            if(valid)
            {                osal_set_event(PersonalEmergencyDev_TaskID,Motion_RESET_TIMEOUT_EVT);//触发事件执行自己的业务逻辑
            }        }
        PICTL ^= 1; //p0触发方式<--取反
    }
}

最后别忘了,开启按键中断,通过宏变量。下面是添加的一些全局变量和宏定义。

#define ISR_KEYINTERRUPT 1
#define HAL_KEY TRUE
//按键长按5s 设置
static uint32 HAL_KEY_starting_time = 0;
#define HAL_KEY_FILTER_TIME 4950

Z-Stack通过按键中断实现长按功能相关推荐

  1. LeetCode简单题之按键持续时间最长的键

    题目 LeetCode 设计了一款新式键盘,正在测试其可用性.测试人员将会点击一系列键(总计 n 个),每次一个. 给你一个长度为 n 的字符串 keysPressed ,其中 keysPressed ...

  2. 从ARM裸机看驱动之按键中断方式控制LED(一)

    硬件环境:Samsung Cortex-A9 Exynos4412 BSP + JTAG ARM 仿真器 软件环境:Eclipse ================================== ...

  3. 应广单片机PFS123按键中断控制数码管显示例程

    目录 应广单片机PFS123按键中断控制数码管显示视频 led数码管图片 应广单片机PFS123按键中断控制数码管显示代码 应广科技网址,开发工具,PMS123规格书:http://www.padau ...

  4. linux驱动开发5 按键中断实验(定时器和中断)

    led:IO的输出 :key:IO的输入 法一:直接读写IO 使用while(1)无限读取,但CPU占用达到了99.6%,所以不行 #include <linux/types.h>#inc ...

  5. hal库开启中断关中断_[STM32]HAL库下GPIO按键中断与去抖问题分析(分析源码解决问题)...

    自上篇文章STM32 非阻塞HAL_UART_ReceiveIT解析与实际应用,具体总结了HAL库下套娃函数中如何看清库函数的脉络,更细致的认识调用的过程,以解决潜在的问题.又又又遇到了新的问题(GP ...

  6. SOPC第四课 按键中断

    按键 LED控制 开发板 小梅哥AC620 软件 quartus 13.1 2个按键,当按键0按下时,LED灯开始闪烁:当按键1按下时,LED灯停止闪烁. 使用一个PIO 这个PIO设置为6位(4个L ...

  7. c语言 执行free函数程序被卡住,FreeRTOS操作系统,在按键中断函数中恢复被挂起的任务,程序卡死的原因和解决办法...

    FreeRTOS操作系统,在按键中断函数中恢复被挂起的任务,程序卡死的原因和解决办法 时间:2019-08-10 14:39:47  来源:  作者:  所属栏目:其他服务端 这里将告诉您FreeRT ...

  8. 单片机中断程序实例_单片机定时器中断实现长时间定时程序

    单片机定时器中断实现长时间定时程序 #include // 包含51单片机寄存器定义的头文件 sbit D1=P2^0; //将D1位定义为P2.0引脚 unsigned char Countor; ...

  9. LeetCode 1629. 按键持续时间最长的键

    文章目录 1. 题目 2. 解题 1. 题目 LeetCode 设计了一款新式键盘,正在测试其可用性.测试人员将会点击一系列键(总计 n 个),每次一个. 给你一个长度为 n 的字符串 keysPre ...

最新文章

  1. eigen 编译_OpenCV+Eigen上位机程序移植(七十一)
  2. 微软sql服务器关闭了会怎样,sql server 服务启动后 自动关闭 求
  3. 正则判断 手机邮箱的正确格式
  4. 1.19 final修饰符详解
  5. 服务器性能查看常用命令
  6. python饼状图教程_Python数据可视化:饼状图的实例讲解
  7. 我对Spring的理解
  8. 面试高频题:springboot自动装配的原理你能说出来吗?
  9. python将学生信息保存到文件中_Python statsmodels OLS:如何将学习的模型保存到文件中...
  10. Redis学习笔记01---配置文件
  11. 继续教育自动听课软件_绵阳继续教育 自动挂机学习软件 v2019.5.31
  12. python安装离线包window_python 离线安装unrar库
  13. Somatic vs Germline Mutations
  14. 我中招了:解喝汽水问题
  15. Caffe 之 使用非图片的鸢尾花(IRIS)数据集(hdf5格式) 训练网络模型
  16. 【重识云原生】第六章容器6.1.3节——Docker常用命令
  17. 迅捷PDF编辑器调整PDF文件页面图文教程
  18. 使用 Vue.js 全家桶开发的高颜值第三方网易云播放器
  19. 拉钩网招聘信息爬虫项目
  20. c语言tc游戏代码大全,wintcC语言小游戏画图代码.doc

热门文章

  1. AE牛顿动力学插件:Motion Boutique Newton 3 Mac(支持ae2021)
  2. 微信重大更新,mac版可刷朋友圈!可以看,可以评论! 支持M1
  3. PS图片无损放大插件 Alien Skin Blow Up 3 for Mac
  4. P1616 疯狂的采药(python3实现)--80分
  5. Python | Socket01 - 创建一个TCP服务器(阻塞+单线程),将TCP客户端发过来的字符串原路返回
  6. CAN收发器SN65HVD230,实际应用案例分析
  7. Qt文档阅读笔记-QLatin1String解析及文本段跨行赋值
  8. Linux工作笔记-使用alias简化Linux命令(包含.bash和.cshrc)
  9. C++ opengl 对OpenGL中矩阵设置的初步认识
  10. Java高级语法笔记-文件操作-链表的存储