STM32-笔记4-按键点亮led

devtools/2024/12/23 10:30:19/

 

 

 1、复制03项目流水灯,重命名改成05项目,05-按键控制翻转灯的状态

在BSP文件夹里新建key文件夹,在该文件夹里面,新建两个key.c和key.h文件

 

 2、打开工程文件-加载文件

        在品和魔术棒里面把刚才新建的key文件夹里面的.c 和.h文件加载到工程文件中(不会加载请看前面的笔记

3、在key.c和key.h文件中写入代码

在key.c文件中写入这两个头文件,点击编译,编译通过,在侧边栏中可以在key.c文件的下面看到key.h文件

4、按键使用的是GPIO口的输入功能

代码解析都在代码的注释里

代码:key.c

#include "key.h"
#include "sys.h"//关于时钟的头文件
#include "delay.h"//初始化GPIO口
void key_init(void)//每一个外设都有它自己的初始化函数
{GPIO_InitTypeDef gpio_initstruct;//定义一个结构体gpio_initstruct//打开时钟__HAL_RCC_GPIOA_CLK_ENABLE();//调用GPIO初始化函数gpio_initstruct.Mode = GPIO_MODE_INPUT;//浮动输入模式//结构体函数的四种类型,引脚模式、引脚、引脚上拉下拉、引脚速度gpio_initstruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;//LED1对应的引脚gpio_initstruct.Pull = GPIO_PULLUP;//默认给一个上拉电平gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;//高速HAL_GPIO_Init(GPIOA,&gpio_initstruct);
}//检测摁键是否被按下
//不停的检测摁键是否是低电平(摁键扫描函数)
uint8_t key_scan(void)//需要返回一个值,来代表按键是否被按下
{//1、检测按键是否按下if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_RESET){//2、如果按键按下,消抖(5-10ms)delay_ms(10);//3、再检测按键是否按下if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_RESET){//4、如果确实是被按下的状态,等待按键松开while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_RESET);//在这里用while语句来等待按键状态变化//如果按键状态一直是RESET那么就是一直按下没变,否则退出循环(松开了)//5、返回按键的值return 1;}}//1、检测按键是否按下if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1) == GPIO_PIN_RESET){//2、如果按键按下,消抖(5-10ms)delay_ms(10);//3、再检测按键是否按下if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1) == GPIO_PIN_RESET){//4、如果确实是被按下的状态,等待按键松开while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1) == GPIO_PIN_RESET);//5、返回按键的值return 2;}}//6、如果前面的状态都不是,就返回默认的值return 0;
}

key.h

#ifndef __KEY_H__
#define __KEY_H__
#include "sys.h"//也可以用#include "stdint.h"头文件,这里的sys.h包含了stdint.h头文件,使用一个就行void key_init(void);
uint8_t key_scan(void);#endif

main.c

#include "sys.h"
#include "delay.h"
#include "led.h"
#include "key.h"int main(void)
{HAL_Init();                         /* 初始化HAL库 */stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */led_init();//初始化led灯key_init(); //初始化key按键uint8_t key_com = 0;//定义一个uint8类型的key_com变量while(1){ key_com = key_scan();//用key_com变量承接key_scan()函数的值//在这里,如果不用变量承接key_scan()函数的值,也可以达到相同的结果,就是不规范if(key_com == 1)//判断变量的值,来决定是哪个led进行状态翻转led1_Toggle();if(key_com == 2)led2_Toggle();}
}


http://www.ppmy.cn/devtools/144660.html

相关文章

故障诊断 | 一个小创新:特征提取+KAN分类

往期精彩内容: Python-凯斯西储大学(CWRU)轴承数据解读与分类处理 基于FFT CNN - BiGRU-Attention 时域、频域特征注意力融合的轴承故障识别模型-CSDN博客 基于FFT CNN - Transformer 时域、频域特征融合的轴承故障识别模型-CSDN博客 P…

apache的常见报错

文章目录 一、httpd -k install -n Apache输入后,提示拒绝访问怎么办解决方案 二、命令行输入:httpd -t 报错解决方案 三、httpd -k install -n Apache输入后,另外一种报错解决方案测试是否成功 四、路径问题引起报错解决方案 一、httpd -k i…

vue-element-admin npm install 安装失败,tui-editor更名导致

导语: 本失败原因是由于tui-editor(富文本编辑器插件)更名造成的,现在已经更名为toast-ui/editor; 在一个是一直以为是我的git问题 报错代码:code 128 ..........,困扰了我好长时间&#xff…

小程序中使用 Vue2 + Vuex 实现数据存储与获取

在小程序开发中,数据的存储与获取是一个非常重要的环节。本文将介绍如何在小程序中使用 Vue2 和 Vuex 实现数据的存储与获取。我们将通过一个具体的例子来展示如何在 Vuex 中管理用户信息和机构信息,并在组件中使用这些数据。 项目结构 首先&#xff0…

Android学习(六)-Kotlin编程语言-数据类与单例类

假设我们要创建一个表示书籍的数据类 Book,包含书名和作者两个字段。在 Java 中,代码如下: public class Book { String title; String author; public Book(String title, String author) { this.title title; this.author author; } Ove…

校园点餐订餐外卖跑腿Java源码

简介: 一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的外卖案例项目 经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合&am…

Vue项目的iconfont引入

目录 前言引入结果一些问题 前言 由于我用axure进行原型设计时,没有记住用的是哪个网站的icon了(我收藏了挺多外网内网的icon网站,找了一遍还是没找到),现在编程网页时,发现我好像不能在axure里复制svg代码…

Apache解析漏洞(apache_parsingCVE-2017-15715)

apache_parsing 到浏览器中访问网站 http://8.155.8.239:81/ 我们写一个木马 1.php.jpg 我们将写好的木马上传 会得到我们上传文件的路径 我们访问一下 发现上传成功 发现木马运行成功,接下来使用蚁剑连接我们的图片马 获取 shell 成功 CVE-2013-454 我们还是到…