stm32_按键消抖_代码与流程分析

news2024/9/22 11:27:30

stm32按键消抖

  • 一 问题背景
  • 二 解决思路
  • 三 代码实现

一 问题背景

开关按钮:按下信号为0,正常信号为1

在按下时,表面上看我们只按了一下,但信号的传递并不是单纯的由1直接变为0。这是由于机械触点断开/闭合时会有抖动,信号如图示会在1和0之间抖动。这种抖动对人来说是感觉不到的,但对单片机来说,这段时间还是很漫长的。(摘自百度知道)

在这段抖动的时间,仍然会执行程序,进行信号的判定。造成我们写代码时,容易步入一个逻辑误区。详见下图对一次按下和松开按钮进行详细分析:
stm32


二 解决思路

思路:判定一次按钮按下无非是判定信号的01变化或10变化,然而根据上图我们必须清楚几个结论:

  • 1 按钮正常时信号稳定为1,按下按键稳定后为信号0
  • 2 按下松开的瞬间,会反复进行:010101 信号抖动,约5~10ms
  • 3 假设无外部情况干扰,只有 第2点 中的两种情况,才会导致连续的01或10的变化
  • 4 所以判定按钮是否被按下(也就是判断01交替),要同时考虑到按下和松开瞬间两种抖动情况

三 代码实现

判断一次按钮按下然后松开
方法1

    //B5引脚检测信号为0时,判断两种情况
    if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)==0){  //(1)刚按下按键发生抖动(2)上一次的按键松开发生抖动
		Delay_ms(20);//(1)若为1,度过按下抖动,信号稳定为0
		             //(2)若为2,度过松手抖动,信号稳定为1
		if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)==0){ //检测信号仍为0,去掉情况(2)
			while((GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5) == 0)) ;//(1) 松开时,检测到信号从0变1退出循环,此信号必定为松开抖动 
			run(); //执行对应操作,已确定按键按下然后松开。且按键松开抖动不影响本方法判定   
		}
	}	

方法2

	    //去掉方法1的第二次if判定,增加一次delay延时
        //B5引脚检测信号为0时,两种情况分析
		if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)==0){  //(1)刚按下按键发生抖动(2)上一次的按键松开发生抖动
		  Delay_ms(20);//(1)若为1,度过按下抖动,信号稳定为0
		               //(2)若为2,度过松手抖动,信号稳定为1
			while((GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5) == 0)) ;// (1) 等待松开,检测到松开波动信号1时,退出循环
			                                                       //(2)立刻通过判定
			Delay_ms(20);//(1)度过松手抖动,信号稳定1,故情况2被检测的前提不成立,该程序不会检测到松手抖动
			             //(2)若没有这一句Delay语句:按键松手瞬间会执行下方语句,可能会遇到:按一次按钮执行两次操作的情况
			 run();    //只有情况(1)可以执行,能够检测一次按下按键并松开并执行对应操作
		}

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

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

相关文章

北京大学:利用好不确定性,8B小模型也能超越GPT-4

大模型有一个显著的特点,那就是不确定性——对于特定输入,相同的LLM在不同解码配置下可能生成显著不同的输出。 比如问一问chatgpt“今天开心吗?”,可以得到两种不同的回答。 常用的解码策略有两种,一个是贪婪解码&am…

好展位,抢先订!2025浙江(玉环)机械展

2025第18届浙江(玉环)机械工业展览会 时间地点:2025年4月25-28日 玉环会展中心 近年来,随着玉环工业经济的蓬勃发展,汽摩配件、阀门水暖五金产业、铜加工、眼镜配件、金属加工生产等行业,如同贪婪的巨人&…

React Native初次使用遇到的问题

Write By Monkeyfly 以下内容均为原创,如需转载请注明出处。 前提:距离上次写博文已经过去了5年之久,诸多原因导致的,写一篇优质博文确实费时费力,中间有其他更感兴趣的事要做(打游戏、旅游、逛街、看电影…

4.2、存储管理-页式存储

页式存储和段氏存储会考 页式存储几乎必考,段氏存储可能会考 页式存储 页式存储是操作系统的一种存储管理方式。 因为我们的程序往往是远远大于内存的,所以程序在执行的时候,是不会一次性把所有内容都装入到内存中,它会把程序分…

实验3-3 比较大小 想知道①和②的区别是什么(都错)

//实验3-3 比较大小 代码① #include<stdio.h> #include<math.h>void swap(int a, int b);// 正确声明 swap 函数int main() {int a, b, c;scanf("%d %d %d",&a,&b,&c);// 比较并交换 a 和 bif (a > b) {swap(a, b);}// 比较并交换 b 和 …

力扣刷题之3111.覆盖所有点的最少矩形数目

题干描述 给你一个二维整数数组 point &#xff0c;其中 points[i] [xi, yi] 表示二维平面内的一个点。同时给你一个整数 w 。你需要用矩形 覆盖所有 点。 每个矩形的左下角在某个点 (x1, 0) 处&#xff0c;且右上角在某个点 (x2, y2) 处&#xff0c;其中 x1 < x2 且 y2 …

关于vue开发中,高德地图有时不显示的问题

场景1&#xff1a;在弹出框中初始化地图 先设置 this.dialogVisible true; 然后再用nextTick初始化地图 this.$nextTick(() > { this.initAmap(); }); 场景2&#xff1a;点击tab页路由回退&#xff0c;导致高德地图不初始化的问题 解决方法&#xff1a; 通过$refs的方…

焦化行业超低排放改造巩固提升方案(朗观视觉)

朗观视觉小编观察发现&#xff1a;随着全球对环境保护意识的日益增强&#xff0c;焦化行业作为高污染、高排放的工业领域&#xff0c;其超低排放改造已成为行业转型升级的必然趋势。为了积极响应国家关于推进生态文明建设、打赢蓝天保卫战的号召&#xff0c;山东省生态环境厅发…

Windows + Ubuntu双系统!小白轻松安装

前言 这几天有小伙伴想着装WindowsUbuntu双系统&#xff0c;但苦于找不到办法&#xff0c;就在某篇文章后台留言&#xff1a; 这不&#xff0c;今天就更新了嘛&#xff01;虽然做不到有求必应&#xff0c;但教程帖还是可以写写的&#xff0c;能帮一个是一个&#xff01; 今天要…

深入探讨RCE漏洞及其防御策略

1. RCE漏洞 1.1. 漏洞原理 远程代码执行&#xff08;RCE&#xff09;漏洞允许攻击者远程注入并执行操作系统命令或代码&#xff0c;从而控制后台系统。 1.2. 漏洞产生条件 调用第三方组件存在代码执行漏洞。用户输入内容作为系统命令参数拼接到命令中。对用户输入的过滤不严…

关于Linux服务器端更新命令apt update没有效果问题总结(校园网认证)

这里写目录标题 项目场景&#xff1a;问题描述错误解决过程个人解决apt update和apt upgrade 项目场景&#xff1a; 在使用Django进行服务器部署的时候&#xff0c;需要使用执行命令 apt update&#xff1a; 具体场景&#xff1a; 问题描述 需要使用apt命令进行升级、下载…

[HITCON 2017]SSRFme 1

目录 代码审计 符号shell_exec() 函数:GET " . escapeshellarg($_GET["url"])&#xff1a;pathinfo($_GET["filename"]basename() 题目解析 代码审计 118.182.186.90 <?phpif (isset($_SERVER[HTTP_X_FORWARDED_FOR])) {$http_x_headers explod…

二叉树,二叉查找树,平衡二叉树

一.绪论: 二.数据结构(二叉树): 1.简介: 1)每一个节点&#xff08;也叫结点&#xff09;都是一个独立的对象-->当中不仅要存数据值&#xff0c;还要存父节点地址值&#xff0c;左子节点地址值&#xff0c;右子 节点地址值 2)没有父节点或者子节点的节点就记为null 2.遍历方…

【Bug记录】模板生成错误:不属于vector的成员

项目场景&#xff1a; 在调用自己写的一个简化版优先级队列时候报语法错误&#xff1a;模板生成错误 问题描述 模板生成错误&#xff0c;如下图 原因分析&#xff1a; 问题的分析&#xff1a;刚开始怀疑写模板写错了&#xff0c;之后看错误列表发现是top函数不属于vector。…

<数据集>棉花识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;13765张 标注数量(xml文件个数)&#xff1a;13765 标注数量(txt文件个数)&#xff1a;13765 标注类别数&#xff1a;4 标注类别名称&#xff1a;[Partially opened, Fully opened boll, Defected boll, Flower] 序…

llama-factory 系列教程 (六),linux shell 脚本自动实现批量大模型的训练、部署与评估

背景 最近在做大模型微调训练的评估&#xff0c;每次都要手动训练大模型&#xff0c;手动评估。 发现这样太浪费时间了&#xff0c;于是就尝试着使用linux shell 脚本&#xff0c;利用 for 循环自动实现大模型的训练、部署与评估。 实验&#xff1a;在不同的文本分类数据集尺…

记录两道关于编码解码的问题

环境&#xff1a;php环境即可&#xff0c;也可使用phpstudy。 参考文章: 深入理解浏览器解析机制和XSS向量编码-CSDN博客(很重要) HTML 字符编码&#xff08;自我复习&#xff09;-CSDN博客 例题1&#xff1a; <?php header("X-XSS-Protection: 0"); $xss …

Shell编程——简介和基础语法(1)

文章目录 Shell简介什么是ShellShell环境第一个Shell脚本Shell脚本的运行方法 Shell基础语法Shell变量Shell传递参数Shell字符串Shell字符串截取Shell数组Shell运算符 Shell简介 什么是Shell Shell是一种程序设计语言。作为命令语言&#xff0c;它交互式解释和执行用户输入的命…

【算法】一文带你搞懂0-1背包问题!(实战篇)

在【算法】一文带你搞懂0-1背包问题&#xff01;&#xff08;理论篇&#xff09;中&#xff0c;讲解了纯0-1背包问题及其原理&#xff0c;本篇文章中进入LeetCode中0-1背包问题应用的实战环节&#xff0c;主要难点其实在于看出是0-1背包问题、转换成0-1背包问题。 416. 分割等和…