当前位置: 首页 > 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.dtcms.com/a/312751.html

相关文章:

  • PYTHON从入门到实践-18Django模版渲染
  • 我的世界进阶模组开发教程——伤害(2)
  • 20250803让飞凌OK3576-C开发板在Rockchip的原厂Android14下适配声卡NAU88C22YG【Android部分】
  • C++:STL中的栈和队列的适配器deque
  • 多模态大模型的原理
  • 机器人产业需要技术与资本双驱动,在泡沫期中探索商业化路径
  • Python中的sys.path与PYTHONPATH全解析:模块导入路径的底层机制与最佳实践
  • LDAP身份验证前世今生
  • Corrosion2靶机练习笔记
  • 大语言模型的解码策略:贪婪解码与波束搜索
  • Coze 打通飞书多维表格,实现数据增删改查操作实战详解
  • kraft的设计与实现
  • 嵌入式——数据结构:单向链表的函数创建
  • Linux系统之mcookie 命令详解
  • Java小红书源码1:1还原uniapp_仿小红书源码
  • Nginx负载均衡配置
  • STM32 串口发送
  • sqli-labs:Less-25关卡详细解析
  • c++ --- priority_queue的使用以及简单实现
  • Navicat连接远程服务器上的mysql
  • Java Stream API 编程实战
  • Java学习第一百部分——Kafka
  • Python批处理深度解析:构建高效大规模数据处理系统
  • kubectl基础操作实战-k8s集群安装
  • IO流-字节流-FileInputStream
  • 【设计模式】0.UML类图
  • Python特性工厂函数详解:优雅管理属性验证
  • 【技术干货】Matplotlib深度集成PyQt5实战:动态_静态图表一站式解决方案
  • 嵌入式学习-(李宏毅)机器学习(5)-day32
  • 集合篇-根据字符串出现频率排序