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 }

浙公网安备 33010602011771号