按键外部中断

 driver_key.h

#ifndef __DRIVER_KEY_H
#define __DRIVER_KEY_H

#include "stm32f1xx_hal.h"

/*
    按键状态宏定义
*/
#define KEY_PRESSED            (0)
#define KEY_RELEASED        (1)

/*********************
 * 引脚宏定义
**********************/
#define KEY1_PIN                GPIO_PIN_14
#define KEY2_PIN                GPIO_PIN_15

#define KEY1_PORT                GPIOE
#define KEY2_PORT                GPIOE

/*********************
 * 函数宏定义
**********************/
#define KEY1_GPIO_CLK_EN()    __HAL_RCC_GPIOE_CLK_ENABLE()
#define KEY2_GPIO_CLK_EN()    __HAL_RCC_GPIOE_CLK_ENABLE()

#define K1                            HAL_GPIO_ReadPin(KEY1_PORT, KEY1_PIN)
#define K2                            HAL_GPIO_ReadPin(KEY2_PORT, KEY2_PIN)

/*
 *  函数名:KEY_GPIO_ReInit
 *  功能描述:按键的GPIO重新初始化为双边沿触发外部中断
 *  输入参数:无
 *  输出参数:无
 *  返回值:无
*/
extern void KEY_GPIO_ReInit(void);

/*
 *  函数名:KEY1_Value
 *  功能描述:返回按键KEY1的键值
 *  输入参数:无
 *  输出参数:无
 *  返回值:返回按键KEY1的键值
*/
extern uint8_t KEY1_Value(void);

/*
 *  函数名:KEY2_Value
 *  功能描述:返回按键KEY2的键值
 *  输入参数:无
 *  输出参数:无
 *  返回值:返回按键KEY2的键值
*/
extern uint8_t KEY2_Value(void);

#endif /* __DRIVER_KEY_H */



driver_key.c

#include "driver_key.h"

static volatile uint8_t key1_val = KEY_RELEASED;     // 按键KEY1的键值,按下为0松开为1
static volatile uint8_t key2_val = KEY_RELEASED;     // 按键KEY2的键值,按下为0松开为1

/*
 *  函数名:KEY_GPIO_ReInit
 *  功能描述:按键的GPIO重新初始化为双边沿触发外部中断
 *  输入参数:无
 *  输出参数:无
 *  返回值:无
*/
void KEY_GPIO_ReInit(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    
    KEY1_GPIO_CLK_EN();
    KEY2_GPIO_CLK_EN();
    
    GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;     // 双边沿触发中断
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    
    GPIO_InitStruct.Pin = KEY1_PIN;
    HAL_GPIO_Init(KEY1_PORT, &GPIO_InitStruct);
    
    GPIO_InitStruct.Pin = KEY2_PIN;
    HAL_GPIO_Init(KEY1_PORT, &GPIO_InitStruct);
    
    
    HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 2);
    HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
}

/*
 *  函数名:EXTI15_10_IRQHandler
 *  功能描述:外部中断线10~15的中断服务函数
 *  输入参数:无
 *  输出参数:无
 *  返回值:无
*/
void EXTI15_10_IRQHandler(void)
{
    HAL_GPIO_EXTI_IRQHandler(KEY1_PIN); // 使用HAL库的外部中断统一服务函数,参数是外部中断线
    HAL_GPIO_EXTI_IRQHandler(KEY2_PIN);
}

/*
 *  函数名:HAL_GPIO_EXTI_Callback
 *  功能描述:外部中断回调函数
 *  输入参数:GPIO_Pin --> 产生外部中断的引脚
 *  输出参数:无
 *  返回值:无
*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if(KEY1_PIN == GPIO_Pin)    // 判断进来的外部中断线连接的引脚是不是按键的引脚
    {
        key1_val = K1;  // 读取按键连接的引脚的状态
    }
    else if(KEY2_PIN == GPIO_Pin)
    {
        key2_val = K2;
    }
}

/*
 *  函数名:KEY1_Value
 *  功能描述:返回按键KEY1的键值
 *  输入参数:无
 *  输出参数:无
 *  返回值:返回按键KEY1的键值
*/
uint8_t KEY1_Value(void)
{
    return key1_val;
}

/*
 *  函数名:KEY2_Value
 *  功能描述:返回按键KEY2的键值
 *  输入参数:无
 *  输出参数:无
 *  返回值:返回按键KEY2的键值
*/
uint8_t KEY2_Value(void)
{
    return key2_val;
}



KEY_GPIO_ReInit();

mian.c

if(KEY1_Value() == KEY_PRESSED)
        {
            printf("Key 1 is pressed!\r\n");
        }
        
        if(KEY2_Value() == KEY_PRESSED)
        {
            printf("Key 2 is pressed!\r\n");
        }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值