STM32按键控制LED灯

因为是按键输入,所以创立两个文件 bsp_key.c和bsp_key.h文件。

一、bsp_key.c中需要对按键进行初始化,这个和LED的类似,GPIOA-G均是挂在APB2上的。
1、时钟:故时钟均为RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)。不同的是,KEY1是在GPIOA,KEY2是在GPIOC。故时钟分别为RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK,ENABLE);和RCC_APB2PeriphClockCmd(KEY2_GPIO_CLK,ENABLE);
KEY1_GPIO_CLK和KEY2_GPIO_CLK需要在头文件里定义。

2、模式:GPIO_Mode_IN_FLOATING; //浮动输入

3、按键检测函数:uint8_t    key_scan(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);需要有两个参数,和LED一样,1个是确定GPIO,1个是哪个位(GPIO_Pin控制的是BSRR和BRR寄存器)

二、bsp_key.h文件对按键1和2进行宏定义,以及按键初始化函数和按键检测函数的声明。这里面宏定义的KEY_ON和KEY_OFF是为了方便判断按键是否按下
因为GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)的返回值是0和1,宏定义是为了更加直观的判断按键是否按下,故才宏定义1和0

三、在bsp_led.h中
#define LED1_TOGGLE        {LED1_GPIO_PORT->ODR ^=LED1_GPIO_PIN;} //绿灯状态翻转
#define LED3_TOGGLE        {LED3_GPIO_PORT->ODR ^=LED3_GPIO_PIN;} //红灯状态翻转

四、在main.c中
int main(void)
{
    LED_GPIO_Config();
    KEY_GPIO_Config();
    while(1)
    {
        if(key_scan(GPIOA,KEY1_GPIO_PIN)==KEY_ON)
            LED1_TOGGLE;
        
        if(key_scan(GPIOC,KEY2_GPIO_PIN)==KEY_ON)
            LED3_TOGGLE;    
        
    }
}

代码如下

main.c

//bsp_key.c

//bsp_key.h

bsp_led.c

bsp_led.h 

来源:#Sunshine boy

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年2月27日
下一篇 2022年2月27日

相关推荐