【【萌新的STM32学习20--按键输入实验】】

萌新的STM32学习20–按键输入实验

在了解完蜂鸣器的实验之后我们又进行一个小实验 又是正点原子没有上课讲解的实验
在这里插入图片描述
对于这种不平滑的情况我们更多的也会去选择方法进行消除抖动
软件消抖:方法很多,我们例程中使用最简单的延时消抖。检测到按键按下后,一般进行10ms 延时,用于跳过抖动的时间段,如果消抖效果不好可以调整这个 10ms 延时,因为不同类型的按键抖动时间可能有偏差。待延时过后再检测按键状态,如果没有按下,那我们就判断这是抖动或者干扰造成的;如果还是按下,那么我们就认为这是按键真的按下了。对按键释放的判断同理。
例程要求
通过开发板上的三个独立按键控制 LED 灯和蜂鸣器: KEY_UP 控制蜂鸣器翻转,KEY1控制 LED1 翻转,KEY0 控制 LED0/LED1 同时翻转。
这就需要用到了我们上面讲述的蜂鸣器和LED控制还有新加入按键的实现
在这里插入图片描述
这里可以按照我们之前的逻辑判别

这里我们在此处介绍几个新的函数
HAL_GPIO_ReadPin
读出管脚的作用
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
前面一部分指的是GPIO多少
后面一部分说的是管脚号用的是从0到15中的任何一个

我们在使用GPIO的时候 无论用到哪一个 用到一个就请你使能该方向的GPIO 可以是GPIOA 也可以是GPIOE 等等
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOE_CLK_ENABLE();

流程图
在这里插入图片描述
对于代码部分的简单解析
由硬件设计小节,我们知道 KEY0、KEY1 和 KEY_UP 分别来连接到 PE4、PE3 和 PA0 上

在这里插入图片描述
在这里插入图片描述
我们接下来重点分析一下扫描函数的实现
在这里插入图片描述
其实就是说其他
表示KEY00 KEY10 是低电平有效
WK_UP==1是高电平有效
然后很多人对这个static 不明显 static其实是静态变量仅能初始一次
剩下的mode 当处于1 下面是 表示key_up 一直松开 随时随地接收数据的改变
而优先级问题是这么解释的
我wk_up 在最下面,程序的顺序执行 会使得最下面的优先级最高,你这么想 反正我要到最后才会传递数据,哪怕我前面已经修改了数据,但是到了最后我一再收束修改条件 ,不是还是算作WK_up 的功劳吗

下面是main.c

int main(void){ uint8_t key; HAL_Init(); /* 初始化 HAL 库 */ sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟
, 72Mhz */ delay_init(72); 
/* 延时初始化 */ led_init(); /* 初始化 LED */ beep_init(); /* 初始化蜂鸣器 */ key_init();/* 初始化按键 */ LED0(0);/* 先点亮 LED0 */  
while(1) { key = key_scan(0); /* 得到键值 */if (key) 
{ switch (key) 
{ case WKUP_PRES: /* 控制蜂鸣器 */ BEEP_TOGGLE(); /* BEEP 状态取反 */ 
break; case KEY1_PRES: /* 控制 LED1(GREEN)翻转 */ 
LED1_TOGGLE(); /* LED1 状态取反 */ 
break;case KEY0_PRES: 
/* 同时控制 LED0, LED1 翻转 */ LED0_TOGGLE();/* LED0 状态取反 */ LED1_TOGGLE();/* LED1 状态取反 */ break; } } 
else { delay_ms(10); } }}

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

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

相关文章

GitLab启动失败:fail: alertmanager: runsv not running

问题描述 sudo gitlab-ctl restart ,报错如下 : summergaoubuntu:/etc/gitlab$ sudo gitlab-ctl start fail: alertmanager: runsv not running fail: gitaly: runsv not running fail: gitlab-exporter: runsv not running fail: gitlab-workhorse: …

Linux 中list.h使用实例和坑

以前都是自己写链表或者所用框架都自带链表操作,本次工作换了框架没有找到框架自带的链表操作,所以尝试使用linux自带的list.h中定义的相关宏和函数写了简单的链表操作,竟然踩坑了,记录一下。 一、list.h简介 list.h一般放在inc…

【JavaWeb 专题】15个最经典的JavaWeb面试题

文章目录 HTTP长连接和短连接HTTP/1.1 与 HTTP/1.0 的区别可扩展性缓存带宽优化长连接消息传递Host 头域错误提示 AjaxAjax 的优势: JSP 和 servlet 有什么区别?定义区别 JSP 的9大内置对象及作用JSP 的 4 种作用域?session 和 cookie 有什么…

ptmalloc源码分析 - 分配区heap_info结构实现(5)

目录 一、heap_info是什么? 二、heap_info结构图 三、new_heap的实现 四、grow_heap的实现 五、shrink_heap的实现 六、delete_heap的实现 一、heap_info是什么? 上一章节《ptmalloc源码分析 - 多线程争抢竞技场Arena的实现(04&#xf…

ATA-2161高压放大器的电子实验案例(案例合集)

ATA-2161是一款理想的可放大交直流信号的单通道高压放大器。最大差分输出1600Vp-p(800Vp)高压,可以驱动高压型负载。凭借其优异的指标参数受到不少电子工程师的喜欢,其在电子实验中的应用也非常频繁,下面为大家整理出ATA-2161高压放大器的应用…

代码随想录打卡—day46—【DP】— 8.29 背包END

1 139. 单词拆分 139. 单词拆分 做了很久...估计2h 一开始我的思路卡死了 看题解之后的思路的详解见注释, 我的写法和carl 答案在一些微小的细节上略有不同,我的更好理解,但他的解法更简单。 我写的过程中,需要注意下标和字符…

为何直线导轨要保持日常清洁?

随着时代的发展,已逐步从传统的工业发展模式发展到工业自动化,直线滑轨在工业生产中得到了广泛的应用,大大提高了生产效率,带动了经济效益的增长。 众所周知,想要直线导轨的使用达到预期的效果,日常的保养和…

【论文笔记】Planning and Decision-Making for Autonomous Vehicles

文章目录 Summary1. INTRODUCTION2. MOTION PLANNING AND CONTROL2.1. Vehicle Dynamics and Control2.2. Parallel Autonomy2.3. Motion Planning for Autonomous Vehicles 3. INTEGRATED PERCEPTION AND PLANNING3.1. From Classical Perception to Current Challenges in Ne…

1688API技术解析,实现获得1688商品详情

要实现获得1688商品详情,你需要使用1688 API。1688 API是阿里巴巴旗下的开放平台,它提供了一套丰富的接口,可以让开发者通过编程的方式获取到1688网站上的商品信息。 首先,你需要在阿里开放平台注册一个账号,并创建一…

Celery task 执行报错 TypeError: Object of type set is not JSON serializable 问题分析处理

情况描述: 定义了新的shared_task推送到生产环境后,发现无法执行,会报错set对象无法序列化,报错内容如下: Traceback (most recent call last):File "/tmp/venv/lib64/python3.6/site-packages/kombu/serializati…

6 Python的异常处理

概述 在上一节,我们介绍了Python的面向对象编程,包括:类的定义、类的使用、类变量、实例变量、实例方法、类方法、静态方法、类的运算符重载、继承等内容。在这一节中,我们将介绍Python的异常处理。异常是指程序在运行过程中出现的…

C++中数组作为参数进行传递方法

文章目录 基础:数组作为函数形参示例:1、一维数组的传递(1)直接传递(2)指针传递(3)引用传递 2、二维数组的传递(1)直接传递(2)指针传递…

Java中word转Pdf工具类

背景: 最近做的一个项目中,对于word转Pdf用的地方很多,特此记录 搭建总图: 代码部分: 1.需要的jar包: aspose-words-15.8.0-jdk16.jar 注:下载好这个jar包后,在项目的根目录新建一…

第一个react应用程序并添加样式

编写第一个react应用程序 将目录下的文件、src文件夹、public文件夹清空&#xff0c;项目根目录下新建一个文件index.js 在文件中写入以下代码 import React from react import ReactDOM from react-dom ReactDOM.render(<h1>欢迎进入React的世界</h1>,document.…

请使用 -source 7 或更高版本以启用 diamond 运算符

1、遇到问题 Maven打包 C:\Users\chengyq\eclipse-workspace\webservice>mvn package 复制 需要如下错误 [ERROR] COMPILATION ERROR : [INFO] ------------------------------------------------------------- [ERROR] /D:/Users/chengyq/eclipse-workspace/webservic…

利用fsimage分析HDFS小文件

一、Hive 小文件概述 在Hive中&#xff0c;所谓的小文件是指文件大小远小于HDFS块大小的文件&#xff0c;通常小于128 MB&#xff0c;甚至更少。这些小文件可能是Hive表的一部分&#xff0c;每个小文件都包含一个或几个表的记录&#xff0c;它们以文本格式存储。 Hive通常用于…

clickhouse(十四、分布式DDL阻塞及同步阻塞问题)

文章目录 一、分布式ddl 阻塞、超时现象验证方法解决方案 二、副本同步阻塞现象验证解决方案 一、分布式ddl 阻塞、超时 现象 在clickhouse 集群的操作中&#xff0c;如果同时执行一些重量级变更语句&#xff0c;往往会引起阻塞。 一般是由于节点堆积过多耗时的ddl。然后抛出…

云计算和Docker分别适用场景

在大规模网络爬虫系统中&#xff0c;通过使用云计算和Docker技术&#xff0c;可以实现大规模网络爬虫系统的高效架构设计和部署。这种架构能够提供可扩展性、高可用性和灵活性&#xff0c;为爬虫系统的运行和管理带来便利。 云计算和Docker在大规模网络爬虫系统中有不同的业务…

nodejs替换模版中${}的内容

要在js中想要替换替换模板中的${}&#xff0c;可以使用字符串的replace()方法结合正则表达式或者函数来实现替换操作。 以下是两种常见的替换方式&#xff1a; 使用正则表达式&#xff1a; 方法一&#xff1a; const template "Hello, ${name}! Today is ${day}."…

《游戏编程模式》学习笔记(九)游戏循环 Sequencing Patterns

定义 一个游戏循环会在游玩时不断运行。 每一次循环&#xff0c;它都会无阻塞地处理玩家的输入&#xff0c;更新游戏的状态&#xff0c;渲染游戏。它追踪时间的消耗并控制游戏的速度。游戏循环需要做到始终以固定的速度运行游戏。 一个游戏循环中通常包含处理输入部分&#xf…