当前位置: 首页 > news >正文

【stm32】按键控制LED以及光敏传感器控制蜂鸣器

按键控制LED

思考:包含完成LED和按键的驱动代码,但若将这两部分代码都放在主函数中,会使代码较乱,不易管理,也不易移植,故将这种驱动代码封装起来,单独放在另外的.c文件和.h文件里

1.新建文件夹Hardware用来存放硬件驱动

在这里插入图片描述
2.回到keil,点击三个箱子按钮,打开工程管理,新建组Hardware

在这里插入图片描述

3.点击魔术棒按钮,打开工程选项,在C/C++中include Paths将Hardware文件夹添加到头文件路径

在这里插入图片描述

4.在Hardware中添加新文件LED.c,LED.h来封装LED驱动程序,并在.c中写出开头

#include "stm32f10x.h"                  // Device header

.h中要添加一个防止头文件重复的代码:

#ifndef __LED_H
#define __LED_H#endif//最后一行空格结尾

按键同理

在这里插入图片描述

5. 初始化LED

void LED_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_SetBits(GPIOA,GPIO_Pin_1 | GPIO_Pin_2);//不操作LED,Led熄灭
}

点亮和熄灭LED1,LED2同理

void LED1_ON(void)
{GPIO_ResetBits(GPIOA,GPIO_Pin_1);
}void LED1_OFF(void)
{GPIO_SetBits(GPIOA,GPIO_Pin_1);
}

若觉得函数太多,也可以定义LED_Set函数,定义两个参数,一个参数选择操作哪个灯,另一个参数选择开还是关

初始化按键(按键接在PB1和PB11上):

void Key_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);
}

读取按键值函数:

uint8_t Key_GetNum(void)
{  uint8_t KeyNum = 0;//没按下返回0if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)//如果按键按下{Delay_ms(20);//按键按下有抖动,需要消抖while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0);//如果按键一直按下Delay_ms(20);KeyNum = 1;}//同理LED2if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0){Delay_ms(20);while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) ==0 );Delay_ms(20);KeyNum = 2;}return KeyNum;
}

补充:GPIO读取函数:

在这里插入图片描述

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

读取输入数据寄存器某一端口输入值

uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);

读取整个输入数据寄存器,返回数据类型为uint16_t,是一个16位的数据,每一位代表一个端口值

uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

读取输出数据寄存器某一位,一般用于输出模式下,看自己输出的是什么

uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);

读取整个输出寄存器

若想实现按键按下。LED熄灭,再按下,LED点亮,需要用到下面状态取反函数:

void LED1_Turn(void)
{if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1) == 0){GPIO_SetBits(GPIOA, GPIO_Pin_1);}else{GPIO_ResetBits(GPIOA, GPIO_Pin_1);}
}

LED2同理

若想实现按下按键1,LED1亮,按下按键2,LED2亮,代码见附件
若想实现光敏传感器控制蜂鸣器,见附件

注;本文来源为江协b站课程,为笔记

http://www.lryc.cn/news/609089.html

相关文章:

  • STM32-驱动OLED显示屏使用SPI(软件模拟时序)实现
  • Spring Boot 的事务注解 @Transactional 失效的几种情况
  • 【硬件-笔试面试题】硬件/电子工程师,笔试面试题-55,(知识点:STM32,外设及其特点)
  • 前端开发(HTML,CSS,VUE,JS)从入门到精通!第四天(DOM编程和AJAX异步交互)
  • 08【C++ 初阶】类和对象(下篇) --- 类知识的额外补充
  • MySQL 事务原理 + ACID笔记
  • 计算机网络(TCP篇)
  • Python3 中使用zipfile进行文件(夹)的压缩、解压缩
  • Qt-vs加载exe图标
  • 【机器人】VLN-R1 微调 | 增强训练 | 连续导航
  • 江协科技STM32 14-1 WDG看门狗
  • 一键安装RabbitMQ脚本
  • 数据结构(概念及链表)
  • 【数据分享】各省粮食外贸依存度、粮食波动率等粮食相关数据合集(2011-2022)(获取方式看文末)
  • 达梦数据库备份与还原终极指南:从基础到增量策略实战
  • 【2025/08/03】GitHub 今日热门项目
  • Spring 核心之 Bean 管理:配置、作用域与生命周期详解
  • 计算机核心概念辨析与解析
  • LeetCode 2122.还原原数组
  • OpenWrt | 如何在 ucode 脚本中打印日志
  • C语言的基本结构
  • 加密流量论文复现:《Detecting DNS over HTTPS based data exfiltration》(上)
  • 代码随想录算法训练营第五十八天|动态规划part8
  • Linux 内存调优之如何限制进程、系统级别内存资源
  • 论文阅读笔记:《Dataset Condensation with Distribution Matching》
  • 学习方法论
  • React中的Hooks
  • 【深度学习新浪潮】谷歌新推出的AlphaEarth是款什么产品?
  • Unity_数据持久化_XML序列化与反序列化
  • 05.Redis 图形工具RDM