Z-stack中对按键的处理

 

       在基于Z-stack的应用程序设计中,HAL(硬件抽象层)是这样运行的:

void osalInitTasks( void )

{……

  Hal_Init( taskID++ );

……

}

        打开  Hal_Init( ),似乎什么也没有做,只是完成了一件事情,给这个任务一个ID,实际上,对硬件的初始化的工作,在任务启动之前都已经开始做了,任务的运行,只是可以接收发给它的事件和消息。

       那么,在HAL任务运行之前,系统对任务做了些什么呢?

       当然是初始化。在ZMain.c文件中,有main函数,这是所有程序的入口。由于硬件是所有程序运行的基础,在这里要完成两个重要的函数:

  // Initialize board I/O

  InitBoard( OB_COLD );

  // Initialze HAL drivers

  HalDriverInit();

        显然,它们的执行时间是早于任务的运行,在InitBoard()完成对板级I/O的设置。进去看一下:

void InitBoard( byte level )

{

  if ( level == OB_COLD )

  {

    // Interrupts off

    osal_int_disable( INTS_ALL );

 

  }

  else  // !OB_COLD

  {

    OnboardKeyIntEnable = HAL_KEY_INTERRUPT_DISABLE;

    HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback);

  }

}

         代码太多,不再全部列出,主要是完成对Led。Timer和key的配置。这里重点看按键有关的。由于InitBoard函数的参数是OB_COLD,郁闷的HalKeyConfig()没有机会运行。

         在经过耐心的等待之后,main()需要再次对开发板初始化,调用函数:

        InitBoard( OB_READY );

         机会来了,这时可以处理按键了,

HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback)函数可以运行,在该函数中定义了是以中断的方式还是以查询的方式检测按键的状态,如果是查询方式,使用:

osal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT, HAL_KEY_POLLING_VALUE);

        延迟100ms后向任务Hal_TaskID发送一个事件。在事件处理代码中使用函数

HalKeyPoll()查询是否有按键按下。

       如果是中断方式,使用

osal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT, HAL_KEY_DEBOUNCE_VALUE);

       延迟25ms后使用函数HalKeyPoll()获取按键值。

 

更多内容,访问zigbee技术网www.wsnzigbee.com

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值