按键 应用
1赞
发表于 2017/5/30 18:18:31
阅读(1462)
在项目开发中,会经常用到按键,很多人会觉得按键操作不就是GPIO嘛,没错对MCU来说就是GPIO,但是实际中按键可能会有多种用途,比如短按,长按,双击,组合按键等。
列举几种典型的用例:
1)应用1:使用一个按键,同时用到短按和长按的功能,比如实现,短按按键,屏幕亮灭切换,长按关机。
可以用如下方法实现,
bool poweroff_key_long_press_flag=false; void key_thread_entry(void* parameter) { ...... while(1) { key_scan(); rt_thread_delay( RT_TICK_PER_SECOND/20 ); /* sleep 0.05 second and switch to other thread */ } }
void key_scan(void) { if(GPIO_ReadPinInput(GPIOE,31U) == 0) { if(poweroff_key_press_flag == false) rt_timer_start(&timer_slcd_off); // 启动定时器 poweroff_key_press_flag = true; // 标记按键被按下过 } else if(poweroff_key_press_flag == true) // GPIO为高,同时按键被按下过 { poweroff_key_press_flag = false; if(poweroff_key_long_press_flag != true)// 短按 { rt_timer_stop(&timer_slcd_off); ......... // 开关屏幕 } else // 长按后弹起 { poweroff_key_long_press_flag =false; } } }
void timeout_poweroff_callbak(void* parameter) { PWR_CTL=0; // 在定时器回调函数里关机 poweroff_key_long_press_flag=true; }
实现的原理是:在key thread线程里使用轮询的方式判断GPIO的状态,认为长按的条件是: 一定时间间隔内,GPIO保持低电平。这里认为是短按的条件是:在规定长按的时间间隔内,按键由低电平变成了高电平。
2)应用2:使用一个按键,功能是短按一下切换一种用途,按住不松手时只认为是一次短按。
代码可以这么实现:
void key_scan(void) { static bool s_KeyCode; bool t_key_code; static uint8_t s_key_debounce_count; t_key_code = GPIO_Readfunction(); if((t_key_code == 0x01)||(t_key_code != s_KeyCode)) { s_key_debounce_count = 0; } else { if(++s_key_debounce_count == DEBOUNCE_SHORT_TIME)// 低电平时间到 { //................... 短按,处理 } } s_KeyCode = t_key_code; }
3)应用3:使用一个按键,功能是按下执行某种操作,一直不松,认为一直在按。
4) 应用4:使用一个按键, 区分单击和双击,
单击的条件是:一次短按操作后,一定时间间隔没有短按操作。
双击的条件是:2次短按间隔小于某个值,则2次短按作为一次双击事件,且两次短按都取消。