STM32学习7 按键扫描

STM32学习7 按键扫描

  • 一、实验电路介绍
  • 二、按键GPIO初始化
  • 三、扫描原理
    • 1. GPIO引脚配置
    • 2. 状态轮询
    • 3. 按键状态检测
    • 4. 循环扫描的优缺点
      • 优点:
      • 缺点:
  • 四、一次扫描与持续扫描
  • 五、代码实现
    • 1. 头文件定义
    • 2. 函数实现
    • 3. 主体函数

一、实验电路介绍

本实验使用普中STM32-F1开发板,芯片型号是STM32F103ZET6。
其按键电路如下:
在这里插入图片描述
对应的芯片引脚:
在这里插入图片描述
从电路可以看出,键盘的 KEY_UP 键如果接通,会连接高电平 。
其它几个按键在按下的时候连接低电平,对应的GPIO口:

  • KEY_UP:GPIOA GPIO_Pin0 引脚
  • KEY_LEFT:GPIOE GPIO_Pin2 引脚
  • KEY_RIGHT:GPIOE_GPIO_Pin4 引脚
  • KEY_DOWN:GPIOE_GPIO_Pin3 引脚

二、按键GPIO初始化

按键 KEY_UP 和其它三个按键的接法不同,需要不同的配置方式。
其中 KEY_UP 按下后接高电平,在默认情况下需要置低,初始化时设置为输入下拉,代码如下:

    // 开启GPIOA的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 设置上引脚GPIO_InitStructure.GPIO_Pin = KEY_UP_PIN;// 设置输入下拉模式GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;GPIO_Init(KEY_UP_PORT, &GPIO_InitStructure); // 初始化GPIOA

其它三个按键,按下时接低电平,默认置高,初始化设置为输入上拉,代码如下:

    // 开 E 时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);// 设置下、左、右引脚GPIO_InitStructure.GPIO_Pin = KEY_DOWN_PIN | KEY_LEFT_PIN | KEY_RIGHT_PIN;// 设置输入上拉模式GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(KEY_DOWN_PORT, &GPIO_InitStructure); // 初始化GPIOE

三、扫描原理

1. GPIO引脚配置

首先,需要将用于连接按键的GPIO引脚配置为输入模式。

2. 状态轮询

然后轮询每个按键的状态,以确定按键是否被按下或释放。轮询扫描可以通过在主循环中定期检查每个按键的状态来实现。例如,在每次主循环迭代中,都检查一次按键的状态。

3. 按键状态检测

一般来说,按键有两种状态:按下和释放。在检测按键状态时,需要注意去除按键的抖动干扰。抖动是指在按键被按下或释放时,由于机械接触或物理特性导致的瞬间状态变化。为了应对抖动,可以采用软件方法或硬件滤波器。

本示例采用延时10ms读取值的方法来去抖,示例:

if(key_up_value == 1 || key_down_value ==0 || key_left_value ==0 || key_right_value ==0){delay_ms(10);
}

硬件方法去抖可以参考实现:SR触发器去抖

4. 循环扫描的优缺点

优点:

  1. 简单直观: 在循环中进行按键扫描的方法简单易懂,逻辑清晰,易于理解和实现。

  2. 灵活性: 可以根据具体需求灵活调整扫描的频率和方式,满足不同场景下的要求。

  3. 适用性广: 适用于小型嵌入式系统或者对按键响应速度要求不高的场景,适用性广泛。

  4. 资源消耗低: 相比于中断方式,循环扫描不需要额外的中断处理函数,减少了系统资源的占用。

缺点:

  1. 效率低下: 在循环中进行按键扫描会占用 CPU 的时间片,降低了系统的处理效率,特别是当系统有其他紧急任务需要处理时,会影响响应速度和实时性。

  2. 实时性差: 循环扫描需要不断地遍历所有按键状态,导致按键的检测周期相对较长,实时性差,无法满足对按键响应速度要求较高的场景。

  3. 占用 CPU 资源: 循环扫描需要持续占用 CPU 资源,特别是在大型系统中,可能会影响其他任务的执行,降低系统的整体性能。

  4. 功耗高: 循环扫描需要 CPU 不断地处于工作状态,会增加系统的功耗,对于对功耗要求较高的场景不太适用。

后面学习中会采用中断的方式来读取键盘。

四、一次扫描与持续扫描

这里的一次扫描,是指按下按键后,如果不松开,键盘的扫描函数不会继续输出所按键值。
而持续扫描,在按下按键后,如果手不松开,键盘的扫描函数仍会持续输出按键值。

五、代码实现

为方便看到演示效果,示例的代码在获取到扫描的按键后,会在数码管显示不同的数值。

  • 上:显示0
  • 下:显示1
  • 左:显示2
  • 右:显示3

1. 头文件定义

key_utils.h

#ifndef __KEY_UTILS_H__
#define __KEY_UTILS_H__
#include "stm32f10x.h"// 引脚和端口
#define KEY_UP_PIN GPIO_Pin_0
#define KEY_UP_PORT GPIOA
#define KEY_LEFT_PIN GPIO_Pin_2
#define KEY_LEFT_PORT GPIOE
#define KEY_DOWN_PIN GPIO_Pin_3
#define KEY_DOWN_PORT GPIOE
#define KEY_RIGHT_PIN GPIO_Pin_4
#define KEY_RIGHT_PORT GPIOE// 读取引脚状态
#define key_up_value  GPIO_ReadInputDataBit(KEY_UP_PORT, KEY_UP_PIN)
#define key_down_value  GPIO_ReadInputDataBit(KEY_DOWN_PORT, KEY_DOWN_PIN)
#define key_left_value  GPIO_ReadInputDataBit(KEY_LEFT_PORT, KEY_LEFT_PIN)
#define key_right_value  GPIO_ReadInputDataBit(KEY_RIGHT_PORT, KEY_RIGHT_PIN)// 按键
#define KEY_UP 0
#define KEY_DOWN 1
#define KEY_LEFT 2
#define KEY_RIGHT 3
#define KEY_NONE 4void key_init(void);
u8 key_scan(u8 mode);
#endif

2. 函数实现

#include "key_utils.h"
#include "sys_tick_utils.h"void key_init(void)
{GPIO_InitTypeDef GPIO_InitStructure; // 定义GPIO初始化结构体// 开启GPIOA的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 设置上引脚GPIO_InitStructure.GPIO_Pin = KEY_UP_PIN;// 设置输入下拉模式GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;GPIO_Init(KEY_UP_PORT, &GPIO_InitStructure); // 初始化GPIOA// 开 E 时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);// 设置下、左、右引脚GPIO_InitStructure.GPIO_Pin = KEY_DOWN_PIN | KEY_LEFT_PIN | KEY_RIGHT_PIN;// 设置输入上拉模式GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(KEY_DOWN_PORT, &GPIO_InitStructure); // 初始化GPIOE}
static u8 key_read(void){if(key_up_value == 1 || key_down_value ==0 || key_left_value ==0 || key_right_value ==0){delay_ms(10);if(key_up_value == 1){return KEY_UP;}else if(key_down_value == 0){return KEY_DOWN;}else if(key_left_value == 0){return KEY_LEFT;}else if(key_right_value == 0){return KEY_RIGHT;}}return KEY_NONE;
}
u8 last_key;
/*** @brief  按键扫描函数* @param  mode: 0 单次扫描 1: 连续扫描*/
u8 key_scan(u8 mode)
{if(mode==0){u8 key = key_read();if(key != KEY_NONE){if(key == last_key){return KEY_NONE;}else{last_key = key;return key;}}else{last_key = KEY_NONE;}}else{return key_read();}return KEY_NONE;
}

3. 主体函数

#include "gpio_utils.h"
#include "rcc_utils.h"
#include "stm32f10x.h"
#include "sys_tick_utils.h"
#include "led_utils.h"
#include "key_utils.h"// 主函数
int main(void)
{GPIO_Configuration(); //调用GPIO配置函数sys_tick_init(72);led_all_off();key_init();while (1) //无限循环{delay_ms(10);u8 key = key_scan(0);if(key==KEY_UP){led_lightn(0);}else if(key==KEY_DOWN){led_lightn(1);}else if(key==KEY_LEFT){led_lightn(2);}else if(key==KEY_RIGHT){led_lightn(3);}else{led_all_off();}}
}

本文源码地址:
https://gitee.com/xundh/stm32_arm_learn/tree/master/lesson7_key

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

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

相关文章

Linux 之三:CentOS7 目录结构 和 日期及时区设置

Linux 目录 以下是对这些目录的解释: /bin:bin是Binary的缩写, 这个目录存放着最经常使用的命令。/boot: 这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。/dev : dev是Device(设备)的缩写…

docker安装和使用kafka

1. 启动zookeeper Kafka依赖zookeeper, 首先安装zookeeper -p:设置映射端口(默认2181) docker run --name zookeeper \--network app-tier \-e ALLOW_ANONYMOUS_LOGINyes \--restartalways \-d bitnami/zookeeper:latest2. 启动kafka docker…

STM32各外设初始化步骤

1、GPIO初始化步骤 1、使能GPIO时钟 2、初始化GPIO的输入/输出模式 3、设置GPIO的输出值或获取GPIO的输入值 GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitStruct.GPIO_Mode GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Pin…

青少年如何从零开始学习Python编程?有它就够了!

文章目录 写在前面青少年为什么要学习编程 推荐图书图书特色内容简介 推荐理由粉丝福利写在最后 写在前面 本期博主给大家带来一本非常适合青少年学习编程的图书,快来看看吧~ 青少年为什么要学习编程 青少年学习编程,就好比在他们年轻时就开始掌握一种…

线程简介

线程简介 这里先说明一下,进程和线程是不同的 进程:程序的执行过程,是一个独立的运行环境,持有资源和线程,相当于一个应用程序,操作系统在分配资源时把资源分配给进程(堆和方法区是属于进程的) 线程&#x…

【YOLO v5 v7 v8 v9小目标改进】辅助超推理SAHI:分而治之,解决高分辨率图像中小物体检测的问题

辅助超推理SAHI:分而治之,解决高分辨率图像中小物体检测的问题 设计思路结构小目标涨点YOLO v5 魔改YOLO v7 魔改YOLO v8 魔改YOLO v9 魔改 论文:https://arxiv.org/pdf/2202.06934.pdf 代码:https://github.com/obss/sahi 设计思…

C++内存泄漏检测

C进阶专栏:http://t.csdnimg.cn/aTncz 相关系列文章 C技术要点总结, 面试必备, 收藏起来慢慢看 C惯用法之RAII思想: 资源管理 C智能指针的自定义销毁器(销毁策略) 目录 1.内存泄漏概述 1.1.内存泄漏产生原因 1.2 内存泄漏导致的后果 1.3 内存泄漏解决思路 2.宏…

基于Springboot免费搭载轻量级阿里云OSS数据存储库(将本地文本、照片、视频、音频等上传云服务保存)

一、注册阿里云账户 打开https://www.aliyun.com/,申请阿里云账户并完成实名认证(个人)。这种情况就是完成了: 二、开通OSS服务 点击立即开通即可。 三、创建Bucket 申请id和secert: 进去创建一个Accesskey就会出现以…

【Qt学习】QProgressBar的使用(进度条的实现)

文章目录 1. 介绍2. 实例2.1 按钮启动进度条2.2 更改进度条样式2.3 资源文件 1. 介绍 详细的 QProgressBar 内容可以通过 查阅Qt官方文档 ,这里进行简要的总结: QProgressBar 是Qt框架中的一个控件,用于显示进度条: QProgressBar…

wordpress免费主题下载

免费wordpress模板下载 简洁大气的文化艺术类wordpress模板,可以免费下载,实用易上手,新手也适合。 https://www.wpniu.com/themes/304.html 免费wordpress主题下载 高端大气上档次的wordpress主题,也可以是免费的,…

修改MonkeyDev默认配置适配Xcode15

上一篇文章介绍了升级Xcode15后,适配MonkeyDev的一些操作,具体操作可以查看:Xcode 15 适配 MonkeyDev。 但是每次新建项目都要去修改那些配置,浪费时间和精力,这篇文章主要介绍如何修改MonkeyDev的默认配置,做到一次修改永久生效。 MonkeyDev的默认安装路径是在/opt/Mo…

iclone更奇怪了用自动对齐才搞得定

1前一个clip的位置 2选root的话就跑到这里了,跟前一个clip差很多 3换了left foot对齐之后才正常 4这时候开不开自动对齐不影响 5奇怪医生的中心似乎是途中的花坐标轴偏离人体好多呀不知何时跑这里的难道前面是应为这个?中心跑了我还不知道 6动画交叉的时…

【常见索引使用】⭐️Mysql中索引的类型以及使用方式和失效场景

目录 一、前言 二、数据准备 三、索引的分类 四、索引示例 示例1、主键索引(Primary Key Index)与 唯一索引(Unique Index) 示例2、前缀索引(Prefix Index) 示例3、联合索引(复合索引&am…

GWO-RF|灰狼算法优化随机森林 分类预测|多变量分类预测

目录 一、程序及算法内容介绍: 基本内容: 亮点与优势: 二、实际运行效果: 三、算法介绍: 灰狼优化算法: 随机森林: 四、完整程序下载: 一、程序及算法内容介绍: …

如何规划应用商店优化策略

应用商店是拥挤的地方。拥有超过 600 万个应用程序,制定应用程序商店优化 (ASO) 策略比以往任何时候都更加重要。ASO 有助于确保您的应用在搜索结果中排名更高,以便潜在用户可以轻松找到它。通过针对App Store和 Google Play优化App,能够吸引…

使用ES检索PDF或Word等格式文件方案

#大数据/ES #经验 #方案架构 ES检索PDF/Word等格式文件方案 插件安装 ES有文档预处理插件,但是7.x版本默认发版包不包含这个ingest attachment plugin 。 通过摄取附件插件,Elasticsearch 可以使用 Apache 文本提取库 Tika 提取常见格式的文件附件&a…

Tomcat介绍在IDEA中创建JavaWeb工程

文章目录 一、WEB服务器服务器概述使用Java代码手写web服务器 二、服务器软件Web服务器服务器软件的使用步骤 三、TomcatTomcat的下载Tomcat的安装与卸载Tomcat的启动与关闭常见问题 四、新建Java Web项目并将项目部署到tomcat中新建Java Web项目将项目部署到Tomcat中出现的问题…

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)--大模型

专属领域论文订阅 VX关注{晓理紫},每日更新论文,如感兴趣,请转发给有需要的同学,谢谢支持 如果你感觉对你有所帮助,请关注我,每日准时为你推送最新论文。 》》 由于精力有限,今后就不在CSDN上更…

去除PDF论文行号的完美解决方案

去除PDF论文行号的完美解决方案 1. 遇到的问题 我想去除论文的行号,但是使用网上的Adobe Acrobat裁剪保存后 如何去掉pdf的行编号? - 知乎 (zhihu.com) 翻译时依然会出现行号,或者是转成word,这样就大大损失了格式,…

第十五届蓝桥杯青少组STEMA测评SPIKE初级真题试卷 2024年1月

第十五届蓝桥杯青少组STEMA测评SPIKE初级真题试卷 2024年1月 ​​​​​​​ 来自:6547网 http://www.6547.cn/doc/vywur8eics