【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站课程,为笔记