基于stm32标准库的按键控制LED灯

一、功能解释

比照接线图,分别用按键1(下)和按键2(上)控制LED红灯和LED绿灯,实现闭合按键(按下)灯亮,否则灯灭的控制功能。

配置:stm32f103c8主芯片,Keil uVision5编程软件。

二、接线图

基于stm32标准库的按键控制LED灯_第1张图片

二、程序详解

(一)预处理命令和结构体

#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灯。

你可能感兴趣的:(STM32基础学习,stm32,单片机,嵌入式硬件)