当前位置: 首页 > news >正文

【蓝桥杯嵌入式】定时器实现按键单击,双击,消抖以及长按的代码实现

🎊【蓝桥杯嵌入式】专题正在持续更新中,原理图解析✨,各模块分析✨以及历年真题讲解✨都在这儿哦,欢迎大家前往订阅本专题,获取更多详细信息哦🎏🎏🎏

🪔本系列专栏 -  蓝桥杯嵌入式_勾栏听曲_0的博客

🍻欢迎大家  🏹  点赞👍  评论📨  收藏⭐️

📌个人主页 - 勾栏听曲_0的博客📝

🔑希望本文能对你有所帮助,如有不足请指正,共同进步吧🏆

🎇立班超志,守苏武节,歌武穆词,做易水别。📈


目录

原理图解析

设置STM32CubeMX

按键配置

定时器配置

手搓代码

中断回调(服务)函数

 按键判断函数

按键单击判断函数

按键双击判断函数

按键长按判断函数


原理图解析

我们以PB1为例来分析,假如按键没有被按下,那么PB1的电平就与左上角的VDD相等,也就是PB1 = 1;如果按键被按下,那么右下角的接地就会被导通,PB1的电平3就与GND相等,也就是PB1 = 2。

这样我们就能通过以上原理对按键进行判断,但是按键判断是一个事件触发程序,所以我们要使用定时器来使开发板能在任意时间都能对按键进行判断。因此我们再下一步设置STM32CubeMX中需要对定时器初始化。

设置​​​​​​​STM32CubeMX

按键配置

首先我们先根据按键的原理图配置好引脚,需要注意的是,再前几篇文章中讲LCD与LED我们讲引脚都是设置为GPIO_Output,但是按键的四个引脚,我们需要设置为GPIO_input,如图:

 然后在左侧选择GPIO中的按键的四个引脚,上下拉模式设为上拉,为以下状态:

定时器配置

关于定时器的详细知识点与解析可前往蓝桥杯嵌入式这篇博客,在这里我们只讲定时器的应用

如果大家有去做过省赛或国赛题目,就都会看到过对按键响应时间是有要求的,一般都是响应时间在0.1秒内,所以我们的定时器可以就设置为0.01秒。

以下是使能中断 

 

手搓代码

中断回调(服务)函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);

以下就是中断回调函数,很长,记不住怎么办。别担心,还有办法,我们打开keil5,在Project下找到stm32g4xx_it.c,在里面找到stm32g4xx_hal-tim.h并打开他,翻到最下面,再往上滑一点点,大概两千五百多行的位置,就可以找到这个函数啦,我们就可以直接复制使用。

 

 按键判断函数

实现创建一个按键的结构体,其含义写在注释中了:

struct keys
{uchar judge_sta;	//判断按键按键按下的动作到了第几步bool key_sta;		//如果按键被按下,为0bool key_flag;	//如果确认被按下,为1
};

 具体实现按键判断函数的思路:

1.判断中断回调函数收到的中断信号是不是我们刚刚给按键设置的定时器3的信号,如果是就进入按键判断函数

2.读取每个按键这一时刻的电平

3.判断有哪些按键为按下的状态(低电平)

4.按键抖动判断

5.状态重置

按键单击判断函数

具体实现代码如下,代码中也有详细注释,希望能有所帮助:

struct keys key[4]={0,0,0,0};void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM3)			//判断中断信号是否来自定时器3{key[0].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);		//读按键PB0现在的状态,如果被按下,PB0  = 0;如果没有被按下,PB0 = 1;key[1].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);key[2].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);key[3].key_sta=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);for(int i = 0;i < 4; i++ )		//确认是哪个或哪些按键被按下了{switch (key[i].judge_sta){case 0:{if(key[i].key_sta==0) key[i].judge_sta = 1;	//第一次判断是否按下}break;case 1:{if(key[i].key_sta==0)	//进入下一次定时器扫描,按键还是按下状态,那么就确认为按下,以此来消抖{key[i].judge_sta = 2;key[i].key_flag = 1;}else		//否则就是抖动,本次不算按键被按下key[i].judge_sta = 0;}break;case 2:{if(key[i].key_sta==1) key[i].judge_sta = 0;	//判断是否松手,松手后按键状态重置}break;}}}
}

按键双击判断函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM3)			//判断中断信号是否来自定时器3{key[0].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);		//读按键PB0现在的状态,如果被按下,PB0  = 0;如果没有被按下,PB0 = 1;key[1].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);key[2].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);key[3].key_sta=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);for(int i = 0;i < 4; i++ )		//确认是哪个或哪些按键被按下了{switch (key[i].judge_sta){case 0:{if(key[i].key_sta==0) key[i].judge_sta = 1;	//第一次判断是否按下}break;case 1:{if(key[i].key_sta==0)	//进入下一次定时器扫描,按键还是按下状态,那么就确认为按下,以此来消抖{if(a == i && key[a].key_time < 70)	//小于70,说明上次按下后到这次按下时间间隔小于0.7秒{key[i].double_key_flag = 1;		//这是一次双击事件}else{key[i].key_flag = 1;a = i;							//记录这一次是上面按键被按下}key[i].judge_sta = 2;}else		//否则就是抖动,本次不算按键被按下key[i].judge_sta = 0;}break;case 2:{if(key[i].key_sta==1) key[i].judge_sta = 0;	//判断是否松手,松手后按键状态重置key[i].key_time = 0;}break;}}key[a].key_time++;		//第一次被按下之后,开始计时}
}

按键长按判断函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM3){key[0].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);key[1].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);key[2].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);key[3].key_sta=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);for(int i = 0;i < 4; i++ ){switch (key[i].judge_sta){case 0:{if(key[i].key_sta==0) {key[i].judge_sta = 1;	//第一次判断是否按下key[i].key_time = 0;}}break;case 1:{if(key[i].key_sta==0)	//进入下一次定时器扫描,按键还是按下状态,那么就确认为按下,以此来消抖{key[i].judge_sta = 2;}elsekey[i].judge_sta = 0;}break;case 2:{				if(key[i].key_sta==1) 		//判断是否松手{if(key[i].key_time < 100){key[i].key_flag = 1;}
//						if(key[i].key_time > 100)				//一次扫描10毫秒,100次1000毫秒,就是判断是否长按超过1000毫秒
//																						//松手后,才会执行相应反应
//						{
//							key[i].long_flag = 1;
//						}key[i].judge_sta = 0;		}else{key[i].key_time++;if(key[i].key_time > 100)				//一次扫描10毫秒,100次1000毫秒,就是判断是否长按超过1000毫秒//未松手时,就会执行相应反应{key[i].long_flag = 1;}}}break;}}}
}

相关文章:

【蓝桥杯嵌入式】定时器实现按键单击,双击,消抖以及长按的代码实现

&#x1f38a;【蓝桥杯嵌入式】专题正在持续更新中&#xff0c;原理图解析✨&#xff0c;各模块分析✨以及历年真题讲解✨都在这儿哦&#xff0c;欢迎大家前往订阅本专题&#xff0c;获取更多详细信息哦&#x1f38f;&#x1f38f;&#x1f38f; &#x1fa94;本系列专栏 - 蓝…...

基于SSM的Javaweb爱心扶贫捐赠系统

文章目录 项目介绍主要功能截图:后台登录首页个人中心用户管理扶贫物资管理扶贫产品管理留言板管理前台前台首页扶贫产品新闻资讯留言板部分代码展示设计总结项目获取方式🍅 作者主页:Java韩立 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,…...

Spring Cloud(微服务)学习篇(三)

Spring Cloud(微服务)学习篇(三) 1 nacos中使用openFeign(调用方式)实现短信发送 1.1 在shop-sms-api中创建com.zlz.shop.sms.api.service/vo/dto/util,目录结构如下所示 1.2 在pom.xml(shop-sms-api)中加入如下依赖 <dependencies><dependency><groupId>…...

一文带你吃透JSP,增删改查实战案例详细解读

文章目录前言JSP 概述JSP快速入门搭建环境导入JSP依赖创建 JSP 页面编写代码测试JSP原理JSP 脚本实战案例JSP缺点发展阶段EL 表达式概述实战案例域对象JSTL 标签用法1用法2前言 不得不说&#xff0c;JSP 现在已经是一门十分老旧的技术了&#xff0c;学习编程时&#xff0c;不仅…...

taobao.item.propimg.upload( 添加或修改属性图片 )

&#xffe5;开放平台基础API必须用户授权 添加一张商品属性图片到num_iid指定的商品中 传入的num_iid所对应的商品必须属于当前会话的用户 图片的属性必须要是颜色的属性&#xff0c;这个在前台显示的时候需要和sku进行关联的 商品属性图片只有享有服务的卖家&#xff08;如&a…...

TDEngine集群监控组件安装配置(Telegra+Grafana方案)

Tdengine的监控指标包括以下几个方面&#xff1a; 系统指标&#xff1a;CPU使用率、内存使用率、磁盘空间、网络流量等。数据库指标&#xff1a;连接数、查询数、写入数、读取数等。SQL指标&#xff1a;执行时间、执行计划、索引使用情况等。集群指标&#xff1a;节点状态、数…...

【定位】高德地图wifi定位接口使用效果实践

高德地图wifi定位接口使用效果实践 背景 目的是基于高德地图wifi定位接口实现在高德地图上展示终端设备的位置和轨迹。 原理 为了将原理阐述的稍微直白一点,特意使用UML图表产生下面的一个序列图: #mermaid-svg-iHgWizHiUSRqCWdF {font-family:"trebuchet ms",…...

Nacos注册中心

目录 认识和安装Nacos 启动方式 Nacos快速入门 提示 Nacos服务分级存储模型 服务跨集群调用问题 管理端设置策略 总结 Nacos环境隔离 如何创建 使用方式 ​编辑 总结 Nacos注册中心分析 临时实例和非临时实例 定义 配置方式 总结 认识和安装Nacos Nacos是Sp…...

Liunx常用命令总结

常用命令arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI) hdparm -i /dev/hda 罗列一个磁盘的架构特性 hdparm -tT /dev/sda 在磁盘上执行测试性读取操作 cat /proc/cpuinfo …...

MySQL表的增删查改(进阶)

所有操作&#xff1a;主要讲了数据库的约束&#xff0c;表之间的关系&#xff0c;新增&#xff0c;聚合查询&#xff0c;联合查询等内容。是一篇博客所有操作的记录。 844d186 风夏/mysql_learning - Gitee.com数据库约束1.1 约束条件not null -指定某个列不能储存null值。un…...

【RocksDB】Ubuntu20.04下编译rocksdb

前言&#xff1a; 我在刚学rocksdb的时候是在2022年&#xff0c;但是网上的资源很少&#xff0c;查了好久才把rocksdb安装成功&#xff0c;在这里向大家分享一下我的经历&#xff0c;安装过程中也报了很多错误&#xff0c;希望大家不要迷路 首先 在虚拟机里面安装依赖的包以…...

这可能是Spring Boot Starter 讲的最清楚的一次了

Spring Boot Starter 是 Spring Boot 中非常重要的一个功能&#xff0c;它可以帮助开发人员快速集成各种第三方库和框架。本文将从 Spring Boot Starter 的基本概念入手&#xff0c;深入讲解 Spring Boot Starter 的实现原理及其应用场景。 一、Spring Boot Starter 的概念 S…...

activiti7执行流程详解

什么是工作流&#xff1f; 官方定义&#xff1a;工作流是将一组任务组织起来以完成某个经营过程&#xff1a;定义了任务的触发顺序和触发条件&#xff0c;每个任务可以由一个或多个软件系统完成&#xff0c;也可以由一个或一组人完成&#xff0c;还可以由一个或多个人与软件系统…...

iframe页面传值取值

业务&#xff1a;目标界面的是用原生js写的 &#xff0c; 被镶嵌到vue平台上 &#xff0c; 现在要求vue点击跳转的时候 &#xff0c;要附带上值 &#xff0c;让原生界面获取到值 &#xff0c; 完成页面设置查询。 想法 &#xff1a; vue跳转&#xff0c;使用this.$route.qu…...

2023年2月安全事件盘点

一、基本信息 2023年2月安全事件共造成约3796万美元损失&#xff0c;相较于上个月&#xff0c;安全事件数量与损失金额都有显著上升&#xff0c;其中Platypus Finance闪电贷攻击为单次利用损失之最高达850万美元。本月RugPull数量基本与上月持平&#xff0c;损失金额占比显著降…...

2023上海国际电商物流包装产业展览会相约上海

2023年7月5-7日 | 上海新国际博览中心 同期举办&#xff1a;2023上海国际快递物流产业博览会 指导单位&#xff1a;上海市邮政管理局 中国快递协会 主办单位&#xff1a;上海市快递行业协会 上海市仓储与配送行业协会 上海市物流协会 承办单位&#xff1a;上海信世展览服务有…...

营业执照注册资本是什么意思

一、营业执照注册资本是什么意思 营业执照上的注册资本是指合营企业在登记管理机构登记的资本总额&#xff0c;是合营各方已经缴纳的或合营者承诺一定要缴纳的出资额的总和。我国法律、法规规定&#xff0c;合营企业成立之前必须在合营企业合同、章程中明确企业的注册资本&…...

GB28181协议--SIP协议介绍

1、SIP协议简介 SIP&#xff08;Session Initiation Protocol&#xff0c;会话初始协议&#xff09;是一个用于建立、更改和终止多媒体会话的应用层控制协议&#xff0c;其中的会话可以是IP电话、多媒体会话或多媒体会议&#xff08;GB28181安防使用的是SIP协议&#xff09;。S…...

Python3 入门教程||Python3 元组||Python3 字典

Python3 元组 Python 的元组&#xff08;tuple&#xff0c;简写为tup&#xff09;与列表类似&#xff0c;不同之处在于元组的元素不能修改。 元组使用小括号​()​&#xff0c;列表使用方括号​[]​。 元组创建很简单&#xff0c;只需要在括号中添加元素&#xff0c;并使用逗…...

多元统计方法众多,分类还是排序?约束排序还是非约束排序?哪种方法或技术更适合我的研究目的或数据?

生态环境领域研究中常常面对众多的不同类型的数据或变量&#xff0c;当要同时分析多个因变量&#xff08;y&#xff09;时需要用到多元统计分析&#xff08;multivariate statistical analysis&#xff09;。多元统计分析内容丰富&#xff0c;应用广泛&#xff0c;是非常重要和…...

有关白盒加密

白盒密码技术白皮书 有关白盒的概念 其实白盒黑盒之类概念其实是软件保护方面的概念&#xff0c;在很多方面都有应用&#xff0c;例如 黑盒&#xff1a; 传统的加密技术是默认假定处于黑盒中的&#xff0c;也就是假定攻击者无法获得密钥。具体而言&#xff0c;认为攻击者并…...

C#学习系列之image控件配合ffmpeg播放视频(bitmap转image)

C#学习系列之image控件配合ffmpeg播放视频&#xff08;bitmap转image&#xff09;啰嗦ffmpeg输入格式与输出格式bitmap数据在image控件上显示数据转化总结啰嗦 关于音视频解码问题&#xff0c;采用海思解码库进行解码&#xff0c;存在C#托管调用动态库&#xff0c;会出现卡顿的…...

电容笔和Apple pencil有什么区别?开学季电容笔排行榜

与苹果的 Pencil相比&#xff0c;市面上常见的电容笔在压感上是没有具备重力压感&#xff0c;只具备着一种倾斜压感。对于绘画没有过高要求的话&#xff0c;其实一支普通的平替电容笔&#xff0c;就能为我们解决日常很多问题。它不仅可以用在办公上&#xff0c;也可以用在笔记、…...

【蓝桥杯每日一题】递归算法

&#x1f34e; 博客主页&#xff1a;&#x1f319;披星戴月的贾维斯 &#x1f34e; 欢迎关注&#xff1a;&#x1f44d;点赞&#x1f343;收藏&#x1f525;留言 &#x1f347;系列专栏&#xff1a;&#x1f319; 蓝桥杯 &#x1f319;我与杀戮之中绽放&#xff0c;亦如黎明的花…...

java 寻找2020

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 小蓝有一个数字矩阵&#xff0c;里面只包含数字 0 0 和 2 2。小蓝很喜欢 2020 2020&#xff0c;他想找 到这个数字矩阵中有多少个 2020 2020 。 小蓝只关注三种构成 …...

1.1 小白黑群晖构建,硬件推荐,硬件选购教程

构建一台黑群晖需要购买&#xff1a;CPU主板、散热器、内存条、机箱、电源、硬盘、网卡&#xff08;可选&#xff09;。物理机安装若需硬解需选择918/920此类机型系统进行安装。关联教程&#xff1a;黑群晖安装中的报错&#xff1a;https://guoqing.blog.csdn.net/article/deta…...

实验三、数字PID控制器的设计

实验三、数字PID控制器的设计 --- 直流闭环调速实验 一、实验目的 1&#xff0e;理解晶闸管直流单闭环调速系统的数学模型和工作原理;. 2. 掌握PID控制器参数对控制系统性能的影响; 3. 能够运用MATLAB/Simulink软件对控制系统进行正确建模并对模块进行正确的参数设置; 4.…...

python List和常用的方法

List&#xff1a;列表中包含多个数据&#xff0c;数据之间使用逗号分隔&#xff0c;索引从0开始。 空列表&#xff1a; dir&#xff1a;查看列表的所有方法 List常用方法&#xff1a;insert、append&#xff0c;extend、del、remove、pop、clear、count、index 增加insert(索引…...

PMP证书要怎么考,含金量怎么样?

对于新改版的PMP提纲&#xff0c;很多人都不知道如何去备考&#xff0c;这里我就总结一些经验&#xff0c;希望能帮助到大家&#xff01;&#xff01; 一&#xff0c;学习内容及考试形式&#xff1f; 学习内容&#xff1a;《PMBOK》项目管理知识体系指南&#xff0c;建议大家…...

MySQL实战解析底层---事务隔离:为什么你改了我还看不见

目录 前言 隔离性与隔离级别 事务隔离的实现 事务的启动方式 前言 和数据库打交道的时候&#xff0c;总是会用到事务最经典的例子就是转账&#xff0c;你要给朋友小王转 100 块钱&#xff0c;而此时你的银行卡只有 100 块钱转账过程具体到程序里会有一系列的操作&#xff0…...

专做苹果二手手机的网站/3000块钱在朋友圈投放广告

今天这篇文章主要是两件事&#xff1a;一是公布上次抽奖中奖名单&#xff1b;二是组织本次星球送书活动。首先感谢北京大学出版社的大力支持&#xff0c;感谢粉丝的参与&#xff5e;1.粉丝送书活动结果公布很好奇咋没发现在微信群里比较活跃的呢&#xff1f;抽奖内容&#xff1…...

怎么制作网站下载软件/网站如何快速被百度收录

Cmake是一个跨平台的工具&#xff0c;在Mac平台下&#xff0c;生成Xcode工程文件如下方式&#xff1a; #!/bin/bash# 获取当前目录 CUR_DIR$(pwd) BUILD_DIR${CUR_DIR}/../build rm -fr ${BUILD_DIR} cmake -S ${CUR_DIR} -B ${BUILD_DIR} \-D CMAKE_BUILD_TYPEDebug \-G &quo…...

网站中的冒号/线上营销策略都有哪些

资源下载&#xff1a;https://download.csdn.net/download/weixin_44893902/45601185 练习点设计&#xff1a;修改、删除 一、语言和环境 实现语言&#xff1a;JAVA语言。环境要求&#xff1a;MyEclipse/Eclipse Tomcat MySql。使用技术&#xff1a;JspServletJavaBean或Spr…...

怎么黑入网站/泉州百度搜索推广

1&#xff0c;git remote -v 2, git README.md 3, git init 4, git add README.md 5, git add . 6, git commit -m 第几次提交 7, git remote add origin gitgithub.com:XXX(你的github名字)/learngit.git&#xff08;项目&#xff09; 此处可能报错fatal: remo…...

网站上传文件代码/网推

环境: 威眼V3.7.18 Windows 10 专业版 联想服务器 问题描述: 威眼(WeaView)企业计算机监管系统如何安装客户端和日常使用 解决方案: 一、安装客户端 1.新电脑安装客户端安装setup程序,退出杀毒软件,完成重启计算机生效 2.前往威眼服务器,威眼控制台,可以看到新上…...

wordpress游戏/永久免费建个人网站

1> 库表设计遵从三大范式。 a、数据库设计的第一大范式&#xff1a;数据库表中的所有字段都只具有单一属性&#xff1b;单一属性的列是由基本数据类型所构成的&#xff1b;设计出来的表都是简单的二维表。&#xff08;一个列存放的信息只是一个属性的信息&#xff0c;不能一…...