首页 > 其他分享 >09. 按键输入

09. 按键输入

时间:2023-07-31 19:33:27浏览次数:39  
标签:HAL PIN 09 消抖 按下 按键 GPIO 输入

一、按键简介

  按键是一种电子开关,使用时轻轻按开关按钮就可使开关接通,当松开手时,开关断开。

  常态下,独立按键是断开的,按下的时候才闭合。每个独立按键会单独占用一个 IO口,通过 IO口 的高低电平判断按键的状态。但是按键在闭合和断开的时候,都存在抖动现象,即按键在闭合时不会马上就稳定的连接,断开时也不会马上断开。这是机械触点,无法避免。

  按下抖动和释放抖动的时间一般为 5~10ms,如果在抖动阶段采样,其不稳定状态可能出现一次按键动作被认为是多次按下的情况。为了避免抖动可能带来的误操作,我们要做的措施就是给按键消抖(即采样稳定闭合阶段)。消抖方法分为硬件消抖和软件消抖,我们常用软件的方法消抖。

  软件消抖:最简单的 延时消抖。检测到按键按下后,一般进行 10ms 延时,用于跳过抖动的时间段,如果消抖效果不好可以调整这个 10ms 延时,因为不同类型的按键抖动时间可能有偏差。待延时过后再检测按键状态,如果没有按下,那我们就判断这是抖动或者干扰造成的;如果还是按下,那么我们就认为这是按键真的按下了。对按键释放的判断同理。

  硬件消抖:利用 RC电路电容充放电特性 来对抖动产生的电压毛刺进行平滑出来,从而实现消抖,但是成本会更高一点。

二、原理图

img

img

img

三、程序设计

  按键初始化程序:

void Key_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
  
    __HAL_RCC_GPIOE_CLK_ENABLE();                   // 使能GPIOE的时钟

    GPIO_InitStruct.Pin = GPIO_PIN_2;               // 选择GPIOE的引脚
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;         // 设置为输入模式
    GPIO_InitStruct.Pull = GPIO_PULLUP;             // 使用上拉
    HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);         // GPIO初始化函数
}

如果要使用 KEY_UP,则需要将 GPIO 的模式设置 下拉输入(GPIO_PULLDOWN);

如果使用 K1、K2 和 K3,则需要将 GPIO 的模式设置为 上拉输入(GPIO_PULLUP);

  按键扫描函数:

uint8_t Key_Scanner()
{
    if (HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2) == GPIO_PIN_RESET)               // 读取按键接口的电平
    {  
        HAL_Delay(10);                                                      // 延迟消抖
        if (HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2) == GPIO_PIN_RESET)           // 再次读取按键接口的电平
        {  
            while(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2) == GPIO_PIN_RESET);    // 等待按键释放
            return 1;                                                       // 返回1代表按键按下
        }
    }
    return 0;                                                               // 返回0代表按键没有按下
}

如果要使用 KEY_UP,需要将 KEY_UP 所连接的引脚读取的电平与 GPIO_PIN_SET(高电平)作比较;

如果使用 K1、K2 和 K3,则需要将 K1、K2 和 K3 所连接的引脚读取的电平与 GPIO_PIN_RESET(低电平)作比较;

  LED 初始化函数 请在 点亮 LED 篇章查看;

  main() 函数:

int main(void)
{
  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

  /* Initialize all configured peripherals */
  Key_Init();
  
  while (1)
  {
    if(Key_Scanner() == 1)
    {
      HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);
    }
  }
}

标签:HAL,PIN,09,消抖,按下,按键,GPIO,输入
From: https://www.cnblogs.com/kurome/p/17594297.html

相关文章

  • 通过注册表方式启动和关闭手写输入法(方法适合各种应用)
    求:window系统下,点击输入窗口时,需要自动弹出手写输入法。点击除输入窗口外位置时,需要关闭手写输入法。实现:一、安装手写输入法插件(我选用的是搜狗输入法)这是个什么协议呢,从来没有见过啊,也只是一个a标签就可以调用起来。于是我们需要深入探讨下a标签的协议。a标签协议解读平时在......
  • 2009NOIP普及组 题解
    第一题第二题\(一二题太简单就不在此处提了\)\(直接看到\)第三题细胞分裂题目大意\(有m1^{m2}个试管和n种细胞,第i种细胞初始有1个,每过1秒每一个会分裂成a_i个\)\(当有某种细胞可以平均分到试管中时开始实验,求开始实验的\)时间\((顺便说一下,我一开始没看到是时间,以为是求哪......
  • BOSHIDA 关于DC电源模块输入电压范围的问题
    BOSHIDA关于DC电源模块输入电压范围的问题DC电源模块是一种将交流电转换为直流电的设备,它非常常见且广泛应用于电子设备、通讯设备、工业自动化等领域。而其输入电压范围也是我们在使用和选购DC电源模块时需要特别关注的一个参数。首先,我们需要了解DC电源模块的输入电压是指模......
  • python win后台按键
    Python后台按键在开发应用程序时,有时我们需要在后台模拟按键操作。Python提供了一些库和方法来实现这个功能。本文将介绍如何在Windows操作系统上使用Python在后台模拟按键操作。安装依赖库在开始之前,我们需要安装一个名为pyautogui的Python库。它是一个跨平台的库,用于控制鼠标......
  • UE源码分析:Slate 类鼠标输入处理
    序言UE4.25版本本章看一下UE的“类鼠标”输入处理(其实就是鼠标和触摸的输入,我也没找到专门的术语来代指,英文UE用的是PointerXXX),主要是按下、移动、抬起等相关的的处理。输入处理大致的代码流&堆栈FWindowsApplication是平台层的,处理Windows事件FSlateApplication是引......
  • 6.4 多输入多输出通道
    1.多输入通道    2.多输入多输出通道 用ci和co分别表示输入和输出通道的数量,用kh和kw表示卷积核的尺寸,那么,对ci个输入通道,每一个通道都需要一个卷积核(识别并组合输入中的模式),于是,要输出一个通道,所需的卷积核尺寸就是ci*kh*kw的,那么要输出co个通道(识别输入中的co个特定......
  • M5ATOMS3基础01按键
    init+input+outputLinux环境ArduinoIDE中配置ATOMS3示例官方示例代码:/*********************************************************************************Copyright(c)2022byM5Stack*EquippedwithM5AtomS3samplesourcecode*......
  • 09-索引和视图
    09-索引和视图课程目标掌握索引原理、索引的应用、视图的概念、创建视图、修改视图、删除视图。9.1索引原理索引被用来快速找出在一个列上某一特定值的行。没有索引,MySQL不得不首先以第一条记录开始,然后读完整个表直到它找出相关的行。表越大,花费时间越多。对于一个有序字段,可以......
  • 【ACM专项练习#01】基本输入输出,如何加减
    关于ACM,牛客其实也有专门的模拟练习:https://ac.nowcoder.com/acm/contest/5657#question做这个也可以关于while(cin>>n)在处理输入时,cin>>n;while(n--)和while(cin>>n)是两种常见方法这里说一下区别cin>>n;while(n--)当你预先知道迭代次数,并希望根据该次数执......
  • 【ACM专项练习#02】整行字符串、输入vector、打印图形、处理n组数据以及链表操作等
    输入整行字符串平均绩点题目描述每门课的成绩分为A、B、C、D、F五个等级,为了计算平均绩点,规定A、B、C、D、F分别代表4分、3分、2分、1分、0分。输入有多组测试样例。每组输入数据占一行,由一个或多个大写字母组成,字母之间由空格分隔。输出每组输出结果占一行。如果输入的大......