在章节【
嵌入式软件开发:非阻塞按键读取_2】中,实现了利用FIFO缓冲区来缓存按键值,在主函数里面进行循环扫描FIFO里面是否有键值。
这里也可以利用事件队列机制来实现。
当按键按下时,产生一个按键事件,包括短按键事件,长按键事件。
想想如何添加一个事件??(三要素)
(1)静态初始化: static event_t keyPressEvent = EVENT_INIT(keyScanEvent);
(2)按键事件发生时,将其加入到事件队列中
(2)实现事件处理函数: static void keyScanEvent(void *data);
这里参数data 可以用来传递读取到的键值,在回调函数中,可以通过判断键值来确定按键按下的状态。
列代码:(黄色也新增的代码。)
主函数里,只需扫描按键,以及读取事件队列中是否有事件发生
-
int main(void)
-
{
-
//static int cnt = 0;
-
volatile static event_t* event;
-
board_init();
-
-
while(1)
-
{
-
event = EventQueue_GetPendingEvent();
-
if (event)
-
{
-
event->execute(event->data);
-
}
-
-
if(flag) // 10ms中断内,查询按键状态,用来消除按键抖动。
-
{
-
flag =0;
-
keyScan();
-
}
-
}
-
}
阅读(1613) | 评论(0) | 转发(0) |