三、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—按键识别的更多相关文章

  1. stm32按键识别

    刚写了一个关于stm32单片机的按键识别的程序.目的,同时识别多个按键,并且不浪费cpu的时间. 关于去抖动,以前以为是在按键的时候,手会抖动.通过程序验证,这个确实是误解.这个应该是防止意外干扰.以 ...

  2. 【audio】耳机插拔 线控按键识别流程【转】

    耳机插拔/线控按键识别流程 耳机插拔/线控按键识别流程 1.文档概述 本文以msm8909平台,android N为例,介绍了通用情况下,耳机插拔的流程步骤,以及对耳机类型的识别逻辑.以方便在项目工作 ...

  3. STM8S---外部中断应用之长按键识别

    STM8经常使用中断指令 开总中断 _asm("rim"); 禁止中断 _asm("sim"); 进入停机模式 _asm("halt"); ...

  4. bnu 4352 XsugarX的疯狂按键识别(暴力模拟)

    http://www.bnuoj.com/bnuoj/problem_show.php?pid=4352 [题意]:给你个长串,输出该长串中能第一放出的技能,每个技能有对应的一个小子串,不能放出任何技 ...

  5. AD按键-矩阵按键-独立按键:

    原理:利用数组分压+AD采集: 优点:一个IO口可以做成多个按键,节省IO口(矩阵键盘在>4时优点才能体现出来):可备用作为AD基准输入. 缺点:不能做成组合按键(或者电阻要精确选择):且离IO ...

  6. C语言实现五子棋简单功能

    /******************************************************************** C-4.29-1: 实现五子棋游戏 操作说明:用方向键或者& ...

  7. 自制操作系统Antz(11)——实现shell(下)命令响应

    我已经规范了系统代码风格,类似于按照linux分包,把各部分功能区分开了 Antz系统更新地址 Linux内核源码分析地址 Github项目地址 在之前的任务中,我们已经通过直接操作显卡驱动完成了简单 ...

  8. 自制操作系统Antz(10)——实现shell(上)

    我已经规范了系统代码风格,类似于按照linux分包,把各部分功能区分开了 Antz系统更新地址 Linux内核源码分析地址 Github项目地址 在之前的任务中,我们已经通过直接操作显卡驱动完成了简单 ...

  9. 三色灯渐变DIY制作

    小编前几天查资料,怎么使用12864屏幕的用法,突然发觉微博是个好东西,随着自己的成长,学习了很多的知识,没有做笔记的习惯,只是习惯把用到的硬件,传感器,资料写到程序的备注内,但感觉,用到时不是那么方 ...

随机推荐

  1. Samba远程代码执行漏洞(CVE-2017-7494)本地复现

    一.复现环境搭建 搭建Debian和kali两个虚拟机: 攻击机:kali (192.168.217.162): 靶机:debian (192.168.217.150). 二.Debian安装并配置s ...

  2. CSS 样式书写规范

    可能不同团队都有各自的规范,又或者很多人在写 CSS 的时候还是想到什么就写什么,不存在太多的约束. 我觉得 CSS 代码规范还是有存在的必要的,尤其是在团队配合,多人协作下,规范就显得尤为重要. 本 ...

  3. CJOJ 2040 【一本通】分组背包(动态规划)

    CJOJ 2040 [一本通]分组背包(动态规划) Description 一个旅行者有一个最多能用V公斤的背包,现在有n件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为C1,C2, ...

  4. JS的get和set使用示例

    javascript中set与get方法详解 其中get与set的使用方法: 1.get与set是方法,因为是方法,所以可以进行判断. 2.get是得到 一般是要返回的   set 是设置 不用返回 ...

  5. 事务之使用JDBC进行事务的操作2

    本篇将讲诉如何使用JDBC进行数据库有关事务的操作.在上一篇博客中已经介绍了事务的概念,和在MySQL命令行窗口进行开启事务,提交事务以及回滚事务的操作. 似乎事务和批处理都可以一次同时执行多条SQL ...

  6. Django--Uploaded Files以及Handlers

    一.表示已经上传的文件(uploaded files)的类 表示已经上传的文件的类有下面几个: class UploadedFile 在文件上传的期间,实际的文件数据被存储在request.FILES ...

  7. hadoop全分布式环境搭建

    本文主要介绍基本的hadoop的搭建过程.首先说下我的环境准备.我的笔记本使用的是Windows10专业版,装的虚拟机软件为VMware WorkStation Pro,虚拟机使用的系统为centos ...

  8. 华为OJ之自动售货系统

    本题主要难点有两部分: 1,找零算法.如何找零应该是最具技巧性的部分,根据已有的硬币金额分布,对应的解决办法可能会有不同.本题中的1,2,5,10这种情况满足贪心性质,故我们简单的用贪心算法的思想来解 ...

  9. 51nod_1100:斜率最大

    题目链接 斜率最大点对横坐标必相邻 #include <bits/stdc++.h> using namespace std; ; struct point { int x, y, pos ...

  10. (转)SqlServer基础之(触发器)(清晰易懂)

    阅读目录 一:触发器的优点 二:触发器的作用 三:触发器的分类 四:触发器的工作原理 五:创建触发器 六:管理触发器 概念:   触发器(trigger)是SQL server 提供给程序员和数据分析 ...