GPIO按键输入

GPIO输入_按键检测

按键电路图

在这里插入图片描述

C6 C14电容的作用是用来消抖的:

  • 电容按键消抖是通过利用电容器的充放电特性来实现的。在电容按键中,通常使用一个电容器和一个触点组成。当按键按下时,电容器开始充电;松开按键时,电容器开始放电。这个充放电过程的时间会被用来判断按键是否被有效按下。

  • 按下按键时,电容器开始充电,电容器上的电压会逐渐增加。当释放按键后,电容器开始放电,电压逐渐下降。在这个过程中,通过测量电容器上的电压变化,可以检测按键的状态。

  • 为了消除按键的抖动,即按键在接通或断开时可能会出现短暂的不稳定状态,通常会使用软件或硬件的方法来处理。通过设定一个时间阈值,只有在电容器充放电过程超过这个时间后,才认定按键状态的改变是有效的,从而实现消抖的效果。

  • 因此,电容按键消抖的原理在于利用电容器充放电的时间特性,并结合阈值判断来识别有效的按键操作,从而避免因按键抖动导致的错误触发或信号不稳定的情况。

代码

bsp_key.h文件

#include "bsp_key.h"

void Key_GPIO_Config()
{
  GPIO_InitTypeDef GPIO_InitStructure;
    //打开RCC时钟
  RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK|KEY2_GPIO_CLK,ENABLE);
    //配置好端口
  GPIO_InitStructure.GPIO_Pin=KEY1_GPIO_PIN;
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
  GPIO_Init(KEY1_GPIO_PORT,&GPIO_InitStructure);
  GPIO_InitStructure.GPIO_Pin=KEY2_GPIO_PIN;
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
  GPIO_Init(KEY2_GPIO_PORT,&GPIO_InitStructure);
  
}

uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
{
  if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==KEY_ON)
  {
    while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==KEY_ON);//按键按下时候程序停在这个地方
      return KEY_ON;//松手后再运行
  }
  else
    return KEY_OFF;
}

GPIO_ReadInputDataBit()函数

/**
  * @brief  Reads the specified input port pin.
  * @param  GPIOx: where x can be (A..G) to select the GPIO peripheral.
  * @param  GPIO_Pin:  specifies the port bit to read.
  *   This parameter can be GPIO_Pin_x where x can be (0..15).
  * @retval The input port pin value.
  */
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
  uint8_t bitstatus = 0x00;
  
  /* Check the parameters */
  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  assert_param(IS_GET_GPIO_PIN(GPIO_Pin)); 
  
  if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)Bit_RESET)
  {
    bitstatus = (uint8_t)Bit_SET;
  }
  else
  {
    bitstatus = (uint8_t)Bit_RESET;
  }
  return bitstatus;
}
GPIO_Mode_IN_FLOATING(浮空输入)

浮空输入通常用于连接到外部电路中的信号线或传感器输出,这些信号线可能会在不同的状态之间切换,而不是明确地保持在高电平或低电平。在这种情况下,使用浮空输入模式可以灵活地读取这些信号状态,而不会对信号线造成干扰或改变其状态。

BitAcation

通过枚举的形式对reset 和 set 分别控制0和1

typedef enum
{ Bit_RESET = 0,
  Bit_SET
}BitAction;
assert_param()
  • 这个特定的宏定义 assert_param(expr) ((void)0) 看起来是用于关闭或者禁用断言功能。在一些情况下,为了提高程序的性能或者在生产环境中不需要断言检查的情况下,可以通过类似的宏定义来消除断言的影响。
  • 这个宏定义实际上是将 assert_param(expr) 替换为 ((void)0),也就是说,无论传入的表达式 expr 是什么,都会被简单地替换为一个空操作 (void)0,不做任何实际的断言检查。

main.c文件

#include "stm32f10x.h"   // 相当于51单片机中的  #include <reg51.h>
#include "bsp_led.h"
#include "bsp_key.h"
int main(void)
{
  
	LED_GPIO_Config();
  LED1_ON;
  Key_GPIO_Config();
  
  while(1)
  { 
    if(Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN)==KEY_ON)
    {
      LED1_TOGGLE;
    }
    
    if(Key_Scan(KEY2_GPIO_PORT,KEY2_GPIO_PIN)==KEY_ON)
    {
      LED2_TOGGLE;
    }
  }
}

  • 16
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值