查看: 9257|回复: 10

ZStack-按键终结者

[复制链接]
lhdzwkk 发表于 2011-12-9 10:59:06 | 显示全部楼层 |阅读模式
本帖最后由 lhdzwkk 于 2011-12-9 11:03 编辑

谁都能看懂,初学者请进:
希望不论谁有ZStack中关于按键的疑问看了这个贴都能得到解决,有疑问继续提,慢慢完善,
希望能讨论的东西都在这里讨论了,大家的力量才威武
过一会就要去渡船回家了,我这里只发一个按键长按的代码和简单注解,有空再完善
关于这方面的帖子和教程不少,或许你还可以看看这个:
http://user.qzone.qq.com/744721131/blog/1323374520
 楼主| lhdzwkk 发表于 2011-12-9 11:01:06 | 显示全部楼层
本帖最后由 lhdzwkk 于 2011-12-12 09:41 编辑

单个按键长按:
多定义一个变量:
  1. static uint8 halKeySavedKeys;     /* used to store previous key state in polling mode */
  2. static uint8 halKeySameKeyCnt;     /* used to store previous key same state cnt in polling mode *///20110621
复制代码
初始化:
  1. void HalKeyInit( void )
  2. {
  3.   /* Initialize previous key to 0 */
  4.   halKeySavedKeys = 0;
  5.   halKeySameKeyCnt =0;
复制代码
修改poll函数:
  1. void HalKeyPoll (void)
  2. {
  3.   //20110621对轮询的做了修改,支持长按
  4.   //都改为低电平触发
  5.   //不对中断方式有影响和改变
  6.   //20111026对中断做了修改,支持单键的长按
  7.   uint8 keys = 0;
  8. #if (0)
  9.   if ((HAL_KEY_JOY_MOVE_PORT & HAL_KEY_JOY_MOVE_BIT))  /* Key is active HIGH */
  10.   {
  11.     keys = halGetJoyKeyInput();
  12.   }
  13. #endif
  14.   /* If interrupts are not enabled, previous key status and current key status
  15.    * are compared to find out if a key has changed status.
  16.    */
  17.   if (HAL_PUSH_BUTTON1())
  18.   {
  19.     keys |= HAL_KEY_SW_6;
  20.   }
  21.   if (!Hal_KeyIntEnable)
  22.   {
  23.     if (keys == halKeySavedKeys)
  24.     {
  25.       /* Exit - since no keys have changed */
  26.       //keke//check no change cnt
  27.       if(keys)
  28.       {
  29.         halKeySameKeyCnt++;//再次轮询后keys值不变
  30.         HalLcdWriteStringValue("KEYDOWN=",halKeySameKeyCnt,10,3);
  31.       }
  32.       else
  33.       {
  34.         halKeySameKeyCnt=0;
  35.       }
  36.       //--
  37.       if(halKeySameKeyCnt==20)
  38.       {
  39.         if(pHalKeyProcessFunction)
  40.         {
  41.           (pHalKeyProcessFunction) (keys, HAL_KEY_STATE_SHIFT);//区别于短按的传递参数
  42.           //(pHalKeyProcessFunction) (keys, HAL_KEY_STATE_NORMAL);//短按对应HAL_KEY_STATE_NORMAL
  43.         }
  44.         //halKeySameKeyCnt=0;
  45.         //halKeySavedKeys=0;
  46.         keys=0;
  47.       }
  48.       return;
  49.     }
  50.     else
  51.     {
  52.       if(halKeySavedKeys && (pHalKeyProcessFunction)&&(halKeySameKeyCnt<20))//我们认为halKeySavedKeys为0,而keys不为0是最初按下状态,需要等按键弹起
  53.       {
  54.         (pHalKeyProcessFunction) (halKeySavedKeys, HAL_KEY_STATE_NORMAL);
  55.       }
  56.       halKeySameKeyCnt=0;
  57.     }
  58.     /* Store the current keys for comparation next time */
  59.     halKeySavedKeys = keys;
  60.     return;
  61.   }
  62.   else
  63.   {
  64.    HalLcdWriteStringValue("KEYDOWN=",halKeySameKeyCnt,10,3);
  65.     /* Key interrupt handled here */
  66.     if((halKeySavedKeys==0)&&(keys))//按下
  67.     {
  68.         osal_start_timerEx( Hal_TaskID, HAL_KEY_EVENT, 100);
  69.         halKeySavedKeys = keys;
  70.         return;
  71.     }
  72.     else if((keys)&&(keys == halKeySavedKeys))//按着
  73.     {
  74.       halKeySameKeyCnt++;
  75.       osal_start_timerEx( Hal_TaskID, HAL_KEY_EVENT, 100);
  76.       if(halKeySameKeyCnt==20)
  77.       {
  78.         if(pHalKeyProcessFunction)
  79.         {
  80.           (pHalKeyProcessFunction) (keys, HAL_KEY_STATE_SHIFT);
  81.           //(pHalKeyProcessFunction) (keys, HAL_KEY_STATE_NORMAL);
  82.         }
  83.         //halKeySameKeyCnt=0;
  84.         //halKeySavedKeys=0;
  85.         //keys=0;
  86.         //osal_stop_timerEx(Hal_TaskID, HAL_KEY_EVENT);  /* Cancel polling if active */
  87.       }
  88.       return;
  89.     }
  90.     else if((halKeySavedKeys)&&(keys==0))//弹起
  91.     {
  92.       if((pHalKeyProcessFunction)&&(halKeySameKeyCnt<20))
  93.       {
  94.         (pHalKeyProcessFunction) (halKeySavedKeys, HAL_KEY_STATE_NORMAL);
  95.       }
  96.       halKeySameKeyCnt=0;
  97.       halKeySavedKeys = keys;
  98.       //osal_stop_timerEx(Hal_TaskID, HAL_KEY_EVENT);  /* Cancel polling if active */
  99.       return;
  100.     }
  101.   }



  102.   /* Invoke Callback if new keys were depressed */
  103.   if (keys && (pHalKeyProcessFunction))
  104.   {
  105.     (pHalKeyProcessFunction) (keys, HAL_KEY_STATE_NORMAL);
  106.   }
  107. }
复制代码
应用层代码:
  1. void DEMO_HandleKeys( byte shift, byte keys )
  2. {
  3.   if ( shift )
  4.   {
  5.     if ( keys & HAL_KEY_SW_6 )
  6.     {
  7.       #if defined ( LCD_SUPPORTED )
  8.         HalLcdWriteString( "KEY=long", 3 );
  9.         //HalLcdWriteStringValue("netid",_NIB.nwkPanId,16,2);//实时的panid
  10.       #endif
  11.     }
  12.   }
  13.   else
  14.   {
  15.     if ( keys & HAL_KEY_SW_6 )
  16.     {
  17.     #if defined ( LCD_SUPPORTED )
  18.       HalLcdWriteString( "KEY=short", 3 );
  19.     #endif
  20.     }
  21.   }
  22. }
复制代码
yjwpm 发表于 2012-8-13 16:39:10 | 显示全部楼层
十分感谢,新手学习中
lizheng86312 发表于 2012-8-29 11:56:55 | 显示全部楼层
学到东西了。顶。。。
wslb 发表于 2012-11-24 18:51:09 | 显示全部楼层
初学,还有一些不是很懂,弱弱的问一下void HalKeyPoll (void)相当于按键指令表,是吗?但在应用层具体怎么调用,不是看的很明白,求楼主指点

kmalachen 发表于 2012-12-13 17:06:24 | 显示全部楼层
大侠的无私奉献,新手表示十分感谢。
恰同学少年 发表于 2013-1-18 11:27:56 | 显示全部楼层
楼主你好!
我在做sensorDemo试验中,有一个想法,就是想把按键屏蔽,想让collector自动选择成为 协调器、然后自动绑定——即不使用按键。
请问楼主有什么思路没有?
恰同学少年 发表于 2013-1-18 11:32:53 | 显示全部楼层
我就把 zb_HandleKeys 中的 状态、绑定代码剪切到 OSAL中了,再加上头文件、定义后,眼看编译成功,却出现错误:

仔细看的话,是linker错误,再看看发现是.r51文件出现重复,所以我不知道如何改?


我听网友说不要修改zmain中的文件,所以我又把 绑定等代码写到 collector中了,我放在了
void zb_HandleOsalEvent( uint16 event )
中,
但编译成功运行错误,这是怎么回事?
恳请“终结者”帮我分析下,把按键“终结”了,谢谢啦~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
恰同学少年 发表于 2013-1-18 11:35:07 | 显示全部楼层
附:楼主我剪切是这段代码,不知对不?
#ifdef COORDINATOR
    if ( keys & HAL_KEY_SW_7 )//当按下K3后,设置为协调器,
#endif
#ifdef ROUTER
      if ( keys & HAL_KEY_SW_1 )  //如果是路由器时,按下K3相当于 什么也没做-然
#endif
    {
      if ( appState == APP_INIT  )
      {
        // Key 1 starts device as a coordinator
        logicalType = ZG_DEVICETYPE_COORDINATOR;
        zb_WriteConfiguration(ZCD_NV_LOGICAL_TYPE, sizeof(uint8), &logicalType);
               
        // Reset the device with new configuration
        zb_SystemReset();
      }
    }
    //if ( keys & HAL_KEY_SW_2 )
    if ( keys & HAL_KEY_SW_6)//按下K1,打开绑定,节点工作在Gateway模式
    {
      allowBind ^= 1;
      if (allowBind)
      {
        // Turn ON Allow Bind mode infinitly
        zb_AllowBind( 0xFF );
        HalLedSet( HAL_LED_2, HAL_LED_MODE_ON );
        //This node is the gateway node
        isGateWay = TRUE;
        
        // Update the display
        #if defined ( LCD_SUPPORTED )
        HalLcdWriteString( "Gateway Mode", HAL_LCD_LINE_2 );
        #endif
      }
      else
      {
        // Turn OFF Allow Bind mode infinitly
        zb_AllowBind( 0x00 );
        HalLedSet( HAL_LED_2, HAL_LED_MODE_OFF );
        isGateWay = FALSE;
        
        // Update the display
        #if defined ( LCD_SUPPORTED )
        HalLcdWriteString( "Collector", HAL_LCD_LINE_2 );
        #endif
      }
    }
————————————————————————————————
当然把按键地方全部注释掉啦~~~~
345161974 发表于 2013-1-24 10:57:18 | 显示全部楼层
mark,学习了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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