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;   //返回键值

}

时间: 2024-08-25 03:03:37

M4—按键识别的相关文章

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

STM8常用中断指令 开总中断 _asm("rim"); 禁止中断 _asm("sim"); 进入停机模式 _asm("halt"); 中断返回 _asm("iret"); 等待中断 _asm("wfi"); 软件中断 _asm("trap"); STM8S常用中断映射 如使用中断函数时,可以通过在上图中查找相对应的中断向量号,而中断函数的名字可以自定义 /* BASIC INTERRU

stm32按键识别

刚写了一个关于stm32单片机的按键识别的程序.目的,同时识别多个按键,并且不浪费cpu的时间. 关于去抖动,以前以为是在按键的时候,手会抖动.通过程序验证,这个确实是误解.这个应该是防止意外干扰.以我的手按键的速度,单次持续时间小于0.2秒钟. 前提:引脚低电平为按键按下.为每个按键设置3个变量,分别是识别过程的计数器keycnt.识别的结果keystat.可以判定的结果keymod(比如按下.释放.单击.双击.长按等). 本例 只有单击一种判断,keymod暂时不用.另外考虑,按键判定后,直

矩阵按键的组合按键触发

/***12个按键,每一个按键都会让蜂鸣器发出“嘀”的一声, 同时按下S1和S12会点亮一个LED灯,同时按下***/#include "REG52.H"#define const_voice_short 40#define const_key_time 12#define const_key_time_comb 14 //组合按键去抖动延时时间void initial_myself();void initial_peripheral();void delay_long(unsigne

【转】 矩阵键盘的工作原理

在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,在矩阵键盘中每条水平线和垂直线在交叉处不直接相连,而是通过一个按键相连接,这样在由N条水平线和M条垂直线最多可以有N *M 个按键,大大的减少了对于芯片I/O的占用. 键盘矩阵的按键识别方法 图1   矩阵键盘的结构 方法一 行扫描法 1.判断键盘中有无键按下 将全部行线P1.4-P1.7置低电平,当然P1.0-P1.3为高电平(或许芯片内部已经将这些引脚它上拉),然后检测列线的状态.只要有一列的电平为低,则表示键盘中有键

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

/******************************************************************** C-4.29-1: 实现五子棋游戏 操作说明:用方向键或者"w","s","a","d"控制棋子放置位置, 使用空格键放置棋子,使用“ESC”键退出游戏 测试环境:Redhat5.5 *****************************************************

IVR交互式语音应答系统

ZingServ平台IVR子系统介绍 IVR系统的中文译名为"交互式语音应答系统",然而,真正的IVR系统早已超出这种中文译名所描述的功能范围--IVR是一种功能强大的电话自动服务系统.对用户来说,只有理解了这一点,才能真正了解IVR系统的价值:而对产品提供商来说,也只有理解了这一点,才能真正明确产品的应用范围和设计目标. 在ZingServ一体化呼叫中心平台中,IVR首先是一个子系统,它与其他子系统协同来实现一个呼叫中心平台的标准功能:其次它又是一个可以单独运行.维护和升级的独立系统

机器人视觉导航工作总结

1.SLAM技术 SLAM 全称 Simultaneous Localization and Mapping,中文名曰「同步定位与地图构建」,主要用于解决机器人在未知环境运动时的定位和地图构建问题.在SLAM理论中,第一个问题称为定位 (Localization),第二个称为建图 (Mapping),第三个则是随后的路径规划.SLAM的实现方式与难度和传感器密切相关.目前实现SLAM的传感器大体分为激光和视觉两大类.相比于图像,激光雷达可直接测量目标与传感器之间的相对位置,使得激光雷达SLAM技

第八篇:基于物联网/WIFI/单片机的智能插排控制系统论文、开题报告、原理图(全套毕业设计资料,绝对干货,内附下载链接)

首先打个广告:如果需要做毕设以及嵌入式项目合作,欢迎进入我们工作室:创想嵌入式设计工作室 以下时本人独立开发设计的毕设项目课题:<基于物联网/WIFI/单片机的智能插排>,现在共享出来供大家参阅,可用于做项目时借鉴,博尾附有下载链接.(内附本人联系方式,可一起交流探讨,交朋友). 针对本课题,本次共享的资料包几乎涵盖毕业设计所需的全部资料:设计方案,开题报告,程序源码,原理图,模块资料,论文,答辩PPT,模块学习资料,等等.本资料包不仅仅适用于"基于物联网/WIFI/单片机的智能插排

键值转换--复杂按键事件识别程序(链接层)

复杂按键事件识别程序(链接层) 复杂按键包括多个按键的单按事件.长按事件.连按事件.组合按键事件等 本程序为链接层程序,处理和识别按键驱动层扫描到的按键信息g_u8KeyValue.(g_u8KeyValue的每一位表示一个按键) 单按事件在按下键松开时判定,其它按键情况在达到规定的时间后触发相应按键事件. 宏定义: //宏定义各按键按下时的bit值 #define KEY_EVENT_NULL_CLICK 0x00 #define KEY_EVENT_CLOCK_CLICK 0x01 #def