找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2841|回复: 0
收起左侧

CC2530单片机、ZStack协议栈中按键中断方式+长按短按功能

[复制链接]
ID:481420 发表于 2019-6-26 10:21 | 显示全部楼层 |阅读模式
请看附件,纯属个人理解,有不足之处请指出
1、 先找到 InitBoard()的定义
2、 修改 OnboardKeyIntEnable 的值:
OnboardKeyIntEnable = HAL_KEY_INTERRUPT_DISABLE;//失能按键中断; OnboardKeyIntEnable = HAL_KEY_INTERRUPT_ENABLE; //使能按键中断,此处使能按键 中断。
3、 按键配置函数 HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback);
这个函数中失能、使能中断执行不同的代码。下面分别讲解
a)、中断失能 清除中断使能寄存器。

在 HAL_KEY_POLLING_VALUE 时间后产生一个 HAL_KEY_EVENT 事件。找到这个事件的 处理函数,如下图所示:

图 1 禁用中断的处理函数
在 HalKeyPoll();中进行按键的扫描,如果有按键按下,记录键值,并执行按键处理函数 OnBoard_KeyCallback();100ms 后再次产生HAL_KEY_EVENT 事件,相当于 100ms 轮询一 次。
b)、中断使能
注意中断使能时,如果用户是普通案件代替五向按键,不能用五向按键的宏定义,需要 自己重定义,否则会出现错误。
重定义如下:



如果中断使能,则进入按键中断的配置: a)、配置 SW1 边沿触发、设置中断初始条件 b)、配置 SW2 边沿触发、设置中断初始条件 c)、停止按键轮询。
4、找到按键的中断处理函数,并进行更改
按键 P0 口的中断处理函数为 HAL_ISR_FUNCTION( halKeyPort0Isr, P0INT_VECTOR )
当有中断产生是,执行 halProcessKeyInterrupt 函数。 代码如下:



a)、对按键 SW6
检测到按键边沿后,产生 HAL_KEY_EVENT 事件,HalKeyPoll ()函数中记录 keys= HAL_KEY_SW_6 的值,并将其发送给 MyApp_TaskID 任务。MyApp_TaskID 中检测到按键 改变,产生 KEY_CHANGE 事件,调用按键处理函数
MyApp_HandleKeys()。
b)、对按键 SW7(有按键长按短按的功能)
按键按下检测到上升边沿,记录时间 t1;              将触发边沿改变成下降沿触发,按键松开时记


录系统时间 T2。全局变量 MyApp_Key_differnt_Time=t2-t1; 之后又进入到 HalKeyPoll
(void)处理函数中;


Keybuf1 和 keybuf2 用来检测按键是否产生了一个按下&抬起的动作,如果不这么做, 按键平时为高电平,抬起按键后也为高电平,用 Keybuf1 和keybuf2 作为按键按下抬起 完成的标志位。然后的过程和 SW6 类似。
4、 MyApp_TaskID 任务中对按键的实际处理代码 MyApp_HandleKeys(); 按键 SW6 不做讲解,对 SW7 的代码如下:
长按超过 3000ms,执行清除 NV 的动作 小于 3000ms,执行功率改变的动作。

pdf格式文档51黑下载地址:
Zstack中将按键设置为_中断方式.pdf (505.2 KB, 下载次数: 22)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表