按键 应用
1赞
发表于 5/30/2017 6:18:31 PM
阅读(2198)
在项目开发中,会经常用到按键,很多人会觉得按键操作不就是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次短按作为一次双击事件,且两次短按都取消。
