(配套源码、软件、开发板等资源,可移步博客同名QQ群/TB店铺:拿破仑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”编译下载:
2、实验现象
下载成功之后,除了有上一节中的实验现象之外,还可以看到LED指示灯同步闪烁!
此处实验现象在博客中不方便呈现,大家自己验证即可。源码请自行去文首或文末的百度网盘链接中下载。
(配套源码、软件、开发板等资源,可移步博客同名QQ群/TB店铺:拿破仑940911)