ZigBee TI ZStack CC2530 5.7 实例(三)多功能按键02-指示灯

时间:2022-02-14 05:42:56

(配套源码软件开发板等资源,可移步博客同名QQ群:拿破仑940911


上一节中讲述了如何实现基于系统时钟的多功能按键,本节将讲述对这一多功能按键的升级优化——添加指示灯。


一、实验内容及目的

多功能按键的功能虽然很好用,但是如果没有任何提示的,光靠人自己数数的估算按键时间的话,着实不是很好便。一般实际项目开发中,与多功能按键一起使用的,还会有一个指示灯。灯的状态就可以有很多了,灯的颜色、亮暗、是否闪烁以及闪烁快慢或频率等,不同的状态可以代表各种不同的提示信息!

因此,本次实验的内容就是为我们的多功能按键增加一个指示灯;目的是为了通过LED灯的状态,来提示用户按键时间的长短,从而更加人性化地实现”多功能“!具体实验现象将会是:

1、按键时间20ms ~ 5s  :LED指示灯无任何现象,保持熄灭的状态;

2、按键时间   5  s ~ 10s:LED指示灯以较高的频率(125ms/次)闪烁;

3、按键时间  10 s ~ 15s:LED指示灯切换到较低的频率(500ms/次)闪烁;

4、按键时间  15 s 以上  :LED指示灯重新回到熄灭的状态;

PS:每次松开按键,不管当前LED灯是什么状态,都会重新回到熄灭的状态,表示可以重新进行下一次按键操作。

二、实验的原理

当按键一开始被按下的时候,触发一次5000ms之后的按键时间判断,具体代码实现就是向Hal_TaskID任务发送一个HAL_KEY_TIME_EVT事件,5000ms之后触发:

void halProcessKeyInterrupt (void){
......
if((PICTL & HAL_KEY_SW_1_EDGEBIT)==HAL_KEY_SW_1_EDGEBIT)//由于“下降沿”触发中断
{
......
osal_start_timerEx( Hal_TaskID, HAL_KEY_TIME_EVT, 5000);
}
......
}

5000ms之后,Hal_TaskID任务的HAL_KEY_TIME_EVT事件被触发。Hal_TaskID任务的任务处理函数为hal_drivers.c文件中的Hal_ProcessEvent()函数,具体执行代码如下:

  if ( events & HAL_KEY_TIME_EVT )  {    processHalKeyTimeEvt();    return (events ^ HAL_KEY_TIME_EVT);  }

此处增加的这段代码,其实就是为Hal_ProcessEvent()函数增加了一个事件处理分支,而这个事件的定义放在了hal_drivers.h文件中:

#define HAL_KEY_TIME_EVT      0x0010

由此可以看出,实际处理的函数其实是processHalKeyTimeEvt()。该函数的声明与定义也都放在了hal_drivers.c文件中。如下:

void processHalKeyTimeEvt( void );
void processHalKeyTimeEvt( void ){  if (HAL_PUSH_BUTTON1())  {    uint32 interval = osal_GetSystemClock() - HAL_KEY_starting_time;    if(interval >= 10000)    {      HalLedBlink( HAL_LED_2, 10, 50, 500 ); //慢闪    }    else if(interval >= 5000)    {      HalLedBlink( HAL_LED_2, 40, 50, 125 ); //快闪      osal_start_timerEx( Hal_TaskID, HAL_KEY_TIME_EVT, 5000);    }  }}

从最初按下按键,到执行到这个函数,已经过去了5000ms,也就是5s。如果此时按键仍然保持被按下的状态,则LED指示灯进入“快闪”状态。与此同时,再触发一次5000ms之后的按键时间判断。再过5s之后,如果按键依旧保持被按下的状态,则LED指示灯进入“慢闪”状态。

每次按键一旦松开,OnBoard_KeyCallback()函数中,都会调用OnBoard_SendKeys()函数,将按键信息发送到应用层任务。这里我们在发送按键信息到应用层任务之前,就先将LED指示灯恢复到默认熄灭的状态。具体代码实现为调用一次LED闪烁函数——HalLedBlink( ),重新指定LED灯的状态为闪烁一次即停止闪烁:

void OnBoard_KeyCallback ( uint8 keys, uint8 state ){  ......  HalLedBlink( HAL_LED_2, 1, 50, 100 ); //停止闪烁  ......}
具体效果就是每次一旦松开按键,不管当前LED灯是什么状态,都会立即重新回到熄灭的状态。

三、实验验证

1、编译下载

本次实验验证只需要一个ZigBee设备即可完成,这里我们选择“CoordinatorEB”编译下载:

ZigBee TI ZStack CC2530 5.7 实例(三)多功能按键02-指示灯

2、实验现象

下载成功之后,除了有上一节中的实验现象之外,还可以看到LED指示灯同步闪烁!

此处实验现象在博客中不方便呈现,大家自己验证即可。源码请自行去文首或文末的百度网盘链接中下载。


(配套源码软件开发板等资源,可移步博客同名QQ群:拿破仑940911