赞
踩
原文链接:http://blog.csdn.net/a369000753/article/details/51312839(转载文章,若有不妥,通知后我会立即删除)
首先来分析下主要的代码
这里来分析下bsp_event_to_button_action_assign()函数,其中uint32_t button 是数组m_events_list的下标。可见如果在次初始化的时候可能把 event给改变。
为什么这里 event = (action == BSP_BUTTON_ACTION_PUSH) ? (bsp_event_t)(BSP_EVENT_KEY_0 + button) : BSP_EVENT_NOTHING;是这样 ,请看下面
这样就可以找到对应的小标 事件的case事件
上面既是给对应的长按,释放,短按事件赋值对应的事件。。同一个m_events_list只能同时有一个赋值。
配置端口:
app_button_init((app_button_cfg_t *)app_buttons,
BUTTONS_NUMBER,
ticks_per_100ms / 2);
BUTTONS_NUMBER:设置按键的个数,
ticks_per_100ms / 2 :消痘痘事件
app_buttons参数,游侠可见,需要配置哪个端口,低电平(false)还是高电平(ture)有效,管脚模式(上下拉等等),对应的回调函数
//创建一个按键事件,用于长按的时候计数,请查看下面长按事件,
err_code = app_timer_create(&m_button_timer_id,
APP_TIMER_MODE_SINGLE_SHOT,
button_timer_handler);
每次中断来了就会跳到:
void GPIOTE_IRQHandler(void) 中断入口函数,然后跳到
这里来分析下如何实现长按和段按的。
如果是长按, event = m_events_list[button].push_event; event是0(即BSP_EVENT_NOTHING),-->m_events_list[button].long_push_event不等于BSP_EVENT_NOTHING,然后会产生长按扫描事件m_button_timer_id-->赋值释放事件,如果长按没有到设定的时间则产生释放按键事件,停止app_timer_stop(m_button_timer_id);
注意:BSP_MS_TO_TICK(BSP_LONG_PUSH_TIMEOUT_MS)是长按的时间,设置这个参数可以改变长按的事件。
如果是短接事件, event = m_events_list[button].push_event; 不为0为定义的事件,-->m_events_list[button].long_push_event 等于 BSP_EVENT_NOTHING-->赋值释放按键事件。
m_registered_callback(event); 这个函数即:bsp_event_handler函数-,(请查阅上面 bsp_init()函数)
长按事件,时间到了,产生button_timer_handler事件
就是产生对应的长按事件。
注意:启动长按扫描的时候err_code = app_timer_start(m_button_timer_id, BSP_MS_TO_TICK(BSP_LONG_PUSH_TIMEOUT_MS), (void*)¤t_long_push_pin_no);
current_long_push_pin_no 这个参数也传进去了,这个就是哪个管脚。方便产生长按超时的时候把哪个长按参数传进去,
看代码:bsp_init()函数
这里穿进去的参数是BSP_BUTTON_ACTION_PUSH 和 BSP_EVENT_DEFAULT
函数bsp_event_to_button_action_assign()里面
可以看到只有当设置为BSP_BUTTON_ACTION_PUSH 和BSP_EVENT_DEFAULT的时候,event才有值不然为0.那假如要设置长按怎么办呢?
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。