STM32 CubeMX按键点灯

news2024/9/25 3:23:45

本文代码使用 HAL 库。

文章目录

  • 前言
  • 一、按键原理图
  • 二、CubeMX 创建工程
  • 三、代码讲解:
      • 1. GPIO的输入HAL库函数:
      • 2. 消抖:
      • 3. 详细代码
  • 四,实验现象:
  • 总结


前言

我们继续讲解 stm32 f103,这篇文章将详细 为大家讲解 如何 使用 按键点亮 RGB 灯。


一、按键原理图

参考手册:

可以 看到 板子有 4 个按键 :KEY1, KEY2, KEY3, KEY4

对应的 io 端口分别是 :PA0, PG15, PC13, PE3.
在这里插入图片描述

以 KEY1 为例 分析:

该电路接了一个 3V 的电压。
当 按键 按下时,电流 流向按键,然后接地,则 PA0 为 低电平 0。
当按键 松开时,电流流向 PA0 ,则 PA0 是 高电平 1。

所以:
PA0 为 低电平 0 时,按键 按下
PA0 为 高电平1 时,按键 松开

二、CubeMX 创建工程

  1. 选择芯片。
    在这里插入图片描述
  2. 选择 Debug 模式。
    在这里插入图片描述
  3. 选择外部时钟。
    在这里插入图片描述
  4. 配置系统时钟,在 红框中输入 72 ,然后点击 回车 两次,即可配置好。
    在这里插入图片描述
  5. 配置 io 引脚 为 输入引脚。
    在这里插入图片描述在这里插入图片描述
  6. 配置引脚。
    在这里插入图片描述
  7. 设置工程模式和版本。
    在这里插入图片描述
  8. 选取加入.c /.h文件(便于编写代码)。
    在这里插入图片描述
  9. 创建工程。
    在这里插入图片描述

三、代码讲解:

由于我们采用 封装的方法来写程序,所以 我们将 key 程序用一个.c .h文件封装起来,这样便于我们对代码进行修改与移植。

对于 led 的代码可以参考我之前的文章:STM32f103 CubeMX封装 led程序

1. GPIO的输入HAL库函数:

功能:读取一个GPIO引脚的电平。

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);

例如: 读取 K1 的电平,将其重定义。

#define  K1   HAL_GPIO_ReadPin(K1_GPIO_Port, K1_Pin)

2. 消抖:

在这里插入图片描述

抖动产生原因: 按键按下的 瞬间 引脚的 电平 不是马上 从 高电平 变为 低电平 或者从 低电平 变成 高电平,而是有一个抖动。

解决方法: 可以使用加 延时 判断的办法消除这个抖动。

例如:按下 K1 点亮 led

    #define  K1   HAL_GPIO_ReadPin(K1_GPIO_Port, K1_Pin)
    #define Red_ON()  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET)

	if(K1 == 0)  
	{
		HAL_Delay(100);  //消抖,延时 100 ms
		if(K1 == 0)     //如果按键 真的 按下
		{
			Red_ON();  //led 亮
		}
		else Red_OFF();   //led 熄灭
	}

3. 详细代码

key.h 文件:

#include "main.h"

#define  K1   HAL_GPIO_ReadPin(K1_GPIO_Port, K1_Pin)  //读取 K1 电平
#define  K2   HAL_GPIO_ReadPin(K2_GPIO_Port, K2_Pin) //读取 K2 电平
#define  K3   HAL_GPIO_ReadPin(K3_GPIO_Port, K3_Pin) //读取 K2 电平
void Key(void);

key.c 文件:

#include "key.h"
#include "led.h"

void Key(void)
{
	if(K1 == 0)
	{
		HAL_Delay(100);
		if(K1 == 0)
			Red_ON();
		else Red_OFF();
	}
	else if(K2 == 0)
	{
		HAL_Delay(100);
		if(K2 == 0)
			Green_ON();
		else Green_OFF();
	}
	else if(K3 == 0)
	{
		HAL_Delay(100);
		if(K3 == 0)
			BlUE_ON();
		else BlUE_OFF();
	}
}

四,实验现象:

对于按键 让 RGB 闪烁的实验结果我发在了 B占,有兴趣的可以看看:

实验现象


总结

下一篇 讲 OLED 显示。

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

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

相关文章

MATLAB | 如何用MATLAB绘制花里胡哨的山脊图

本期推送教大家如何绘制各种样式的山脊图,这里做了一个工具函数用来实现好看的山脊图的绘制,编写不易请多多点赞,大体绘制效果如下: 依旧工具函数放在文末。 教程部分 0 数据准备 数据为多个一维向量放在元胞数组中,…

oracle数据库常用操作

1.连接登录切换用户su - oracle以管理员模式登录到sqlplus:sqlplus / as sysdba oracle登录身份有三种:1.1Normal 普通身份;1.2.sysdba 系统管理员身份;若以 ‘sysdba’ 方式认证,登录用户为 ‘SYS’,为 Or…

spring事务管理器原理?mybatis如何集成spring事务管理器?

目录 1. spring事务管理器开启事务做了些什么事情: 1.1 创建mysql数据库连接: 1.2 开启mysql事务 1.3 将当前事务所使用的连接绑定到ThreadLocal中,供后续执行sql命令使用。 2. mybatis如何集成spring事务管理器? 3. mysql相关命令 4. …

Java常用框架(三)

三、SpringBoot 1.Spring及其优缺点? 1.1 概念 重量级企业开发框架EJB的替代品,通过依赖注入、面向切面编程,使用简单Java对象POJO为企业Java开发提供了相对简单的方法。 1.2 优缺点 1.2.1 优点 组件代码轻量级 1.2.1 缺点 配置重量级…

Spring Batch 高级篇-多线程步骤

目录 引言 概念 案例 转视频版 引言 接着上篇:Spring Batch ItemWriter组件,了解Spring Batch ItemWriter处理组件后,接下来一起学习一下Spring Batch 高级功能-多线程步骤 概念 默认的情况下,步骤基本上在单线程中执行&…

springBoot使用ShardingJDBC实现分表

ShardingSphere的介绍 ShardingSphere是一款起源于当当网内部的应用框架。2015年在当当网内部诞 生,最初就叫ShardingJDBC。2016年的时候,由其中一个主要的开发人员张亮, 带入到京东数科,组件团队继续开发。在国内历经了当当网、…

链动2+1系统|购买三单就能迅速回本,链动2+1模式到底有多暴利?

链动21模式号称起步创业无泡沫,半个月就能盈利上百万,用户裂变速度更是让人瞠目结舌。那么,链动21模式到底有多暴利?其实链动21模式最关键的,是合理的利润分配和奖励机制,让消费者在购物的同时,…

【解决报错】‘jupyter‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件

在当前路径下使用cmd打开后,输入jupyter notebook出现如下错误: 通常可能出现的问题有两种: (1)你本身就没安装jupyter,如果你配置了anaconda,就自带jupyter,直接跳到问题2。如果确…

Confluence主页面更新记录停留在去年,搜索也只能搜索去年之前的数据问题解决方案

问题描述 Confluence主页最近更新页面不更新了,停留在之前的时间段。其次搜索也只能搜索出来停留在这个时间段之前的数据。 核心原因 索引出现问题了,重建索引即可。 解决办法 直接重启Confluence。 重启Confluence的姿势 描述一下我解决思路&…

28-vuex

vuex 一、vuex 专门在vue中实现集中式状态(数据)管理的一个Vue插件,对Vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信。 使用场景&a…

Java 【数据结构OJ题十道】—— 二叉树篇1

文章目录一、 检查两棵二叉树是否相同二、 另一棵二叉树的子树三、 二叉树的构建及遍历四、序列化二叉树和反序列化二叉树(难)五、二叉树创建字符串六、 二叉树前序非递归遍历实现七、 二叉树中序非递归遍历实现八、 二叉树后序非递归遍历实现九、二叉搜索树中找到两个结点的最…

如何将电脑文件备份到百度网盘

如何将电脑文件备份到百度网盘?说到文件备份,很多小伙伴会将电脑文件备份到移动硬盘或者U盘里,移动硬盘和U盘是比较常见的存储介质,使用和携带起来也是非常方便,因此深受大家的喜欢。除此之外,大家可能还忽…

2023年,IT互联网还有发展前景吗?

不得不说,互联网在整个社会经济发展中扮演着不可或缺的角色;不仅自身的技术具有前沿性,也推动着其他行业进入数字化经济时代,让我们的工作生活变得更加便捷。 在“互联网”时代,每个服务行业都会利用大数据&#xff0…

将自带记事本替换为Notepad2【中文版,带替换文件】

Notepad2是我在寻找一个合适的代码浏览工具的时候发现的,当需要一个用来浏览代码的文本编辑器时候,需要体积小,速度快,语法高亮,解释度高,VsCode作为生产环境已经不适合作为浏览工具了。了解到Notepad2&…

《动手学习深度学习》笔记(二)线性神经网络

三、线性神经网络 3.1 线性回归 3.1.1 介绍 1. 回归是为一个或多个自变量与因变量之间的关系建模的一类方法。而线性回归基于几个简单的假设:① 自变量和因变量关系是线性的;② 允许包含噪声但是噪声遵循正态分布。   2. 训练数据集/训练集&#xff…

算法训练营 day53 动态规划 买卖股票的最佳时机系列2

算法训练营 day53 动态规划 买卖股票的最佳时机系列2 买卖股票的最佳时机III 123. 买卖股票的最佳时机 III - 力扣(LeetCode) 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。…

软件项目管理知识回顾---网络图

网络图 9.网络图 9.1简介 1.分类 AOA,双代号,ADMAON,PDM,单代号,前导图2.活动的逻辑管理 头到头/尾,尾到头/尾 依赖关系 3.工序 紧前紧后9.2绘制规则 1.两个节点只能一条线。不能是平行线。平行的话就不知道是哪个活动…

LeetCode-93. 复原 IP 地址

目录题目思路回溯法题目来源 93. 复原 IP 地址 题目思路 意识到这是切割问题,切割问题就可以使用回溯搜索法把所有可能性搜出来,和131.分割回文串就十分类似了。 回溯法 1.递归参数 startIndex一定是需要的,因为不能重复分割&#xff0c…

【GeoDjango框架解析】读取矢量数据写入postgis数据库

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 【GeoDjango框架解析】读取矢量数据写入postgis数据库 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录系列…

关于iframe一些通讯的记录(可适用工作流审批,文中有项目实践,欢迎咨询)

一.知识点(1).我们可以通过postMessage(发送方)和onmessage(接收方)这两个HTML5的方法, 来解决跨页面通信问题&#xff0c;或者通过iframe嵌套的不同页面之间的通信a.父页面代码如下<div v-if"src" class"iframe"><iframeref"iframe"id…