当前位置: 首页 > 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.xdnf.cn/news/1236007.html

相关文章:

  • OSPF知识点整理
  • 实战《从0开始使用SwiftUI搭建记账软件》- 2、SwiftUI 知识点详解与使用场景
  • 6.1、Redis多级缓存原理和优化、Redis部分参数优化调整
  • 【超分辨率专题】PiSA-SR:单步Diff超分新突破,即快又好,还能在线调参
  • Linux 摄像头实时抓取:V4L2、FFmpeg 与 GStreamer 全面讲解
  • python工具方法51 视频数据的扩充(翻转、resize、crop、re_fps)
  • Transformer模型用于MT信号相关性预测与分析
  • 《深入浅出RabbitMQ:从零基础到面试通关》
  • 渗透作业4
  • wordpress登陆前登陆后显示不同的顶部菜单
  • 数据结构代码
  • 08.Redis 持久化
  • AOP动态代理
  • #C语言——刷题攻略:牛客编程入门训练(四):运算
  • 大屏项目展示
  • 面向智能体的上下文工程:策略、实现与 LangGraph 实践
  • 09.Redis 常用命令
  • STM32-ESP8266通过MQTT与阿里云通讯
  • Coze 打通飞书多维表格,实现数据增删改查操作实战详解
  • Java线程安全类设计思路总结
  • kafka 是一个怎样的系统?是消息队列(MQ)还是一个分布式流处理平台?
  • RabbitMQ死信队列与消息幂等性实践指南
  • Rust:如何访问 *.ini 配置文件?
  • 关于车位引导及汽车乘梯解决方案的专业性、系统性、可落地性强的综合设计方案与技术实现说明,旨在为现代智慧停车楼提供高效、安全、智能的停车体验。
  • Noob靶场练习
  • 【python实用小脚本-169】『Python』所见即所得 Markdown 编辑器:写完即出网页预览——告别“写完→保存→刷新”三连
  • Rustdesk中继服务器搭建(windows 服务器)
  • SQL注入SQLi-LABS 靶场less31-38详细通关攻略
  • Python篇--- Python 的加载、缓存、覆盖机制
  • (FD Conv)Frequency Dynamic Convolution for Dense Image Prediction论文精读(逐段解析)