当前位置: 首页 > news >正文

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

相关文章:

  • C# XPath的概念
  • redhat9安装卸载mysql
  • 个人博客系统(前后端分离)
  • 商品分类管理系统实现(Vue + ElementUI)
  • ReactJS入门之Model层
  • 一文解析Linux中断子系统softirq和tasklet
  • Arduino与Proteus仿真实例-雷达扫描仿真
  • Redis高可用之集群架构(第三部分)
  • 京东零售大数据云原生架构实践
  • 铝合金表面处理废水除铝工艺
  • Ansible剧本使用
  • 【JavaScript】基于SPA的单页面路由
  • Java基础:Lambda表达式方法引用
  • 嵌入式:ARM常用开发编译软件介绍
  • (三)HTTPTomcatServlet
  • MySQL主从搭建
  • 20221226编译Toybrick的TB-RK3588X开发板的Android12系统3
  • 并查集解决重复员工问题
  • 详细介绍关于自定义类型:结构体、枚举、联合【c语言】
  • 【swaggo】swaggo使用详解
  • A股三大股指收跌:地产股领跌,银行股再度走强
  • 纪录电影《中国有戏:天幕计划》启动,有望太空播放
  • 点燃“文化活火”,上海百年街区创新讲述“文化三地”故事
  • 国家统计局:一季度规模以上工业企业利润延续持续恢复态势
  • 可实时追踪血液中单个细胞的穿戴医疗设备问世
  • 摩根士丹利基金雷志勇:AI带来的产业演进仍在继续,看好三大景气领域