详细了解stm32---按键

提示:永远支持知识文档免费开源,喜欢的朋友们,点个关注吧!蟹蟹!

目录

一、了解按键

二、stm32f103按键分析

三、按键应用


一、了解按键

         同学们,又见面了o(* ̄▽ ̄*)ブ,最近降温了,注意保暖哦!这次我们来了解stm32中的按键操作 ,首先我们需要了解什么是按键,以及按键的基本结构,如下图就是我们按键的基本结构:

按键是什么呢?说专业一点,按键就是一种电子开关使用时轻轻按开关按钮就可以使开关接通,当松开手的时候,开关断开。说白了按键就是用来实现一个电路的通路以及断开操作的开关。

看完上图之后我们该如何给按键接线呢?假设我们一定要接1引脚,但是接1,2呢?、还是接1,3呢?假设我们接的是1,3,此时电路是不是一直是通路,当我们按下按键和不按下按键是不是都是同一个结果,因为1,3相连引脚初始是导通的,那我们还能实现按键操作吗?不能吧,所以我们应该接1,2引脚吧,同样的我们也可以接1,4引脚对吧,等等。

通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,电压信号如图:

在图中我们可以看出,理想的按键电压信号波形图是空闲状态维持一种电平(低电平或者是高电平,具体需要我们自己根据电路图配置),当我们 按下按键的时候,电压信号波形产生一个跳变吧,当我们松开按键的时候电压又跳变回原来的状态,有了这种跳变,我们是不是就可以根据电压的这一特性来实现控制某一个灯的开关啦,或者某一外设的开关?

但实际情况却有些差强人意,因为当我们按下按键的时候,按键会产生一个机械抖动,这个抖动会影响我们对电压信号波形的判断,就比如我们不小心碰了一下按键,灯就开了,这样过于灵敏是不是不太好呀?那我们该如何去解决这个问题呢?可以用延时吧?就是那个systick,延时10ms或者20ms,当经过10ms之后如果电平还是维持在一个低电平或者高电平我们是不是就可以判断按键按下了,这样就可以解决误触这个问题了,当然这不是最优解决方法,更优解决方法我们可以通过外部中断去实现。

 ok,知道这些之后我们接下来可以通过按键来实现stm32上的一个灯的控制了,我们先来分析按键的原理图

二、stm32f103按键分析

我们怎么去看这个图呢?看网络标号吧,看网络标号对应哪个引脚吧,比如这个WK_UP这个网络标号就连接在如下图:

WK_UP对应的引脚是PA0吧,这个按键我们可以用来当作一个普通的按键来用,当然也可以用来当作唤醒,外部中断的一个唤醒按键,那什么时候需要唤醒呢?就是当我们的这个芯片进入到一个睡眠模式,或者是待机模式,或者什么什么模式,反正就是低功耗的模式里面其中一种,我们可以通过这个按键来唤醒我们这个系统。

我们先来分析一下,我们这个按键按下之后识别到什么电平:

我们拿WK_UP(PA0)引脚来举例,当我们按下按键之后,我们在引脚可以识别到一个高电平吧?为什么?因为我们这个按键外部接了一个3.3V的上拉电阻,当我们按下按键之后我们就可以读到一个高电平。再问大家一个问题,我们WK_UP(PA0)引脚该配置成输入还是输出模式呢?我们站在芯片的角度考虑,我们是需要去读取WK_UP(PA0)引脚的输出电平对吧,所以我们是需要将WK_UP(PA0)配置成输入模式。我们通过读取它的电平变化来判断按键是否按下。那么就需要WK_UP(PA0)引脚有一个电平的变化,这样我们才能通过这个电平的变化来判断按键是否按下。好,那么,当我们按键有按下的时候WK_UP(PA0)引脚处于高电平,而我们又需要这个引脚有一个电平跳变,故我们应该给这个引脚配置成下拉输入模式吧,这样,当WK_UP(PA0)引脚处于空闲状态时就处于低电平,当我们按下按键的时候电平跳变成高电平,所以我们就可以通过这个电平变化来判断按键是否按下。

三、按键应用

ok,我们现在可以来尝试着写一下代码,我们板子上有三个按键,我们尝试着用WK_UP(PA0)来点亮灯,用PC8来熄灭灯,用PC9来使灯闪烁。

代码如下:

首先我们要知道一个函数(以下的函数在固件库中可以查询到):

其中有两个 函数我们需要注意:

GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin);

GPIO_ReadInputData(GPIO_TypeDef* GPIOx)

其中:

第一个函数有两个参数,第一个是选择要读取的GPIO,第二个参数是选择要读取的GPIO对应的引脚

第二个函数就只有一个参数,也就是说第二个函数使用来读取一组GPIO引脚的

我们用按键点灯需要的是一个引脚吧,不需要读取一组GPIO吧,所以我们选择第一个函数进行GPIO的输入读取。

好,知道这些之后我们就可以正式开始写代码了:

代码如下:

key.c文件:

#include "key.h"
u8 key_flag;
void Key_Init(void)
{GPIO_InitTypeDef  GPIO_InitStruct;/*打开时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);/*配置GPIO*/GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;/*下拉输入*/GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;GPIO_Init(GPIOA, &GPIO_InitStruct);GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;/*上拉输入*/GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;GPIO_Init(GPIOC, &GPIO_InitStruct);
}void Read_Key(void)
{/***以下的代码还有很多可以修改的地方,比如说可以用位带操作简化GPIO读取操作,还可以用外部中断来处理延时产生的问题等等***/if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == SET){/*消除抖动*/delay_ms(20);if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == SET){key_flag = 1; }if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_8) == RESET){key_flag =  2;}if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_9) == RESET){key_flag = 3;}}
}

main.c文件:

#include "systick.h"
#include "usart_drv.h"
#include "key.h"
#include "led.h"
extern u8 key_flag;
void HardWare_Init(void)
{SysTick_Init(72);Usart_MyConfig(115200);//这个串口可以用来调试代码用Key_Init();
}int main(void)
{HardWare_Init();while(1){Read_Key();switch (key_flag){case 1:LED_Ctrl(LED_0, LED_ON);break;case 2:LED_Ctrl(LED_0, LED_OFF);break;case 3:delay_ms(200);LED_Ctrl(LED_0, LED_ON);delay_ms(200);LED_Ctrl(LED_0, LED_OFF);break;}}
}

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

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

相关文章

vue制作简易日历

你可以使用Vue.js来制作一个简易日历。&#xff1a; <!DOCTYPE html> <html> <head><title>Vue简易日历</title><script src"https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script><style>table {border-colla…

C++ Qt开发:Tab与Tree组件实现分页菜单

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍tabWidget选择夹组件与TreeWidget树形选择组件…

43 贪心算法 -第K个排列

题 目 描 述 n 个 字 共 有 n &#xff01; 种 排 列 。 给 定 参 数 n &#xff0c; 从 1 到 n 会 有 n 个 整 数 &#xff1a; 123 按 大 小 顺 升 序 列 出 所 有 排 列 的 情 况 &#xff0c; 并 己 当 n 3 时 &#xff0c; 所 有 排 列 如 下 &#xff1a; “ 123 …

升华 RabbitMQ:解锁一致性哈希交换机的奥秘【RabbitMQ 十】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 升华 RabbitMQ&#xff1a;解锁一致性哈希交换机的奥秘【RabbitMQ 十】 前言第一&#xff1a;该插件需求为什么需要一种更智能的消息路由方式&#xff1f;一致性哈希的基本概念&#xff1a; 第二&…

【Linux】MySQL 数据库安装配置教程(Ubuntu 22.04)

前言 MySQL是一个流行的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;广泛用于Web应用程序的后端数据存储&#xff0c;如许多动态网站、电子商务系统和在线出版物等。 MySQL具有高性能、可靠性和易用性的特点&#xff0c;它支持大型数据库&#xff0c;…

Web应用安全—信息泄露

从书本和网上了解到Web应用安全的信息泄露的知识&#xff0c;今天跟大家分享点。 robots.txt泄漏敏感信息 漏洞描述&#xff1a;搜索引擎可以通过robots文件可以获知哪些页面可以爬取&#xff0c;哪些页面不可以爬取。Robots协议是网站国际互联网界通行的道德规范&#xff0c;其…

UniGUI之提示信息MessageDlg及获得信息Prompt

UniGui的信息弹出框MessageDlg的原型定义如下&#xff1a; procedure MessageDlg(const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; CallBack: TUniDialogCallBackAnonProc); 1. 其中DlgType(对话框架的类型) 1、mtConfirmation 2、mtCustom 3、mtError…

【Java】使用递归的方法获取层级关系数据demo

使用递归来完善各种业务数据的层级关系的获取 引言&#xff1a;在Java开发中&#xff0c;我们通常会遇到层层递进的关系型数据的获取问题&#xff0c;有时是树状解构&#xff0c;或金字塔结构&#xff0c;怎么描述都行&#xff0c;错综复杂的关系在程序中还是可以理清的。 这…

uniGUI之上传文件UniFileUploadButton

TUniFileUploadButton主要属性&#xff1a; Filter: 文件类型过滤&#xff0c;有图片image/* audio/* video/*三种过滤 MaxAllowedSize: 设置文件最大上传尺寸&#xff1b; Message&#xff1a;标题以及消息文本&#xff0c;可翻译成中文 TUniFileUploadButton控件 支持多…

K8S(八)—有、无状态.md

目录 无状态有状态&#xff08;StatefulSet&#xff09;介绍应用应用21. **状态持久性&#xff1a;**2. **水平扩展&#xff1a;**3. **存储和卷&#xff1a;**4. **Pod标识和网络标识&#xff1a;**5. **部署和更新&#xff1a;** 有状态和无状态对比1. 概念&#xff1a;2. 数…

【OpenCV】实时屏幕捕获

文章目录 前言基本思路安装依赖包实时捕获屏幕画面转换屏幕画面数据调用窗体显示屏幕截取画面增加实时捕获时间保存实时视频流效果图完整实现代码 前言 日常中如果需要进行大数据分析&#xff0c;那么就要记录用户的使用情况和数据分析。 实时屏幕捕获就可以很好地获取数据&a…

云原生之深入解析Linkerd Service Mesh的功能和使用

一、简介 Linkerd 是 Kubernetes 的一个完全开源的服务网格实现&#xff0c;它通过为你提供运行时调试、可观测性、可靠性和安全性&#xff0c;使运行服务更轻松、更安全&#xff0c;所有这些都不需要对代码进行任何更改。Linkerd 通过在每个服务实例旁边安装一组超轻、透明的…

Other -- 了解网上服务器(ECS、VPS)

喜欢在公网上自己做网站发布的就会研究网上的售卖的各种服务器&#xff0c;下面简单了解下&#xff1a; 1. 虚拟专用服务器&#xff08;VPS,VirtualPrivateServer&#xff09; 借助容器或者虚拟化技术&#xff0c;将一台物理服务器分割成多个虚拟服务器&#xff0c;每个服务器…

MX6ULL学习笔记(十二)Linux 自带的 LED 灯

前言 前面我们都是自己编写 LED 灯驱动&#xff0c;其实像 LED 灯这样非常基础的设备驱动&#xff0c;Linux 内 核已经集成了。Linux 内核的 LED 灯驱动采用 platform 框架&#xff0c;因此我们只需要按照要求在设备 树文件中添加相应的 LED 节点即可&#xff0c;本章我们就来学…

Python基础05-函数

零、文章目录 Python基础05-函数 1、函数的作用及其使用步骤 &#xff08;1&#xff09;函数的作用 在Python实际开发中&#xff0c;我们使用函数的目的只有一个“让我们的代码可以被重复使用” 函数的作用有两个&#xff1a; ① 代码重用&#xff08;代码重复使用&#xf…

【AI工具】GitHub Copilot IDEA安装与使用

GitHub Copilot是一款AI编程助手&#xff0c;它可以帮助开发者编写代码&#xff0c;提供代码建议和自动完成功能。以下是GitHub Copilot在IDEA中的安装和使用步骤&#xff1a; 安装步骤&#xff1a; 打开IDEA&#xff0c;点击File -> Settings -> Plugins。在搜索框中输…

Electron学习第一天 ,启动项目

之前在安装官网的步骤操作&#xff0c;结果报错&#xff0c;找了好多办法&#xff0c;最后这种办法成功启动项目&#xff0c;并且没有报错&#xff0c;特此记录 特别提醒&#xff0c;最好安装淘宝镜像&#xff0c;npm 太慢&#xff0c;会导致报错问题&#xff0c;解决起来个人觉…

windows10 php8连接sql server

一、环境安装 文章目录 一、环境安装1.安装php拓展2.在 Windows 上安装PHP驱动程序3.在 Windows 上安装ODBC驱动 二、php连接sqlserver三、注意事项数据库相关设置相关语法sqlsrv_fetch_array 的示例&#xff1a;sqlsrv_fetch 的示例&#xff1a;echo 和 print_r 的不同 所用资…

Webrtc 学习交流

花了几周的时间研究了一下webrtc &#xff0c;并开发了一个小项目&#xff0c;用来点对点私密聊天 交流传输文件等…后续会继续扩展其功能。 体验地址&#xff0c;大狗子的ID,我在线时可以连接测试到我 f3e0d6d0-cfd7-44a4-b333-e82c821cd927 项目特点 除了交换信令与stun 没…

ES6 面试题 | 01.精选 ES6 面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…