zigbee z-stack实现按键的长按

Posted 绿叶清风

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了zigbee z-stack实现按键的长按相关的知识,希望对你有一定的参考价值。


按键流程参考


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 z-stack实现按键的长按的主要内容,如果未能解决你的问题,请参考以下文章

转: ZigBee/Z-Stack CC2530实现低功耗运行的配置简介

单纯使用js或者jq如何实现 手机web的长按事件 和按键事件

JS 监听键盘上某个键的长按事件。

TI的cc2530 z-stack协议栈简单问题

CC2530强化实训03定时器间隔定时实现按键长按与短按

Zigbee技术入门教程-号外基于Z-Stack协议栈的抢答系统