wuyage

按键 应用

1
阅读(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次短按作为一次双击事件,且两次短按都取消。




Baidu
map