M4—按键识别
三、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—按键识别的更多相关文章
- stm32按键识别
刚写了一个关于stm32单片机的按键识别的程序.目的,同时识别多个按键,并且不浪费cpu的时间. 关于去抖动,以前以为是在按键的时候,手会抖动.通过程序验证,这个确实是误解.这个应该是防止意外干扰.以 ...
- 【audio】耳机插拔 线控按键识别流程【转】
耳机插拔/线控按键识别流程 耳机插拔/线控按键识别流程 1.文档概述 本文以msm8909平台,android N为例,介绍了通用情况下,耳机插拔的流程步骤,以及对耳机类型的识别逻辑.以方便在项目工作 ...
- STM8S---外部中断应用之长按键识别
STM8经常使用中断指令 开总中断 _asm("rim"); 禁止中断 _asm("sim"); 进入停机模式 _asm("halt"); ...
- bnu 4352 XsugarX的疯狂按键识别(暴力模拟)
http://www.bnuoj.com/bnuoj/problem_show.php?pid=4352 [题意]:给你个长串,输出该长串中能第一放出的技能,每个技能有对应的一个小子串,不能放出任何技 ...
- AD按键-矩阵按键-独立按键:
原理:利用数组分压+AD采集: 优点:一个IO口可以做成多个按键,节省IO口(矩阵键盘在>4时优点才能体现出来):可备用作为AD基准输入. 缺点:不能做成组合按键(或者电阻要精确选择):且离IO ...
- C语言实现五子棋简单功能
/******************************************************************** C-4.29-1: 实现五子棋游戏 操作说明:用方向键或者& ...
- 自制操作系统Antz(11)——实现shell(下)命令响应
我已经规范了系统代码风格,类似于按照linux分包,把各部分功能区分开了 Antz系统更新地址 Linux内核源码分析地址 Github项目地址 在之前的任务中,我们已经通过直接操作显卡驱动完成了简单 ...
- 自制操作系统Antz(10)——实现shell(上)
我已经规范了系统代码风格,类似于按照linux分包,把各部分功能区分开了 Antz系统更新地址 Linux内核源码分析地址 Github项目地址 在之前的任务中,我们已经通过直接操作显卡驱动完成了简单 ...
- 三色灯渐变DIY制作
小编前几天查资料,怎么使用12864屏幕的用法,突然发觉微博是个好东西,随着自己的成长,学习了很多的知识,没有做笔记的习惯,只是习惯把用到的硬件,传感器,资料写到程序的备注内,但感觉,用到时不是那么方 ...
随机推荐
- 轻量级代码生成器-OnlyCoder 第二篇
最近利用业余时间将OnlyCoder又重新打造了一番,使其使用起来更简单.更顺手. 相关的帮助文档也已发布了版本. 界面改版,UI采用了DotNetBar2组件. 还是先看下UI效果吧. 由于使用了 ...
- Redis配置文件redis.conf参数配置详解
########################################## 常规 ########################################## daemonize n ...
- Oracle 左连接 left join、右连接right join说明
Oracle 左.右连接 + 在等号 左边表示右连接 获取右表所有记录,即使左表没有对应匹配的记录. + 在等号 右边表示左连接 获取左表所有记录,即使右表没有对应匹配的记录. 例子: selec ...
- 关于非阻塞connnect的看法
关于非阻塞connnect的总结 在面试题中,看到有关于阻塞connect和非阻塞connect的区别: 显然,我们可以从阻塞和非阻塞的意思来回答,既然是阻塞,那么执行connect的操作会一直阻塞到 ...
- 实时音视频互动系列(上):又拍云UTUN网络详解
如何定义实时音视频互动, 延迟 400ms 内才能无异步感 实时音视频互动如果存在1秒左右的延时会给交流者带来异步感,必须将视频播放延迟限制在400ms以内,才能给用户较好的交互体验. 当延迟控制在4 ...
- spring框架-spring.xml配置文件
运行的时候会报错的,因为写到<bean>标签里面去了,肯定会报错的,要记得把注释删掉,就不会报错了,这样写注释是为了方便下次自己看. <?xml version="1.0& ...
- 移动端em与rem区别
rem与em都是相对单位,我们使用它们的目的就是为了适应各种手机屏幕. rem是根据html根节点来计算的,而em是继承父元素的字体.比如下面一个demo <!doctype html> ...
- 如何在通过knockout数据绑定的DOM元素上添加事件
通过knockout数据绑定的DOM元素,通过chrome控制台打断点知道,DOM元素会被暂时隐藏,使用document.querySelector()是获取不到的,会显示null,直到数据绑定完成才 ...
- Java 9 揭秘(17. Reactive Streams)
Tips 做一个终身学习的人. 在本章中,主要介绍以下内容: 什么是流(stream) 响应式流(Reactive Streams)的倡议是什么,以及规范和Java API 响应式流在JDK 中的AP ...
- SignalR在ASP.NET MVC中的应用
一.简介 ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程.实时 Web 功能是指这样一种功能:当所连接的客户端变得 ...