STM32-笔记4-按键点亮led

server/2024/12/22 22:26:26/

 

 

 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/server/152335.html

相关文章

软件维护的实施

软件维护活动 (1) 维护机构 除了较大的软件开发公司外,通常在软件维护工作方面,不保持正式的维护机构。维护往往是在没有计划的情况下进行的。虽然不要求建立一个正式的维护机构,但是在开发部门,确立一个非正式的维护机构则是非常…

【Http,Netty,Socket,WebSocket的应用场景和区别】

Http,Netty,Socket,WebSocket的应用场景和区别 Http、Netty、Socket、WebSocket都是网络通信领域中的重要技术和工具,它们在应用场景和特性上有所区别。以下是对这四种技术和工具的应用场景及区别的详细分析: Http的…

docker如何学习与使用入门

学习和使用 Docker 的入门可以分为以下几个步骤。Docker 是一个功能强大的工具,通过容器化技术使得应用开发和部署更加高效、简便。以下是一个逐步的学习路径,帮助你从入门到熟练掌握 Docker。 1. 理解容器化的概念 在学习 Docker 之前,先了…

深度解析京东API接口:如何高效获取商品详情与SKU信息

在当下电商蓬勃发展的时代,如何高效地获取商品详情与SKU(Stock Keeping Unit,库存单位)信息成为了商家们进行电商运营、价格比较、库存管理及市场分析等活动的关键。京东API接口为此提供了强大的支持,使得开发者能够通…

ios 混合开发应用白屏问题

一、问题场景 项目业务中某个前端页面中使用了多个echart 组件来显示历史数据, 在反复切换到这个页面后,会出现白屏问题。 二、问题分析 0x116000ab0 - GPUProcessProxy::didClose: 0x116000ab0 - GPUProcessProxy::gpuProcessExited: reasonCrash 0x11…

XXE靶场

XXE-lab 靶场 靶场网址&#xff1a;http://172.16.0.87/ 第一步我们看到网站有登录框我们试着用 bp 去抓一下包 将抓到的包发到重放器中 然后我们构建palody <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "php://filter/readconvert.base64-encode/resourceC:/flag/fla…

WordPress 去除?v= 动态后缀

Wordpress url后面带有?vxxx的参数符&#xff0c;这种现象出现在安装了Woocommerce插件的店铺类型站点上&#xff0c;参数的作用是帮助系统根据用户的geographic定位计算 tax and shipping fee。 如何删除&#xff1f; 后台进入WooCommerce Settings &#xff0c;将根据IP定…

联发科MTK8788_MT8788安卓核心板安兔兔跑分_安卓主板方案商

MT8788安卓核心板具有集成的蓝牙、fm、WLAN和gps模块&#xff0c;是一个高度集成的基带平台&#xff0c;包括调制解调器和应用处理子系统&#xff0c;启用LTE/LTE-A和C2K智能设备应用程序。该芯片集成了工作在2.0GHz的ARM Cortex-A73、最高可达2.0GHz的ARM Cortex-A53和功能强大…