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;
}
}
}