一、功能解释
比照接线图,分别用按键1(下)和按键2(上)控制LED红灯和LED绿灯,实现闭合按键(按下)灯亮,否则灯灭的控制功能。
配置:stm32f103c8主芯片,Keil uVision5编程软件。
二、接线图
二、程序详解
(一)预处理命令和结构体
#include "stm32f10x.h"
#include "Delay.h"
int main(void)
{
// 启用GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 配置GPIOA引脚
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; // 使用所有引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 输出速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);
(二)功能程序详解
1、获取按键对应引脚状态。程序如下:
GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4)
这个程序的含义是,获取与pin4连接的按键是否闭合,闭合返回1,否则返回0(按键的另一端连接Vcc)。
GPIO_ReadInputDataBit()函数有返回值,为1或0,分别表示对应引脚的输入状态为高电平或低电平。
ps:
类似的函数有GPIO_ReadOutputDataBit(),其返回值为对应引脚的输出状态,同样为1或0.
2、控制引脚输出状态
GPIO_SetBits(GPIOA, GPIO_Pin_0);
GPIO_ResetBits(GPIOA, GPIO_Pin_0);
GPIO_SetBits():控制对应引脚输出高电平,对应LED灯灭;
GPIO_ResetBits();控制对应引脚输出低电平,对应LED灯亮;
ps:LED灯负极端与引脚相连接,正极端连接Vcc。
(三)、功能逻辑
如果按键闭合(按下按键),即GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4)返回值为0(低电平),因为LED灯负极端与引脚相连接,正极端连接Vcc,所以灯亮;反之,灯灭。
完整功能代码:
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4) == 0)
{
// 如果引脚4为低电平,将引脚0设置为高电平
GPIO_SetBits(GPIOA, GPIO_Pin_0);
}
else
{
// 如果引脚4为高电平,将引脚0设置为低电平
GPIO_ResetBits(GPIOA, GPIO_Pin_0);
}
ps:
这是一个按键控制一个LED灯的功能程序组,可按照需求增加功能程序组的数量,以实现多个按键控制多个LED灯,只需配置引脚即可。
四、完整程序示
#include "stm32f10x.h"
#include "Delay.h"
int main(void)
{
// 启用GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 配置GPIOA引脚
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; // 使用所有引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 输出速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);
while (1)
{
// 检测GPIOA引脚4的状态
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4) == 0)
{
// 如果引脚4为低电平,将引脚0设置为高电平
GPIO_SetBits(GPIOA, GPIO_Pin_0);
}
else
{
// 如果引脚4为高电平,将引脚0设置为低电平
GPIO_ResetBits(GPIOA, GPIO_Pin_0);
}
// 检测GPIOA引脚6的状态
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6) == 0)
{
// 如果引脚6为低电平,将引脚2设置为高电平
GPIO_SetBits(GPIOA, GPIO_Pin_2);
}
else
{
// 如果引脚6为高电平,将引脚2设置为低电平
GPIO_ResetBits(GPIOA, GPIO_Pin_2);
}
}
}
五、效果演示
基于stm32的按键控制LED灯
写在后面:
学会使用按键控制LED灯的程序编写后,我们可以试着将外设按键,更换成光敏传感器等传感器,再观察现象。或者,试着编写用多个按键控制一个LED灯,和用按键和传感器组合控制LED灯。