6、GPIO输入按键检测(轮询检测)

目录

0x01、简介

0x02、硬件设计

0x03、编写函数

0x001、按键初始化

 0x002、按键检测

 0x003、按键led翻转

0x04、源程序下载地址


0x01、简介

       本次实验主要实现按键控制LED灯。

       由于机械按键在按下和抬起的时候会产生按键抖动,所以在设计的时候需要考虑如何消除抖

动,达到准确判断按键状态的目的。

       消除抖动有软硬两种方式,硬件方式可利用电容充放电的延时进行消除,软件可以通过程序进

行消除。

硬件消除抖动电路图如下:

在没有被按下的时候,GPIO 引脚的输入状态为低电平(按键所在的电路不通,引脚接地),当按键

按下时,GPIO 引脚的输入状态为高电平(按键所在的电路导通,引脚接到电源)

 由于我手上的开发板不具备硬件去除抖动的功能,所以我们这里主要介绍软件去抖动程序。

0x02、硬件设计

0x03、编写函数

0x001、按键初始化

/**
  *@brief     key初始化
  *@param     无
  *@return    无
  */
void Key_Init(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;             // 设置成上拉输入
    GPIO_Init(GPIOC, &GPIO_InitStructure);
}

 0x002、按键检测

/**
  *@brief     按键扫描
  *@param     mode:0,不支持连续按;1,支持连续按;
  *@return    0,没有任何按键按下;KEY_PRES,按键被按下
  */
uint8_t KEY_Scan(uint8_t mode)
{
    static uint8_t key_up = 1;                                // 按键按松开标志

    if(mode)key_up = 1;                                       // 支持连按

    if(key_up && (KEY == 0))
    {
        Delay_ms(10);//去抖动
        key_up = 0;
        if(KEY == 0)
        {
            return KEY_PRES;
        }
    }
    else if(KEY == 1)
    {
        key_up = 1;
    }
    return 0;                                                // 无按键按下
}

 0x003、按键led翻转

/**
  *@brief     按键led翻转测试
  *@param     无
  *@return    无
  */
void Key_Led(void)
{
    if(KEY_Scan(0) == KEY_PRES) //得到键值
    {
        if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_10) == 1)
        {
            GPIO_ResetBits(GPIOC, GPIO_Pin_10);
        }
        else
        {
            GPIO_SetBits(GPIOC, GPIO_Pin_10);
        }
    }
}

0x04、源程序下载地址

下面上传一个源程序供大家参考:

https://download.csdn.net/download/thebestleo/87351982https://download.csdn.net/download/thebestleo/87351982

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值