zigbee z-stack实现按键的长按
2017-04-10 14:18
281 查看
按键流程参考
P0_1 I/O口对应的按键无使用可以参考
由于按键检测有中断、和轮询两种方式,默认采用轮询方式,对于轮询方式的长按处理比较简单,利用松开的时间点和松下的时间点之间的时间差即可实现。对于中断的方式可以采用定时器方式,当中断触发的时候,开一个定时器,如果定时器到期了,按钮还是按下状态,就认为是长按。
void InitBoard( uint8 level )
{
if ( level == OB_COLD )
{
// Interrupts off
osal_int_disable( INTS_ALL );
// Turn all LEDs off
//HalLedSet( HAL_LED_ALL, HAL_LED_MODE_OFF );
// Check for Brown-Out reset
ChkReset();
}
else // !OB_COLD
{
/* Initialize Key stuff */
// OnboardKeyIntEnable = HAL_KEY_INTERRUPT_DISABLE;//配置成轮
OnboardKeyIntEnable = HAL_KEY_INTERRUPT_ENABLE;//配置成中断
HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback);
}
}
核心代码:
P0_1 I/O口对应的按键无使用可以参考
由于按键检测有中断、和轮询两种方式,默认采用轮询方式,对于轮询方式的长按处理比较简单,利用松开的时间点和松下的时间点之间的时间差即可实现。对于中断的方式可以采用定时器方式,当中断触发的时候,开一个定时器,如果定时器到期了,按钮还是按下状态,就认为是长按。
void InitBoard( uint8 level )
{
if ( level == OB_COLD )
{
// Interrupts off
osal_int_disable( INTS_ALL );
// Turn all LEDs off
//HalLedSet( HAL_LED_ALL, HAL_LED_MODE_OFF );
// Check for Brown-Out reset
ChkReset();
}
else // !OB_COLD
{
/* Initialize Key stuff */
// OnboardKeyIntEnable = HAL_KEY_INTERRUPT_DISABLE;//配置成轮
OnboardKeyIntEnable = HAL_KEY_INTERRUPT_ENABLE;//配置成中断
HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback);
}
}
核心代码:
#define KEY_HOLD_LONG_INTERVAL 3 static uint32 keyPressTime = 0; #define KEY_LONG_PRESS_TIME 1500 //3s #define KEY_LONG_PRESS_MSG_EVT 0x005F void SampleApp_HandleKeys( uint8 shift, uint8 keys ) { (void)shift; // Intentionally unreferenced parameter if (!Hal_KeyIntEnable)//轮询处理 { if ( keys & HAL_KEY_SW_1 )//p0_1 { if (keys == 0x01)//press down { keyPressTime = osal_getClock(); }else //press up { if (keyPressTime) { keyPressTime = (osal_getClock() - keyPressTime); if (keyPressTime >= KEY_HOLD_LONG_INTERVAL )//长按 { printf("long press... \r\n"); } else { printf("short press... \r\n"); HalLedSet(HAL_LED_G, HAL_LED_MODE_FLASH); } keyPressTime = 0; } } }else if ( keys & HAL_KEY_SW_2 )//p2_0 { } }else{//中断处理 if ( keys & HAL_KEY_SW_1 )//p0_1 { //..... osal_stop_timerEx(SampleApp_TaskID,KEY_LONG_PRESS_MSG_EVT); osal_start_timerEx( SampleApp_TaskID, KEY_LONG_PRESS_MSG_EVT, (KEY_LONG_PRESS_TIME)); //..... } } } //定时器事件处理 uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events ) { afIncomingMSGPacket_t *MSGpkt; (void)task_id; //..... if ( events & KEY_LONG_PRESS_MSG_EVT ){ printf("p1_0:%d ===\r\n",P0_1); if(P0_1 == 0){ printf("p0_1 long press... \rn"); }else{ } } //.... // Discard unknown events return 0; }
相关文章推荐
- ZigBee TI ZStack CC2530 5.6 实例(三)多功能按键01-实现
- ZigBee TI ZStack CC2530 3.14 按键驱动01-轮询模式
- ZigBee(Z-stack)四种绑定方式的程序实现方法
- ZigBee TI ZStack CC2530 5.7 实例(三)多功能按键02-指示灯
- ZigBee TI ZStack CC2530 3.15 按键驱动02-中断模式
- 转: ZigBee/Z-Stack CC2530实现低功耗运行的配置简介
- ZigBee TI ZStack CC2530 5.5 实例(三)多功能按键00-总
- GridView的几个事件(如实现: 行的双击/单击/捕捉键盘按键/鼠标悬浮/移出效果)(示例代码下载)
- 开发键盘过滤驱动实现模拟按键过程中遇到的问题___续
- Visual C# 2005实现控件中捕获按键
- 驱动中实现模拟键盘按键
- Stack Class 实现
- 通用的链式stack实现
- Asp.net 2.0 GridView的几个事件(如实现: 行的双击/单击/捕捉键盘按键/鼠标悬浮/移出效果)(示例代码下载)
- Asp.net 2.0 GridView的几个事件(如实现: 行的双击/单击/捕捉键盘按键/鼠标悬浮/移出效果)(示例代码下载)
- Visual C# 2005实现控件中捕获按键
- 数据结构之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java)
- 用java.util.*中的LinkedList实现stack
- 基于MIDP1.0实现组合按键
- GridView的几个事件(如实现: 行的双击/单击/捕捉键盘按键/鼠标悬浮/移出效果)(示例代码下载)