STM32—启用按键

目录

1 、电路构成及原理图 

2、编写实现代码

main.c 

main.h

 key.c

3、代码讲解

4、 烧录到开发板调试、验证代码

5、检验效果


本人使用的是朗峰 STM32F103 系列开发板,此笔记基于这款开发板记录。


1 、电路构成及原理图 

重要!一定先用短路帽短接板上P5的2-3引脚,否则KEY_WKUP按键无效

通过按键原理图我们可以看到,按键 KEY1 和按键 KEY2 的各一端接到了 GND 端低电平端,KEY1 的另一端连接到 STM32 的 PC8 引脚;KEY2 的另一端连接到 STM32 的 PC9 引脚。而 KEY_WKUP 按键的一端接到了 VCC3.3V 高电平端另一端连接到了 STM32 的 PA0 引脚
(WKUP/唤醒)。 

通过原理图可知,当 KEY1 按下时 PC8 会被拉低为低电平,KEY2按下时 PC9 会被拉低为低电平,KEY_WKUP 按下时 PA0 会被拉高为高电平。 我们把 PC8、PC9、PA0 引脚的模式初始为输入模式,那么通过判断 PC8、PC9、PA0 引脚的低、高电平我们就可以知道哪一个按键被按下了。

2、编写实现代码

实现效果:

当按下 KEY1 按键,LED1 亮起。放开按键时 LED1 熄灭。 
当按下 KEY2 按键,LED2 亮起。放开按键时 LED2 熄灭。 
当按下 KEY_WKUP 按键,蜂鸣器响起。放开按键时蜂鸣器停止发声。 

main.c 

#include "main.h"int main(void)
{uint8_t i;/*HAL库初始化*/HAL_Init(); /*初始化系统时钟频率为72MHz及延时函数初始化*/SystemClock_init(RCC_PLL_MUL9);/*初始化按键通用输入输出端口*/key_Init();/*初始化LED通用输入输出端口*/Led_Init();/*蜂鸣器IO初始化*/beep_init();while (1){i=key_scan();          //检测按键按下情况switch(i){            case KEY_1_PUSH:      //如果KEY_1按下,LED1(红色)亮起LED1_L;break;case KEY_2_PUSH:      //如果KEY_2按下,LED2(绿色)亮起LED2_L;break;case KEY_WKUP_PUSH:   //如果KEY_WKUP按下,蜂鸣器响起beep_L;break;case 0:               //如果没有按键按下LED熄灭蜂鸣器不发声LED1_H;LED2_H;beep_H;}}
}

main.h

#ifndef __main_H_
#define __main_H_#include "stm32f1xx.h"
#include "stm32f1xx_hal.h"
#include "User_Settings.h"
#include "key.h"
#include "led.h"
#include "beep.h"

 key.c


/*** @brief   检测按键输入代码* @file    key.c* @Board   朗峰 STM32 F103RCT6系列开发板  */#include "key.h"/**
* @brief  初始化按键通用输入输出端口       
* @param  none
* @retval none
*/
void key_Init(void)
{GPIO_InitTypeDef GPIO_Init;          //GPIO_Init:GPIO_InitTypeDef结构体类型的变量//使用GPIO之前必须开启GPIO端口时钟__HAL_RCC_GPIOA_CLK_ENABLE();        //开启GPIOA时钟__HAL_RCC_GPIOC_CLK_ENABLE();        //开启GPIOC时钟GPIO_Init.Pin=GPIO_PIN_0;            //KEY_WUKP引脚PA0GPIO_Init.Mode=GPIO_MODE_INPUT;      //模式为输入模式GPIO_Init.Pull=GPIO_PULLDOWN;        //激活下拉GPIO_Init.Speed=GPIO_SPEED_FREQ_HIGH;//端口速度选择高速HAL_GPIO_Init(GPIOA,&GPIO_Init);     //按以上设置初始化引脚PA0GPIO_Init.Pin=GPIO_PIN_8|GPIO_PIN_9; //KEY_1引脚PC8,KEY_2引脚PC9GPIO_Init.Mode=GPIO_MODE_INPUT;      //模式为输入模式GPIO_Init.Pull=GPIO_PULLUP;          //激活上拉GPIO_Init.Speed=GPIO_SPEED_FREQ_HIGH;//端口速度选择高速HAL_GPIO_Init(GPIOC,&GPIO_Init);     //按以上设置初始化引脚PC8,PC9
}/**
* @brief  检测按键输入       
* @param  none
* @retval KEY_1按下时返回 KEY_1_PUSHKEY_2按下时返回 KEY_2_PUSHKEY_WKUP按下时返回 KEY_WKUP_PUSH无按键按下时返回0
*/uint8_t key_scan(void)
{delay_ms(15);if(KEY_1==0) return KEY_1_PUSH;else if(KEY_2==0) return KEY_2_PUSH;else if(KEY_WKUP==1) return KEY_WKUP_PUSH;              return 0;}

 led.c


/*** @brief   led驱动代码* @file    led.c* @Board   朗峰 STM32 F103RCT6系列开发板  */#include "led.h"/**
* @brief  初始化LED通用输入输出端口     
* @param  none
* @retval none
*/
void Led_Init(void)
{GPIO_InitTypeDef GPIO_Init;             //GPIO_Init:GPIO_InitTypeDef 结构体类型的变量//使用GPIO之前必须开启GPIO端口时钟__HAL_RCC_GPIOB_CLK_ENABLE();           //开启GPIOB时钟__HAL_RCC_GPIOC_CLK_ENABLE();           //开启GPIOC时钟GPIO_Init.Pin=GPIO_PIN_9; 				      //LED2 IO引脚PB9GPIO_Init.Mode=GPIO_MODE_OUTPUT_PP;  	  //输出模式选择推挽输出GPIO_Init.Pull=GPIO_PULLUP;            	//激活上拉GPIO_Init.Speed=GPIO_SPEED_FREQ_HIGH;   //端口速度选择高速HAL_GPIO_Init(GPIOB,&GPIO_Init);        //按以上设置初始化引脚PB9GPIO_Init.Pin=GPIO_PIN_6|GPIO_PIN_13; 	//LED1 IO引脚PC6 PC13是LCD屏背光HAL_GPIO_Init(GPIOC,&GPIO_Init);HAL_GPIO_WritePin(GPIOC,GPIO_PIN_12|GPIO_PIN_13,GPIO_PIN_RESET);//未使用LCD屏关闭背光以节电LED1_H;                                  //LED1置高电平。默认led1不亮起LED2_H;                                  //LED2置高电平。默认led2不亮起}

3、代码讲解

源文件 main.c 只 include “main.h”一个头文件而没有
包含其它外设等的头文件,这样看起来页面很清爽简洁,那其它的头
文件都放在哪里了呐?答案是都放在了 main.h 中,其它地方也可以
这样使用哦。

先看按键的初始化函数 void key_Init(void),这里的第一个void 表示这是个无返回值的函数,第二个在括号的 void 表示这个函数无参数。 
按照流程,依旧是先开启端口 A 和端口 C 的时钟、端口模式为输入模式、速度为高速、其中 PA0 设置为下拉,PC8,PC9 设置为上拉 ,最后按以上设置初始化。 
再接着看检测按键输入函数 uint8_t  key_scan(void),这里的uint8_t 表示函数的类型,void 依旧说明该函数无参。 

 最后回头看一下主 main 函数:按照流程的初始化 HAL 库、设置系统时钟(72Mhz)、初始化按键、初始化 LED、初始化蜂鸣器。 
接下来进入 while()循环,首先就是循环检测是否有按键按下,之后使用了 switch 条件判断语句来判断具体是哪个按键被按下了而且实现对应的控制。 
具 体 看 , 当 被 key_scan() 返 回 值 赋 值 的 变 量 i 满 足 条 件KEY_1_PUSH:即 KEY1 按键被按下了,那就点亮 LED1:LED1_L;这句应该就很熟悉了; 

当 i 满足条件 KEY_2_PUSH:即 KEY2 按键被按下了,  那就点亮LED2:LED2_L; 
当 i 满足条件 KEY_WKUP_PUSH:即 KE_WKUP 按键被按下了,  那就驱动蜂鸣器发声。 
如果三个判断条件都不被满足,也就是没有按键按下那就将LED1、LED2、beep 都置高电平即 LED 不点亮蜂鸣器不发声。

4、 烧录到开发板调试、验证代码

编译一次,编译结果显示 0 错误 0 警告就 OK ,之后再按 将代码下载到开发板。 (具体可参考之前的内容,重复不赘述)

5、检验效果

连接好开发板电源并按下电源开关就可以通过分别按下KEY1,KEY2,KEY_WKUP 按键观察结果是否与代码中设置的结果一致了。 

检验效果:

当按下 KEY1 按键,LED1 亮起。放开按键时 LED1 熄灭。 
当按下 KEY2 按键,LED2 亮起。放开按键时 LED2 熄灭。 
当按下 KEY_WKUP 按键,蜂鸣器响起。放开按键时蜂鸣器停止发声。 


完美契合!

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

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

相关文章

LabVIEW轨道交通列车牵引制动试验平台

LabVIEW轨道交通列车牵引制动试验平台 概述 面对城市轨道交通领域对于高效、准确牵引制动系统的迫切需求,开发了一套基于LabVIEW软件与硬件相结合的试验平台。该平台模拟列车的牵引、制动等工况,通过高精度的数据采集与实时图形化展示,提升…

工具:clang-format使用

Visual Studio 在扩展-》管理扩展-》联机-》搜索Format on Save (for VS2022)插件,并安装 安装需要关闭VS,安装后重新打开vs。 这样每次保存源文件时就会自动调用vs默认的clang-format.exe对源码进行缩进,空格等进行格式化 如果想使用自定…

CSS列表学习2

之前学习了列表&#xff1b;继续熟悉&#xff1b; <!DOCTYPE html> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/><title></title><meta charset"utf-8" /><…

leetcode hot100单词拆分

在本题中&#xff0c;我们是要把一个字符串&#xff0c;判断是否能用给的字符串数组中的单词进行拆分&#xff0c;如果可以则返回true&#xff0c;不能的话则返回false。这个题一开始看无法与背包问题联系在一起。但仔细考虑&#xff0c;就是用物品&#xff08;给的字符串数组中…

数据分析(二)自动生成分析报告

1. 报告生成思路概述 怎么快速一份简单的数据分析报告&#xff0c;注意这个报告的特点&#xff1a; --网页版&#xff0c;可以支持在线观看或者分享HTML文件 --标题&#xff0c;动图&#xff0c;原始数据应有尽有 --支持交互&#xff0c;比如plotly交互画面&#xff0c;数据…

索引聚簇因子clustering_factor太大导致不走索引

查询条件超过一个月就不走索引&#xff1a; 检查表的block数和数据行数&#xff1a; select blocks,num_rows from dba_tables where table_name‘MS_MZXX’;blocks:618687 num_rows:20335462 查看聚簇因子clustering_factor的数&#xff1a;select clustering_factor from d…

力扣OJ题——随机链表的复制

题目&#xff1a; 138. 随机链表的复制 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 要求&#xff1a;构造这个链表的 深拷贝 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中…

Vulhub 练习 DC-4靶机完整复现

1.工具 kali:攻击机 IP地址&#xff1a;192.168.200.4 DC-4&#xff1a;靶机 IP地址&#xff1a;暂时未知 2.注意 这里搭建环境两台机器应该选用同类的网络连接方式&#xff1a;这里两台的连接方式为模式 二、信息收集 1.主机发现 找寻同网段下存活的主机&#xff08;可…

ChatGPT调教指南 | 咒语指南 | Prompts提示词教程(二)

在我们开始探索人工智能的世界时&#xff0c;了解如何与之有效沉浸交流是至关重要的。想象一下&#xff0c;你手中有一把钥匙&#xff0c;可以解锁与OpenAI的GPT模型沟通的无限可能。这把钥匙就是——正确的提示词&#xff08;prompts&#xff09;。无论你是AI领域的新手&#…

不要抱怨,不如抱 Java 运算符吧 (1)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

Windows系统中定时执行python脚本

背景&#xff1a;本地Windows系统指定目录下会有文件的修改新增&#xff0c;这些变化的文件需要定时的被上传到git仓库中&#xff0c;这样不需要每次变更手动上传了。 首先编写一个检测文件夹下文件变化并且上传git仓库的python脚本(确保你已经在E:\edc_workspace\data_edc_et…

一键安装ROS适用于Ubuntu22/20/18

一键安装ROS适用于Ubuntu22/20/18 1、简介 ROS&#xff08;Robot Operating System&#xff0c;机器人操作系统&#xff09;是一个用于机器人软件开发的框架。它提供了一套工具和库&#xff0c;用于机器人应用程序的开发、测试和部署。ROS是由美国斯坦福大学机器人实验室&…

笔试题详解(C语言进阶)

前言 欢迎阅读本篇文章&#xff01;本篇文章通过一个笔试题来加强我们对C语言的理解&#xff0c;希望对你有帮助。后续我会写一个栏目&#xff0c;集合我见到的C语言题目&#xff0c;进行分析讲解。 1、题目一 判断下面程序的输出结果&#xff1a;(下面说的地址4/8字节是因为对…

Docker部署Halo容器并结合内网穿透实现公网访问本地个人博客

文章目录 1. Docker部署Halo1.1 检查Docker版本如果未安装Docker可参考已安装Docker步骤&#xff1a;1.2 在Docker中部署Halo 2. Linux安装Cpolar2.1 打开服务器防火墙2.2 安装cpolar内网穿透 3. 配置Halo个人博客公网地址4. 固定Halo公网地址 本文主要介绍如何在CentOS 7系统使…

JAVAEE初阶 网络编程(十一)

HTTP协议 一. GET和POST方法二. Post和Get的区别三. HTTP协议中的请求报头部分1. Host2.Content-Length3.Content-Type4.User-Agent5. Referer6.Cookie 一. GET和POST方法 Get方法应用场景有很多,比如下列这个例子. Post方法主要应用在上传和登录上. 一般来说,Get方法没有body,…

百度百科词条在网络推广中的六大作用

也许很多网友都发现了&#xff0c;在网上查资料&#xff0c;百科词条往往是优先展示的。一方面因为百科是搜索引擎自身的平台&#xff0c;另一方面就是因为百科信息权威&#xff0c;网友认可度高。所以企业开展网络营销&#xff0c;百科营销是一块重要阵地。 也有的企业认为百科…

Autosar-Mcal配置详解-GPT

3.3.1添加GPT模块 方法与添加Dio相似&#xff0c;可参加Dio模块添加方法。 3.3.2 创建、配置GPT通道 1)根据需求创建GPT通道&#xff08;即创建几个定时器&#xff09; 本例中创建了3个定时器通道&#xff1a;1ms&#xff0c;100us&#xff0c;OsTimer。 2)配置GPT通道 配置T…

Android全新UI框架之常用ComposeUI组件

在Compose中&#xff0c;每个组件都是一个带有Composable注解的函数&#xff0c;被称为Composable。Compose已经预置了很多基于MD设计规范的Composable组件。 在布局方面&#xff0c;Compose提供了Column、Row、Box三种布局组件(感觉跟flutter差不多)&#xff0c;类似于传统视图…

​LeetCode解法汇总106. 从中序与后序遍历序列构造二叉树

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 给定两个…

如何使用ArcGIS Pro生成等高线

无论在制图还是规划中&#xff0c;经常会使用到等高线&#xff0c;大多数情况下&#xff0c;从网上获取的高程数据都是DEM文件&#xff0c;我们可以通过ArcGIS Pro来生成等高线&#xff0c;这里为大家介绍一下生成方法&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的…