M4—按键识别

三、KEY

3.1  初始化

  1.相应端口时钟使能

  2.配置GPIO为输入模式

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

 

3.2  按键识别

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

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

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

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

4. 识别到后做按键处理

5. 等待按键释放

 1 //延时消抖
 2 
 3 //返回键值
 4 
 5 u8 key_scanf(void)
 6 
 7 {
 8 
 9     u8 key=NO_KEY;
10 
11 //  1.  判断相关的管脚是否为有效电平
12 
13     if(KEY1)
14 
15     {
16 
17      key_delay();  //延时消抖
18 
19      if(KEY1)      //再次判断
20 
21      {
22 
23          key = KEY1_OK;   
24 
25 }
26 
27     while(KEY1);   //等待按键释放     
28 
29     }
30 
31     return key;   
32 
33 }  

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

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

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

 

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

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

 1 u8 key_scanf(void)
 2 
 3 {
 4 
 5     static u8 key_sta=1;   // key_sta=1允许识别按键
 6 
 7     u8 key=NO_KEY;
 8 
 9 //  1.  判断相关的管脚是否为有效电平
10 
11     if((key_sta) && KEY1)  //允许识别按键,并且按键被按下了,才做按键识别
12 
13     {
14 
15       key_delay();         //2. 如果为有效电平,则延时消抖(5~10ms)
16 
17       if(KEY1)     //3.   再次判断是否为有效电平.如果为有效电平,则确实是按键按下了,而不是干扰.
18 
19        {
20 
21            key = KEY1_OK;     //4.  识别到后处理
22 
23            key_sta=0;         //不允许识别按键
24 
25        }
26 
27         
28 
29     }
30 
31     else if(!KEY1)     //按键被释放
32 
33     {
34 
35        key_sta=1;    //允许识别按键
36 
37     }
38 
39     return key;
40 
41 }

 

(3)三次识别比较法

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

    最有高效的方法

 

  1 按键识别:三次识别比较方式
  2 
  3 //返回值:  按键键值
  4 
  5 u8 key_scanf(void)
  6 
  7 {
  8 
  9    static u8 key_sta=1;   // 标记:key_sta=1允许识别按键
 10 
 11    static u8 key1,key2,key3,key_count=0;
 12 
 13   //变量保存按键键值,key_count按键识别次数
 14 
 15    
 16 
 17    u8 key=NO_KEY;   //保存按键键值
 18 
 19    
 20 
 21    key3=key2;       //保存第一次识别的键值
 22 
 23    key2=key1;       //保存第二次识别的键值
 24 
 25    key_count++;
 26 
 27    
 28 
 29 //  1.  判断相关的管脚是否为有效电平
 30 
 31 //当允许识别按键,并且有按键被按下时,才做按键识别
 32 
 33    if((key_sta) &&(KEY1 || !KEY2 || !KEY3 || !KEY4)) 
 34 
 35    {
 36 
 37        if(KEY1)              //3.   再次判断是否为有效电平.如果为有效电平,则确实是按键按下了,而不是干扰.
 38 
 39       {
 40 
 41     key1 = KEY1_OK;   
 42 
 43        }
 44 
 45     else if(!KEY2)       //确定是否真的被按下
 46 
 47     {
 48 
 49        key1 = KEY2_OK; 
 50 
 51     }
 52 
 53     else if(!KEY3)
 54 
 55     {
 56 
 57        key1 = KEY3_OK; 
 58 
 59      }
 60 
 61     else if(!KEY4)
 62 
 63     {
 64 
 65        key1 = KEY4_OK; 
 66 
 67     }
 68 
 69     if(key_count==3)   //识别了三次
 70 
 71     {
 72 
 73        key_count=0;      //计数清零
 74 
 75        if((key3==key1)&& (key2==key1))//3次识别到的是同一个有效键值
 76 
 77        {
 78 
 79        key=key1;      //key 保存键值
 80 
 81        key_sta=0;    //不允许做按键识别
 82 
 83         }
 84 
 85      }    
 86 
 87     }
 88 
 89     else if(!KEY1 && KEY2  && KEY3  && KEY4)//所有的按键都被释放时,
 90 
 91     {
 92 
 93     key_sta=1;    //允许识别按键
 94 
 95     key_count=0;  //清除计数
 96 
 97     }
 98 
 99      return key;   //返回键值
100 
101 }

 

posted @ 2017-08-22 21:36  Tsing邦  阅读(1064)  评论(0)    收藏  举报