STM32F407ZG GPIO输入相关实验

本文详细介绍了如何在STM32F407ZG开发板上使用GPIO进行按键输入,并通过延时消除抖动,实现LED灯的切换控制。通过实例讲解了按键初始化、值获取以及main函数的编程逻辑。

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

GPIO输入

此介绍在上一篇文章已有总结。

按键输入控制LED实验

按键原理图

KEY的I/O引脚如下:
WK_UP接在PA0,KEY0接在PE4,KEY1接在PE3,KEY2接在PE2。
在这里插入图片描述

IO引脚

电路原理图如下:
KEY原理图
则可以看出,WK_UP是高电平有效,其他则是低电平有效。
在初始化中,WK_UP的引脚则要配置成下拉,其他配置成上拉。
具体如下:

void key_init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    
    //使能GPIOA和GPIOE时钟
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOE, ENABLE); 
    
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //选择输入模式
    //GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //输出类型不用配置
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4; //按键KEY0~2的三个引脚
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MHz,这个不配置也行
    GPIO_Init(GPIOE, &GPIO_InitStructure); //初始化GPIOE
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //按键KEY_UP的引脚
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; //下拉
    GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA
}

获取按键值

没什么好说的,应用了GPIO_ReadInputDataBit(GPIOx, GPIO_Pin_x); 这个函数。
作用是返回选中的引脚的输入值,值为0或1。
由于按键按下会产生电压的抖动,因此这里利用延时函数延时10ms以消除抖动。
而两次延时夹着一个while循环的作用是只有当按下按键并松开后,此次按键才被视为操作成功,若一直不松手,这次按键将没有效果。

/*************************************
      *函数名:key_get
      *函数功能描述:获取按键
      *函数参数:无
      *函数返回值:按下的按键:
                  0 没有按下
                  1 KEY0
                  2 KEY1
                  3 KEY2
                  4 KEY_WKUP
      ***************************************/
u8 KEY_get(void)
{
    uint8_t keyNum = 0;
    
    //PE4即KEY0
    if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4) == 0)
    {
        delay_ms(10); //消抖
        while(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4) == 0);
        delay_ms(10);
        keyNum = 1;
    }
    //PE3即KEY1
    if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_3) == 0)
    {
        delay_ms(10); //消抖
        while(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_3) == 0);
        delay_ms(10);
        keyNum = 2;
    }
    //PE2即KEY2
    if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_2) == 0)
    {
        delay_ms(10); //消抖
        while(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_2) == 0);
        delay_ms(10);
        keyNum = 3;
    }
    //PA0即KEY_WKUP,且高电平有效
    if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 1)
    {
        delay_ms(10); //消抖
        while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 1);
        delay_ms(10);
        keyNum = 4;
    }
    
    return keyNum;
}

main函数

get_LED0以及get_LED1是返回了LED0和LED1两个引脚输出的值,使用GPIO_ReadOutputDataBit(GPIOx, GPIO_Pin_x); 函数,从而做到用一个按键转换一个灯的亮灭状态。

while(1)
    {
        u8 keyNum = KEY_get();
        
        //KEY0控制LED0
        if(keyNum == 1)
        {
            if(get_LED0() == 1)
            {
                LED0_ON();
            }
            else{
                LED0_OFF();
            }
        }
        //KEY1控制LED1
        if(keyNum == 2)
        {
            if(get_LED1() == 1)
            {
                LED1_ON();
            }
            else{
                LED1_OFF();
            }
        }
        //KEY2使LED全灭
        if(keyNum == 3)
        {
            
            LED0_OFF();
            LED1_OFF();
        }
        //KEY_WKUP使LED全亮
        if(keyNum == 4)
        {
            
            LED0_ON();
            LED1_ON();
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值