三、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. Asp.net MVC-3-执行过程

    本篇主要讲述MVC处理请求时创建Controller和执行Action的完整过程. 创建Controller 先查看MvcHandler中处理请求的方法BeginProcessRequest: pro ...

  2. Go学习笔记(一)Let's 干吧

    加 Golang学习 QQ群共同学习进步成家立业 ^-^ 群号:96933959 简介     Go是Google开发的一种 静态强类型.编译型,并发型,并具有垃圾回收功能的编程语言.为了方便搜索和识 ...

  3. LInux基础命令分类

    1. 命令的概念 命令的执行过程 系统第一次执行外部命令时Hash缓存表为空,系统会先从PTAH路径下寻找命令,找到后会将路径加入到Hasa缓存中,当再次执行此命令时会直接从Hash的路径下执行,如果 ...

  4. java Semaphore的介绍和使用

    一个计数信号量.从概念上讲,信号量维护了一个许可集.如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可.每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者. ...

  5. java设计模式 01 开山篇

    一. 设计模式概述 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. ...

  6. LoadRunner压力测试之Unique Number参数类型、Random Number参数类型浅析

    前几天工作需要用LoadRunner进行压力测试,期间对手机号进行参数化设置. 当时选用了<Value>137{Random_quhao}{Unique_weiyi}</Value& ...

  7. js数组拍平

    js数组拍平 var arr=[1,[[[7,2],8,9],3]]; function f(arr) { if (Object.prototype.toString.call(arr) != &qu ...

  8. FZU 2256 迷宫

    https://vjudge.net/problem/FZU-2256 题意:略 思路: 在比赛的时候想到了一次dfs,一次bfs但是样例都过不了...赛后才知道,距离的更新必须同步,不能先把时光机的 ...

  9. ZigZag - 曲折字符串

    需求:将所给的字符串以“倒N型”输出,可以指定输出的行数函数 String convert(String s, int numRows)例如输入“abcdefghijklnmopqrstuvwxyz” ...

  10. hdu_1711: Number Sequence【KMP算法】

    题目链接 此次插播点笔记 hdu中点击蓝色的"Compilation Error"可以查看自己是为什么CE的 hdu中提交的话,语言选择G++可以使用<bits/stdc++ ...