定时器处理按键抖动

news2024/9/21 10:54:43
一、按键的抖动
1.按键的定义和原因

按键抖动是由于‌机械按键在闭合和断开时,由于触点的弹性作用,会产生一系列的抖动现象。这种抖动对于人类来说几乎感觉不到,但对‌单片机来说,却是一个可以感应到的过程,且处理时间较长,通常在毫秒级。‌

2.按键抖动的影响

按键抖动会导致单片机在处理按键信号时出现误判,即一次按键操作可能被错误地识别为多次操作,从而导致误处理。例如,按键一次按下或释放可能被误认为是多次操作,进而引起系统的逻辑错误。 

3.按键消抖的方法

为了消除按键抖动的影响,可以采取以下几种方法:

1)软件消抖:通过程序实现,主要有两种方法:延迟法和计数法。延迟法是在检测到按键状态变化后,延时一段时间再进行确认;计数法则是在检测到按键状态变化后,连续检测一定次数,如果状态没有发生变化,则确认为有效状态。‌

2)硬件消抖:通过电路实现,有多种方法。例如,应用‌施密特电路的回差特性配合积分电路实现按键消抖,或者应用‌锁存器的保持功能实现开关消抖。‌

3)综合消抖:结合软件和硬件两种方法来实现,以达到更好的消抖效果。‌

下面介绍软件消抖。

二、按键的软件消抖

一般有两种方法,1.延时几十毫秒之后再读。2.按键按下,延时10ms,再判断是否有中断,直到没中断。第 1 种方法太耗时,违背“中断要尽快处理”的原则,你的系统会很卡。在 GPIO 中断中并不立刻记录按键值,而是修改定时器超时时间,10ms 后 再处理。如果 10ms 内又发生了 GPIO 中断,那就认为是抖动,这时再次修改超时时间为 10ms。只有 10ms 之内再无 GPIO 中断发生,那么定时器的函数才会被调用。在定时器函数中记录按键值。

/* 定义一个软件定时器的结构体 */  
struct soft_timer {  
    uint32_t timeout;    // 定时器超时时间  
    void * args;         // 传递给定时器函数的参数  
    void (*func)(void *); // 定时器超时后调用的函数  
};  
  
/* 全局变量 */  
int g_key_cnt = 0; // 按键计数  
  
/* 定义一个软件定时器实例,初始超时时间设置为最大(~0),无参数,超时函数为key_timeout_func */  
struct soft_timer key_timer = {~0, NULL, key_timeout_func};  
  
/* 定时器超时函数,每次调用时增加按键计数,并重置定时器超时时间为最大 */  
void key_timeout_func(void *args)  
{  
    g_key_cnt++;  
    key_timer.timeout = ~0;  
}  
  
/* 设置定时器超时时间 */  
void mod_timer(struct soft_timer *pTimer, uint32_t timeout)  
{  
    pTimer->timeout = HAL_GetTick() + timeout; // HAL_GetTick()获取当前系统时间,加上超时时间作为新的超时时间  
}  
  
/* 检查定时器是否超时,如果超时则调用超时函数 */  
void check_timer(void)  
{  
    if (key_timer.timeout <= HAL_GetTick())  
    {  
        key_timer.func(key_timer.args);  
    }  
}  
  
/* 外部中断回调函数,当检测到特定引脚(GPIO_PIN_14)的中断时,重置定时器超时时间 */  
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)  
{  
    if (GPIO_Pin == GPIO_PIN_14)  
    {          
        mod_timer(&key_timer, 10); // 设置定时器超时时间为当前时间加10(单位取决于HAL_GetTick()的实现)  
    }  
}

总结,这段代码的主要用途是在特定的GPIO引脚(是GPIO_PIN_14,按需更改引脚)发生外部中断时,启动一个10单位时间的定时器。如果在定时器超时之前该引脚再次发生中断,则重置定时器。定时器超时后,会调用key_timeout_func函数,该函数会增加g_key_cnt变量的值,表示按键事件被记录,经试验,能满足按键防抖处理要求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2051460.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQL - 设计数据库

数据建模 数据建模就是为要存储在数据库中的数据创建模型的过程 步骤 1.理解和分析业务需求 (收集信息) 收集需求&#xff0c;明确业务流程&#xff0c;定义数据需求&#xff0c;分析业务规则 2.构建业务的概念模型 (识别和表示业务中实体、事务或概念以及它们之间的关系) 识别…

APP支付宝授权获取code uniapp

1.点击使用plus.runtime跳转打开支付宝 //打开支付宝授权&#xff0c;在支付宝APP中授权后会在支付宝中跳转到你填写的h5地址//urls是授权地址可以后端拼接也可以前端写死 //以下是一个拼接示例&#xff0c;需修改app_id的值和redirect_uri的值即可 //app_id是商户的APPID&…

WorkPlus-为用户提供IM即时通讯和实时音视频通信本地化服务

WorkPlus作为一家领先的企业级通讯解决方案提供商&#xff0c;为用户提供了本地化服务&#xff0c;以满足IM即时通讯和实时音视频通信的需求。本文将深入探讨WorkPlus本地化服务的重要性以及其为用户提供的IM即时通讯和实时音视频通信的解决方案。 一、本地化服务的意义 低延迟…

【动态规划、dp】[CSP-J 2022] 上升点列 题解

题目描述 在一个二维平面内&#xff0c;给定 n n n 个整数点 ( x i , y i ) (x_i, y_i) (xi​,yi​)&#xff0c;此外你还可以自由添加 k k k 个整数点。 你在自由添加 k k k 个点后&#xff0c;还需要从 n k n k nk 个点中选出若干个整数点并组成一个序列&#xff0c…

从0开始搭建vue + flask 旅游景点数据分析系统(十三)vue + flask 图片上传、用户头像更改

项目是基于我的博文&#xff1a;vue flask 旅游景点数据分析系统 基础上做的&#xff0c;可以参考之前的博客文章。 1 前端修改 主要是修改Profile.vue <!-- 头像上传 --><el-form-item label"头像"><el-uploadclass""action"/api/…

使用 Fyne 构建 GUI 应用:设置标签文本和自增计数器

引言 Fyne 是一个用 Go 语言编写的跨平台 GUI 框架&#xff0c;它提供了一套丰富的组件来帮助开发者快速构建出漂亮的用户界面。在本文中&#xff0c;我们将通过一个简单的案例来演示如何使用 Fyne 创建 GUI 应用程序&#xff0c;该程序包含设置标签文本和自增计数器的功能。 …

按钮(Buttons)-Qt-思维导图-学习笔记

按钮(Buttons) 按钮在 Qt 中的重要性 按钮是 Qt 中最常用的控件之一 通过点击按钮&#xff0c;可以响应事件&#xff0c;实现人机交互效果 按钮在嵌入式系统和 PC 端的界面交互中都是不可或缺的 Qt 内置的六种按钮部件 QPushButton&#xff1a;下压按钮 用法示例 项目创建与…

指针详解(三)

目录 1. 数组名 2. 使用指针访问数组 3. 一维数组传参的本质 4. 冒泡排序 5. 二级指针 6. 指针数组 7. 指针数组模拟二维数组 1. 数组名 在使用指针访问数组的内容时&#xff0c;有这样的代码&#xff1a; int arr[10] {1,2,3,4,5,6,7,8,9,10}; int *p &arr[0];/…

CV党福音:YOLOv8实现实例分割(二)之训练过程

在上一篇博客中&#xff0c;我们已经了解了YOLOv8实例分割的基本流程&#xff0c;本章则是对数据集、以及训练过程等进行进一步的学习。 文章目录 训练整体流程语义分割与实例分割数据集开启训练训练Debug数据封装损失函数初始化前向传播 总结 训练整体流程 训练模型的整体流…

洗衣机洗衣服一些知识

01智能:按衣物多少自动调节合适水位的标准洗涤程序 (需要30分钟时间) 02:大物:较大,较厚的衣服洗涤 03:轻柔:毛织品或内衣洗涤 04:快速:少量清污衣服洗涤 (13分钟) 05:浸泡:先浸泡一段时间再洗涤 06:单洗:只洗衣不脱水 07:单脱:只脱水不洗衣 08:洁桶:清洁洗衣桶 准备工作: (1)…

XSS反射型和DOM型+DOM破坏

目录 第一关 源码分析 payload 第二关 源码分析 payload 第三关 源码分析 payload 第四关 源码分析 payload 第五关 源码分析 payload 第六关 源码分析 第七关 源码分析 方法一&#xff1a;构造函数 方法二&#xff1a;parseInt 方法三&#xff1a;locat…

龙门吊(天车)防撞方案

防撞雷达设备&#xff0c;是一款基于无线微波技术自主研发的应答式高精度无线防撞产品&#xff0c;该产品具有测距精度高&#xff08;最高可到10厘米&#xff09;&#xff0c;测距稳定&#xff0c;无累计误差&#xff0c;粉尘、水汽不影响测距精度&#xff0c;抗电磁干扰等特点…

oracle数据库目录及文件

oracle数据库目录及文件 oracle安装后所有根目录 1、admin 目录 里边有不同文件夹&#xff0c;代表一个实例&#xff0c;记录 Oracle 实例的配置&#xff0c;运行日志等文件。每个实例一个目录。 SID&#xff1a;System IDentifier 的缩写&#xff0c;是 Oracle 实例的唯一标记…

IT服务标准化知识体系攻略(至简)

标准是为了在一定范围内获得最佳秩序 &#xff0c;经协商一致制定并由公开机构批准共同使用和重复使用的和中规范性文件。标准是标准化活动的主要成果之一。国家标准的制定有一套正常程序&#xff0c;分为预阶段、立项阶段、起草阶段、征求意见阶段、审查阶段、批准阶段、出版阶…

【区块链+金融服务】第一创业证券开发银行间报价 Dapp | FISCO BCOS应用案例

在银行间市场现券交易的过程中&#xff0c;通过银保监会发牌的代理机构进行报价交易&#xff0c;已解决无代理阶段存在的许多问题。 但是由于业务需要&#xff0c;使用以前模式进行报价交易的仍占有一定比例。 针对这一现状&#xff0c;第一创业证券基于 FISCO BCOS 区块链底层…

工作 sql 数据库创建 表的修改 插入数据

一. 创建数据库 创建数据库 CREATE DATABASE (IF NOT EXISTS) 数据库名称;使用数据库 USE 数据库名称;查看当前数据库中存在的表 SHOW TABLES;删除数据库 DROP DATABASE demolibang 二. 创建表 格式&#xff1a; CREATE TABLE IF NOT EXISTS 表名&#xff08; 字段名 字…

Unity动画模块 之 3D模型导入基础设置 Materials

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正 还是那句话&#xff0c;用到的时候再看看&#xff0c;死记硬背不是正经的学习方法&#xff0c;但是又不得不知道一下&…

javaweb_10:XML映射文件

一、规范 1、XML映射文件的名称与Mapper接口名称一致&#xff0c;并且将XML映射文件和Mapper接口放在相同的包下&#xff08;同包同名&#xff09;。 2、XML映射文件的namesapce属性为Mapper接口全限定名一致。 3、 XML映射文件中sql语句的id与Mapper接口中的方法名一致&a…

培训第二十七天(lvs_nat模式与lvs_dr模式配置)

上午 核心&#xff1a;内核中的ipvs&#xff0c;ipvsadm1、安装ipvsadm[rootnat ~]# yum -y install ipvsadm2、配置规则查看所有的规则&#xff0c;如果已经配置好规则&#xff0c;重启之后也就没有了[rootnat ~]# ipvsadm -L -n 1、配置vip网卡 &#xff08;1&#xff09;在…

数组前缀和算法技巧

一、什么是数组前缀和 数组中前缀和技巧&#xff08;Prefix Sum Technique&#xff09;是一种常见且有用的算法技巧&#xff0c;特别适用于需要频繁查询数组区间和的问题。这种技巧通过创建一个额外的数组来存储原始数组中特定位置之前所有元素的和&#xff0c;从而在需要计算…