码迷,mamicode.com
首页 > 其他好文 > 详细

M4—按键识别

时间:2017-08-22 23:19:16      阅读:297      评论:0      收藏:0      [点我收藏+]

标签:处理   识别   键值   下拉   一个   str   return   delay   状态机   

三、KEY

3.1  初始化

  1.相应端口时钟使能

  2.配置GPIO为输入模式

  3.根据实际电路图 配置浮空输入,不用上下拉

 

3.2  按键识别

(1)一般按键步骤(延时消抖)

1. 判断相关的管脚是否为有效电平

2. 如果为有效电平,则进行消抖处理,如延时消抖(5~10ms)

3. 再次判断是否为有效电平.如果为有效电平,则确实是按键按下了,而不是干扰.

4. 识别到后做按键处理

5. 等待按键释放

//延时消抖

//返回键值

u8 key_scanf(void)

{

    u8 key=NO_KEY;

//  1.  判断相关的管脚是否为有效电平

    if(KEY1)

    {

     key_delay();  //延时消抖

     if(KEY1)      //再次判断

     {

         key = KEY1_OK;   

}

    while(KEY1);   //等待按键释放     

    }

    return key;   

}

  以上按键识别方式会导致效率低下:

1.  等待按键释放的过程,CPU什么都做不了,在这死等会导致效率较低;

2.  当识别到有效电平后延时消抖动过程中,CPU也什么都做不了,会导致效率低下。

 

(2)状态机处理按键识别

做一个标记。当这个标记为1的时候允许做按键识别。一旦识别到按键,则将这个标志清零。当作按键识别的时候发现按键是释放的,则又允许识别按键(将标志置1)。

u8 key_scanf(void)

{

    static u8 key_sta=1;   // key_sta=1允许识别按键

    u8 key=NO_KEY;

//  1.  判断相关的管脚是否为有效电平

    if((key_sta) && KEY1)  //允许识别按键,并且按键被按下了,才做按键识别

    {

      key_delay();         //2. 如果为有效电平,则延时消抖(5~10ms)

      if(KEY1)     //3.   再次判断是否为有效电平.如果为有效电平,则确实是按键按下了,而不是干扰.

       {

           key = KEY1_OK;     //4.  识别到后处理

           key_sta=0;         //不允许识别按键

       }

        

    }

    else if(!KEY1)     //按键被释放

    {

       key_sta=1;    //允许识别按键

    }

    return key;

}

 

(3)三次识别比较法

     3次识别,如果识别到都是有效电平,认为按键有被按下,如果识别过程中其中某次识别到的是无效电平,立即重新开始识别。

    最有高效的方法

 

按键识别:三次识别比较方式

//返回值:  按键键值

u8 key_scanf(void)

{

   static u8 key_sta=1;   // 标记:key_sta=1允许识别按键

   static u8 key1,key2,key3,key_count=0;

  //变量保存按键键值,key_count按键识别次数

   

   u8 key=NO_KEY;   //保存按键键值

   

   key3=key2;       //保存第一次识别的键值

   key2=key1;       //保存第二次识别的键值

   key_count++;

   

//  1.  判断相关的管脚是否为有效电平

//当允许识别按键,并且有按键被按下时,才做按键识别

   if((key_sta) &&(KEY1 || !KEY2 || !KEY3 || !KEY4)) 

   {

       if(KEY1)              //3.   再次判断是否为有效电平.如果为有效电平,则确实是按键按下了,而不是干扰.

      {

    key1 = KEY1_OK;   

       }

    else if(!KEY2)       //确定是否真的被按下

    {

       key1 = KEY2_OK; 

    }

    else if(!KEY3)

    {

       key1 = KEY3_OK; 

     }

    else if(!KEY4)

    {

       key1 = KEY4_OK; 

    }

    if(key_count==3)   //识别了三次

    {

       key_count=0;      //计数清零

       if((key3==key1)&& (key2==key1))//3次识别到的是同一个有效键值

       {

       key=key1;      //key 保存键值

       key_sta=0;    //不允许做按键识别

        }

     }    

    }

    else if(!KEY1 && KEY2  && KEY3  && KEY4)//所有的按键都被释放时,

    {

    key_sta=1;    //允许识别按键

    key_count=0;  //清除计数

    }

     return key;   //返回键值

}

 

M4—按键识别

标签:处理   识别   键值   下拉   一个   str   return   delay   状态机   

原文地址:http://www.cnblogs.com/qingbangbang/p/7413807.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!