stm32按键反转led的亮灭

本文介绍了一个基于STM32微控制器的简单实验,通过按键来控制LED灯的状态。使用了stm32f10x系列的GPIO接口,并定义了相应的配置宏。实现了按键检测功能并能够根据按键操作切换LED的状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个小实验主要还是利用到GPIO:

下面这个bsp_led.h文件使用寄存器版本写的

#ifndef __LED_H
#define __LED_H
#include"stm32f10x.h"
//定义端口,时钟,引脚
#define red_PORT  GPIOB
#define red_PIN   GPIO_Pin_5
#define red_LCK   RCC_APB2Periph_GPIOB

#define green_PORT  GPIOB
#define green_PIN   GPIO_Pin_0
#define green_LCK   RCC_APB2Periph_GPIOB

#define blue_PORT  GPIOB
#define blue_PIN   GPIO_Pin_1
#define blue_LCK   RCC_APB2Periph_GPIOB

#define ON 0
#define OFF 1
            
#define    digitalHi(p,i)         {p->BSRR=i;}     //引脚输出高电平       
#define digitalLo(p,i)         {p->BRR=i;}     //引脚输出低电平
#define digitalToggle(p,i) {p->ODR ^=i;} //反转

#define red_TOGGLE         digitalToggle(red_PORT,red_PIN)
#define red_OFF           digitalHi(red_PORT,red_PIN)
#define red_ON               digitalLo(red_PORT,red_PIN)

#define green_TOGGLE         digitalToggle(green_PORT,green_PIN)
#define green_OFF           digitalHi(green_PORT,green_PIN)
#define green_ON               digitalLo(green_PORT,green_PIN)

#define blue_TOGGLE         digitalToggle(blue_PORT,blue_PIN)
#define blue_OFF           digitalHi(blue_PORT,blue_PIN)
#define blue_ON               digitalLo(blue_PORT,blue_PIN)

void LED_GPIO_Config(void);
                
#endif
                

下面是bsp_key.h文件:
#ifndef __KEY_H
#define __KEY_H
#include"stm32f10x.h"

#define key_1_PORT  GPIOA
#define key_1_PIN   GPIO_Pin_0
#define key_1_CLK   RCC_APB2Periph_GPIOA

#define key_2_PORT  GPIOC
#define key_2_PIN   GPIO_Pin_13
#define key_2_CLK   RCC_APB2Periph_GPIOC

#define KEY_ON      1
#define KEY_OFF     0

void Key_GPIO_Config(void);
uint8_t KEY_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);

#endif

下面是bsp_key.c文件:

#include"bsp_key.h"
void Key_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(key_1_CLK|key_2_CLK,ENABLE);
    GPIO_InitStructure.GPIO_Pin=key_1_PIN;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
    GPIO_Init(key_1_PORT,&GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin=key_2_PIN;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
    GPIO_Init(key_2_PORT,&GPIO_InitStructure);
}
uint8_t KEY_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
{
        if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON )  //检测按键是否按下
    {     
        while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON);   //直到按键被释放
        return     KEY_ON;     //才返回一个KEY_ON
    }
    else
        return KEY_OFF;
}

下面是main.c文件

#include"stm32f10x.h"
#include"bsp_led.h"
#include"bsp_key.h"
int main(void)
{
    LED_GPIO_Config();
    red_ON;
    Key_GPIO_Config();
    while(1)
    {
        if(KEY_Scan(key_1_PORT,key_1_PIN) == KEY_ON  )//
        {
            red_TOGGLE;
            //red(OFF);
        } 

        if( KEY_Scan(key_2_PORT,key_2_PIN) == KEY_ON  )
        {
            green_TOGGLE;
            //green(ON);
        }    
    }
}

以上就是一个简单的通过按键反转LED的亮灭的代码文件,如有不妥,望请指正。

转载于:https://www.cnblogs.com/lzd626/p/9203498.html

### 实现 STM32 按键外部中断控制 LED 以下是基于 HAL 库实现的 STM32 外部中断控制 LED 状态反转的示例代码。此代码利用了 GPIO 中断功能来检测按键的状态变化,并通过触发中断服务程序 (ISR) 来切换 LED 的状态。 #### 初始化配置 在主函数 `main.c` 文件中完成必要的初始化操作,包括时钟配置、GPIO 配置以及 NVIC 和 EXTI 的设置。 ```c #include "stm32f1xx_hal.h" // 定义 LED按键对应的 GPIO 引脚 #define LED_PIN GPIO_PIN_5 #define KEY_PIN GPIO_PIN_0 #define LED_PORT GPIOA #define KEY_PORT GPIOA void SystemClock_Config(void); static void MX_GPIO_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); while (1) { // 主循环无需处理逻辑,由中断驱动 } } /** * @brief GPIO 初始化函数 */ static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); // 启用 GPIOA 时钟 // 配置 LED 输出模式 GPIO_InitStruct.Pin = LED_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct); // 配置按键为输入模式并启用上拉电阻 GPIO_InitStruct.Pin = KEY_PIN; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; // 下降沿触发中断 GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(KEY_PORT, &GPIO_InitStruct); // 配置 NVIC 中断优先级 HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); // 设置 EXTI0 中断优先级 HAL_NVIC_EnableIRQ(EXTI0_IRQn); // 开启 EXTI0 中断 } ``` --- #### 中断服务程序 (ISR) 定义用于响应按键中断的服务程序,在其中实现 LED 状态的翻转。 ```c /** * @brief EXTI0 中断服务程序 */ void EXTI0_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(KEY_PIN); // 调用 HAL 层通用中断处理函数 } /** * @brief HAL 层回调函数 */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin == KEY_PIN) { static uint8_t ledState = 0; if (!ledState) // 如果当前 LED 是关闭状态,则打开它 HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_SET); else // 如果当前 LED 是开启状态,则关闭它 HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_RESET); ledState ^= 1; // 切换状态变量 } } ``` --- #### 关键点说明 1. **按键配置** 使用 `GPIO_MODE_IT_FALLING` 将按键配置为下降沿触发中断[^2]。这样可以确保每次按下按键都会触发一次中断。 2. **LED 控制** 在 ISR 函数中调用了 `HAL_GPIO_WritePin()` 方法来改变指定 GPIO 引脚的状态,从而实现 LED 的点或熄[^4]。 3. **NVIC 配置** 借助 `HAL_NVIC_SetPriority()` 和 `HAL_NVIC_EnableIRQ()` 对应的 API 来使能特定线号上的外部中断请求[^5]。 4. **去抖动机制** 上述代码依赖硬件自带的上拉/下拉电阻特性配合软件延时等方式间接实现了简单的防抖效果。如果需要更精确的时间管理可引入定时器资源辅助判断实际信号稳定性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值