详细了解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;
			}
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Java代码审计】XSS篇

【Java代码审计】XSS篇 1.Java中XSS常见触发位置2.反射型XSS3.存储型XSS4.XSS漏洞修复 1.Java中XSS常见触发位置 XSS漏洞产生后必然会有相关的输入/输出,因此我们只需快速找到这些输入/输出点,即可快速地进行跟踪发现漏洞。输入在Java中通常使用“reque…

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

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

C++试卷(华南理工大学)

华南理工大学期末考试 《高级语言程序设计(I)》A卷 注意事项: 1. 考前请将密封线内各项信息填写清楚; 2. 所有答案写在答题纸上,答在其它地方无效; 3.考试形式:闭卷&#xff1b…

LT7911D是TYPE-C/DP或者EDP转2 PORT MIPI和LVDS加音频

1.概述: T7911D是一款高性能TYPE-C/DP/EDP转2 PORT MIPI或者LVDS的芯片,目前主要在AR/VR或者显示器上应用的很多,对于DP1.2输入,LT7911D可配置为1/2/4车道。自适应均衡化使其适用于长电缆应用,最大带宽可达21.6Gbps。…

AI智能配音助手微信小程序前后端源码支持多种声音场景选择

大家好今天给大家带来一款配音小程序 ,这款小程序支持多种不同声音和场景的选择更人性化, 比如说支持各地区的方言,英文,童声呀等等、 另外也支持男声女声的选择,反正就是模板那些非常的多 当然啦音量,语调,语速那些都是可以DIY跳转的哟,所以说这一款小程…

【单元测试】Junit 4--junit4 内置Rule

1.0 Rules ​ Rules允许非常灵活地添加或重新定义一个测试类中每个测试方法的行为。测试人员可以重复使用或扩展下面提供的Rules之一,或编写自己的Rules。 1.1 TestName ​ TestName Rule使当前的测试名称在测试方法中可用。用于在测试执行过程中获取测试方法名称…

​SQL (关系型) 数据库-fastapi集成

SQL (关系型) 数据库 - FastAPI FastAPI不需要你使用SQL(关系型)数据库。 但是您可以使用任何您想要的关系型数据库。 在这里,让我们看一个使用着SQLAlchemy的示例。 您可以很容易地将SQLAlchemy支持任何数据库,像: PostgreSQLMySQLSQLi…

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

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

Python常见面试知识总结(一):迭代器、拷贝、线程及底层结构

前言: Hello大家好,我是Dream。 今天来总结一下Python和C语言中常见的面试知识,欢迎大家一起前来探讨学习~ 【一】Python中迭代器的概念? 可迭代对象是迭代器、生成器和装饰器的基础。简单来说,可以使用for来循环遍历…

时序预测 | Python实现CNN电力需求预测

时序预测 | Python实现CNN电力需求预测 目录 时序预测 | Python实现CNN电力需求预测预测效果基本描述程序设计参考资料预测效果 基本描述 该数据集因其每小时的用电量数据以及 TSO 对消耗和定价的相应预测而值得注意,从而可以将预期预测与当前最先进的行业预测进行比较。使用该…

前端框架的虚拟DOM(Virtual DOM)

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

《PySpark大数据分析实战》-11.Spark on YARN模式安装Hadoop

📋 博主简介 💖 作者简介:大家好,我是wux_labs。😜 热衷于各种主流技术,热爱数据科学、机器学习、云计算、人工智能。 通过了TiDB数据库专员(PCTA)、TiDB数据库专家(PCTP…

Vue学习计划-Vue2--VueCLi(七)nextTick、、浏览器本地缓存、脚手架配置代理

1. nextTick 语法: this.$nextTick(回调函数)作用:在下一次DOM更新结束后执行其指定的回调什么时候用: 当改变数据后,要基于更新后的新DOM进行某些操作时,要在nextTick所指定的回调函数中执行 **举个栗子:…

B+树与索引

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 对于60%的程序员而言&a…

【 某景点舆情分析:Python、Echarts、Flask、文本处理技术的应用】

某景点舆情分析:Python、Echarts、Flask、文本处理技术的应用 前言技术栈数据获取与准备景点数据统计分析评论数据处理与分析词频统计分词与文本处理情感分析 数据可视化Web应用搭建结语 前言 随着旅游行业的蓬勃发展,越来越多的人通过网络平台获取关于…

SQL 入门指南:从零开始学习 SQL

当今时代,数据已经成为了我们生活中不可或缺的一部分。无论是企业的经营决策,还是个人的日常消费习惯,都需要通过对数据的收集、分析和应用来实现更好的结果。 而关系型数据库系统,作为最常见的数据存储和管理方式,SQ…

HNU-数据库系统-实验1-数据定义/数据操纵

数据库系统 课程实验1数据定义/数据操纵 计科210X 甘晴void 202108010XXX 目录 文章目录 数据库系统 课程实验1<br>数据定义/数据操纵实验目的实验样例实验环境实验内容1.1 数据库定义1&#xff09;实验内容与要求2&#xff09;实验重难点3&#xff09;实验基础知识①模…

设计模式之结构型设计模式(二):工厂模式 抽象工厂模式 建造者模式

工厂模式 Factory 1、什么是工厂模式 工厂模式旨在提供一种统一的接口来创建对象&#xff0c;而将具体的对象实例化的过程延迟到子类或者具体实现中。有助于降低客户端代码与被创建对象之间的耦合度&#xff0c;提高代码的灵活性和可维护性。 定义了一个创建对象的接口&…

node.js mongoose简述

目录 官方文档 mongoose Schema Model Query document 关系 官方文档 Mongoose v8.0.3: Getting Started mongoose Mongoose 是一个 Node.js 环境下 MongoDB 的对象建模工具。它提供了一种在应用程序中与 MongoDB 数据库进行交互的方式&#xff0c;使得开发者能够使用…

数据可视化?这些平台能处

图表在各行各业都起到举重若轻的作用&#xff0c;无论是项目汇报、业绩分析&#xff0c;亦或是数据挖掘、统计分析&#xff0c;良好的可视化可以为我们的阐述起到画龙点睛的效果。在一篇文章中&#xff0c;如果只有密密麻麻的文字堆积&#xff0c;无论是谁恐怕都无法长期保持注…