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

一、功能解释

比照接线图,分别用按键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灯。

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用STM32标准库函数来实现按键控制LED和继电器。以下是基本的流程: 1. 首先需要初始化GPIO口,将LED和继电器的控制引脚配置为输出模式,将按键的引脚配置为输入模式。可以使用STM32标准库函数GPIO_Init()进行初始化。 2. 然后需要设置按键的中断,以便在按键按下时能够检测到。可以使用STM32标准库函数EXTI_Init()进行中断设置。 3. 当检测到按键按下时,可以使用中断服务函数来改变LED和继电器的状态。可以使用STM32标准库函数GPIO_WriteBit()来控制LED和继电器的状态。 下面是示例代码: ``` #include "stm32f10x.h" void GPIO_Configuration(void); void EXTI_Configuration(void); void Delay(__IO uint32_t nCount); int main(void) { GPIO_Configuration(); EXTI_Configuration(); while(1) { // do nothing } } void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; // LED引脚配置 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); // 继电器引脚配置 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_Init(GPIOA, &GPIO_InitStructure); // 按键引脚配置 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOB, &GPIO_InitStructure); } void EXTI_Configuration(void) { EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; // 按键中断配置 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0); EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void EXTI0_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line0) != RESET) { // 切换LED状态 GPIO_WriteBit(GPIOC, GPIO_Pin_0, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_0))); // 切换继电器状态 GPIO_WriteBit(GPIOA, GPIO_Pin_1, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1))); Delay(500000); // 延时消抖 EXTI_ClearITPendingBit(EXTI_Line0); } } void Delay(__IO uint32_t nCount) { for(; nCount != 0; nCount--); } ``` 在上面的示例代码中,PA1引脚控制的是继电器的开关,PC0引脚控制的是LED的开关,PB0引脚连接的是按键。在按键按下时,会触发EXTI0_IRQHandler()函数,该函数中会切换LED和继电器的状态。注意需要加入延时消抖的操作,以避免多次触发中断。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值