STM32学习和实践笔记(14):按键控制实验

消除抖动有软件和硬件两种方法

软件方法就是在首次检测到低电平时加延时,通常延时5-10ms,让抖动先过去,然后再来检测是否仍为低电平,如果仍然是,说明确实按下。

硬件方法就是加RC滤波电路,硬件方法会增加成本,通常不采用。

本开发板的按键电路如下:

key up连接到+3.3V,是为了使用STM32的PA0引脚的唤醒功能。PA0片内配置成下拉电阻,平常为低电平,当按键按下时,检测到下拉电阻上有高电平,即表示按键按下。

K1-K3连到PE2-PE4,片内配置成上拉电阻,平常为高电平,按下按键为低电平。

按键控制实验:

使用开发板上的4个按键控制D2D3,D1指示灯

闪烁用于提示系统运行。程序框架如下

1)使能按键端口时钟、初始化GPIO

2)按键检测

        (3)主函数控制

main.c

#include "system.h"
#include "led.h"
#include "SysTick.h"
#include "beep.h"
#include "DigitalTube.h"
#include "key.h"int main()
{u8 key,i=0;SysTick_Init(72);LED_Init();
//	BEEP_Init();
//	DigitalTube_Init();key_Init();while(1){key=KEY_Scan(1);switch(key){case KEY_UP: 		led2=!led2;break;case KEY_DOWN: 	led3=!led3;break;			case KEY_LEFT: 	led4=!led4;break;	case KEY_RIGHT: led5=!led5;break;}i++;if(i%20 ==0){led1=!led1;//LED1闪}delay_ms(10);}
}

LED1闪,不使用直接在while里延时的方式 ,而是通过一个i做中间变量的方式 ,是因为假设直接使用延时,因为想看到灯闪,延时的时间就需要较长,而在延时的时间里,CPU等于延在那空等,这个时候按动按键,按键的检测可能反应就不够快!

key.c

#include "key.h"
#include "SysTick.h"void key_Init()
{GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);//同时打开PA和PE端口时钟GPIO_InitStructure.GPIO_Pin=KEY_UP_Pin; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;	//配置成输入、下拉电阻模式GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;	//输入模式的频率配不配置不影响GPIO_Init(KEY_UP_Port,&GPIO_InitStructure);//初始化KEY_UP_PinGPIO_InitStructure.GPIO_Pin=KEY_LEFT_Pin|KEY_DOWN_Pin|KEY_RIGHT_Pin; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;	//配置成输入、上拉电阻模式GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;	//输入模式的频率配不配置不影响GPIO_Init(KEY_Port,&GPIO_InitStructure);//初始化KEY_LEFT_Pin|KEY_DOWN_Pin|KEY_RIGHT_Pin
}u8 KEY_Scan(u8 mode) mode =0--单次扫描,mode =1--连接扫描
{static u8 key=1;//key用来判断按键是否连续按下;定义成static可以保证程序中断恢复时仍然保持上一次的值if(key==1&&(K_UP==1||K_DOWN==0||K_LEFT==0||K_RIGHT==0))//检测是否有按键按下{key=0;delay_ms(10);if(K_UP==1){return KEY_UP;}else if (K_DOWN==0){return KEY_DOWN;}else if (K_LEFT==0){return KEY_LEFT;}	else if (K_RIGHT==0){return KEY_RIGHT;}	}else if (K_UP==0&&K_DOWN==1&&K_LEFT==1&&K_RIGHT==1)//检测是否松开按键{key=1;}if(mode==1)//如果调用Key_Scan传进来的mode=1,则强制key始终等于1,这等于取消了上条的松开按键检测{key=1;}return 0;}

key.h

#ifndef _key_H
#define _key_H#include "system.h"#define KEY_UP_Pin					GPIO_Pin_0
#define KEY_UP_Port					GPIOA#define KEY_LEFT_Pin					GPIO_Pin_2
#define KEY_DOWN_Pin					GPIO_Pin_3
#define KEY_RIGHT_Pin					GPIO_Pin_4
#define KEY_Port							GPIOE//使用位带的方式读取引脚电平
#define K_UP					PAin(0)
#define K_DOWN				PEin(3)
#define K_LEFT				PEin(2)
#define K_RIGHT				PEin(4)//直接使用库函数的方式读取引脚电平
//#define K_UP					GPIO_ReadInputDataBit(KEY_UP_Port,KEY_UP_Pin)
//#define K_DOWN				GPIO_ReadInputDataBit(KEY_Port,KEY_DOWN_Pin)
//#define K_LEFT				GPIO_ReadInputDataBit(KEY_Port,KEY_LEFT_Pin)
//#define K_RIGHT				GPIO_ReadInputDataBit(KEY_Port,KEY_RIGHT_Pin)#define KEY_UP					1
#define KEY_DOWN				2
#define KEY_LEFT				3
#define KEY_RIGHT				4void key_Init(void);
u8 KEY_Scan(u8 mode);#endif

以上代码经实际上机实验,测试通过!

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

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

相关文章

Linux - Docker 安装 Nacos

拉取 Nacos 镜像 使用以下命令从 Docker Hub 拉取最新版本的 Nacos 镜像: docker pull nacos/nacos-server启动 Nacos 容器 使用以下命令启动 Nacos 容器: docker run -d \--name nacos \--privileged \--cgroupns host \--env JVM_XMX256m \--env M…

Git:使用conda命令切换虚拟环境

1. 问题 在win10电脑的Git中,无法使用conda list命令,报错(bash:conda:command not found)。也无法使用conda activate base命令激活虚拟环境,报错(bash:conda&#xff…

python免费调用阿里云通义千问(q-wen-max)大模型API

文章目录 通义千问开通免费API Keypython调用阿里云通义千问API 通义千问 通义千问,是基于阿里巴巴达摩院在自然语言处理领域的研究和积累。采用更先进的算法和更优化的模型结构,能够更准确地理解和生成自然语言、代码、表格等文本。 支持更多定制化需…

深度学习500问——Chapter08:目标检测(2)

文章目录 8.2.4 R-FCN 8.2.5 FPN 8.2.6 Mask R-CNN 8.2.4 R-FCN R-FCN 有哪些创新点 R-FCN仍然属于two-stage目标检测算法:RPN R-FCN Fully convolutional位置敏感得分图(position-sentive score maps) our region-based detector is ful…

vs code server for wsl closed unexpectedly

前言: 我的Windows 版本: 10.0.19045.4291 (如果你是Win11或者你要使用WSL2请谨慎) 之前是可以用的,但安装Vmware(并安装了Ubuntu进行了一番实验后,就出现如标题所述问题) 问题&a…

【SpringBoot实战篇】获取用户详细信息

1 明确需求 1需要获取用户详细信息 2 接口文档 1基本信息 2请求参数 无 3 响应数据 响应数据类型:application/json 响应参数说明: 响应数据样例 3 思路分析 1用户名在请求头里获取 4 开发 4.1 控制器usercontroller GetMapping("/userInfo")p…

Solidworks 2024安装教程(附免费安装包资源)

鼠标右击软件压缩包,选择“解压到Solidworks.2024”。 打开解压后的文件夹下的“SolidSQUAD”,双击“sw2024_network_serials_licensing”。 点击“是”。 点击“确定”。 复制“SolidWorks_Flexnet_Server”文件夹。 将其粘贴至C盘。 打开复制后的文件夹…

LabVIEW多设备控制与数据采集系统

LabVIEW多设备控制与数据采集系统 随着科技的进步,自动化测试与控制系统在工业、科研等领域的应用越来越广泛。开发了一种基于LabVIEW平台开发的多设备控制与数据采集系统,旨在解决多设备手动设置复杂、多路数据显示不直观、数据存储不便等问题。通过RS…

Matlab|【复现】主动配电网故障定位方法研究

目录 1 主要内容 算例模型 期望故障电流状态函数 评价函数(膨胀率函数) 算例验证方法 详实的文档说明 2 部分程序 3 程序结果 4 下载链接 1 主要内容 该程序方法复现了《基于改进多元宇宙算法的主动配电网故障定位方法研究》_郑聪,建…

【R语言】概率密度图

概率密度图是用来表示连续型数据的分布情况的一种图形化方法。它通过在数据的取值范围内绘制一条曲线来描述数据的分布情况,曲线下的面积代表了在该范围内观察到某一数值的概率。具体来说,对于给定的连续型数据,概率密度图会使用核密度估计&a…

【记录】Python3|Selenium 下载 PDF 不预览不弹窗(2024年)

版本: Chrome 124Python 3.12Selenium 4.19.0 版本与我有差异不要紧,只要别差异太大比如 Chrome 用 57 之前的版本了,就可以看本文。 如果你从前完全没使用过、没安装过Selenium,可以参考这篇博客《【记录】Python3|Se…

3D感知生成对抗网络的高斯溅射解码器

Gaussian Splatting Decoder for 3D-aware Generative Adversarial Networks 3D感知生成对抗网络的高斯溅射解码器 Florian Barthel1, 2  Arian Beckmann1  Wieland Morgenstern1  Anna Hilsmann1  Peter Eisert1,2 Florian Barthel 1, 2 阿里安贝克曼Wieland晨星Anna Hils…