使用STM32实现按键控制LED

要使用STM32实现按键控制LED,首先需要了解STM32的GPIO和中断模块。GPIO用于控制IO口,可以将其设置为输入或输出,用于连接按键和LED。中断模块可以检测到按键的状态变化并触发相应的中断函数,实现按键的响应。

以下是一个使用STM32实现按键控制LED的示例代码:

首先,需要包含相应的头文件和定义一些宏:

#include "stm32f10x.h"

// 定义LED和按键的GPIO端口和引脚
#define LED_GPIO_PORT    GPIOA
#define LED_GPIO_PIN     GPIO_Pin_0
#define KEY_GPIO_PORT    GPIOB
#define KEY_GPIO_PIN     GPIO_Pin_10

// 定义按键触发的中断号
#define KEY_EXTI_LINE    EXTI_Line10
#define KEY_EXTI_PORT_SOURCE    GPIO_PortSourceGPIOB
#define KEY_EXTI_PIN_SOURCE     GPIO_PinSource10
#define KEY_EXTI_IRQn    EXTI15_10_IRQn

// 函数原型声明
void LED_Init(void);
void KEY_Init(void);
void EXTI_Config(void);
void NVIC_Config(void);
void Delay(uint32_t nCount);

// 主函数
int main(void)
{
    // 初始化LED和按键
    LED_Init();
    KEY_Init();
    
    // 配置外部中断
    EXTI_Config();
    
    // 配置中断向量表
    NVIC_Config();
    
    // 主循环
    while (1)
    {
    }
}

// 初始化LED
void LED_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    
    // 使能LED的GPIO时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    // 配置GPIO为推挽输出模式
    GPIO_InitStruct.GPIO_Pin = LED_GPIO_PIN;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct);
    
    // 关闭LED
    GPIO_SetBits(LED_GPIO_PORT, LED_GPIO_PIN);
}

// 初始化按键
void KEY_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    
    // 使能按键的GPIO时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    
    // 配置GPIO为上拉输入模式
    GPIO_InitStruct.GPIO_Pin = KEY_GPIO_PIN;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(KEY_GPIO_PORT, &GPIO_InitStruct);
}

// 配置外部中断
void EXTI_Config(void)
{
    GPIO_EXTILineConfig(KEY_EXTI_PORT_SOURCE, KEY_EXTI_PIN_SOURCE);
    
    EXTI_InitTypeDef EXTI_InitStruct;
    EXTI_InitStruct.EXTI_Line = KEY_EXTI_LINE;
    EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_InitStruct.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStruct);
}

// 配置中断向量表
void NVIC_Config(void)
{
    NVIC_InitTypeDef NVIC_InitStruct;
    NVIC_InitStruct.NVIC_IRQChannel = KEY_EXTI_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x0F;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x0F;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStruct);
}

// 延时函数
void Delay(uint32_t nCount)
{
    for (; nCount != 0; nCount--);
}

// 按键中断处理函数
void EXTI15_10_IRQHandler(void)
{
    // 确定是KEY_EXTI_LINE触发的中断
    if (EXTI_GetITStatus(KEY_EXTI_LINE) != RESET)
    {
        // 延时消除抖动
        Delay(100000);
        
        // 检测按键状态
        if (GPIO_ReadInputDataBit(KEY_GPIO_PORT, KEY_GPIO_PIN) == 0)
        {
            // 按下按键,点亮LED
            GPIO_ResetBits(LED_GPIO_PORT, LED_GPIO_PIN);
        }
        else
        {
            // 松开按键,熄灭LED
            GPIO_SetBits(LED_GPIO_PORT, LED_GPIO_PIN);
        }
        
        // 清除中断标志
        EXTI_ClearITPendingBit(KEY_EXTI_LINE);
    }
}

以上代码中,通过定义宏来指定LED和按键的GPIO端口和引脚。LED_Init函数用于初始化LED,通过配置GPIO为推挽输出模式并将GPIO引脚拉高来关闭LED。KEY_Init函数用于初始化按键,通过配置GPIO为上拉输入模式来使能内部上拉电阻。EXTI_Config函数用于配置外部中断,将按键引脚连接到外部中断线上,并设置中断触发方式为下降沿触发。NVIC_Config函数用于配置中断向量表,设置中断优先级和使能中断。Delay函数用于延时。EXTI15_10_IRQHandler函数是按键的中断处理函数,当按键引脚触发中断时,根据按键的状态来点亮或熄灭LED,并清除中断标志。

在主函数中,首先初始化LED和按键,然后配置外部中断和中断向量表,最后进入主循环。

编译并下载程序到STM32开发板后,按下按键,LED就会点亮;松开按键,LED会熄灭。

这样,就实现了按键控制LED的功能。可以根据实际需求修改代码,例如添加更多的按键和LED,并对按键触发的中断进行其他处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值