stm32的学习之旅2-按键检测

本文详细介绍了如何在STM32F103VET6芯片上使用库函数进行LED灯的点亮和按键检测。通过硬件消抖电路简化了软件处理,只需直接检测GPIO电平即可判断按键状态。在初始化配置和按键扫描函数中,实现了按键的松手检测和LED灯的反转功能。示例代码展示了具体实现过程。
摘要由CSDN通过智能技术生成
  • 本文使用的芯片是STM32f103VET6
序号SDK版本内容链接
1库函数点亮led点我点我
2库函数按键检测点我点我

1 原理图

  按键机械触点断开、闭合时,由于触点的弹性作用,按键开关不会马上稳定接通或一下子断开,使用按键时会产生图 1 中的带波纹信号,需要用软件消抖处理滤波,不方便输入检测。本文使用的开发板连接的按键带硬件消抖功能,见图 2,它利用电容充放电的延时,消除了波纹,从而简化软件的处理,软件只需要直接检测引脚的电平即可。



在这里插入图片描述


图1:按键抖动说明图

在这里插入图片描述

图2:按键原理图

2 引脚宏定义

#define  KEY_ON      1
#define  KEY_OFF     0

#define KEY1_GPIO_PIN              GPIO_Pin_0
#define KEY1_GPIO_PORT             GPIOA
#define KEY1_GPIO_CLK              RCC_APB2Periph_GPIOA

3 初始化配置

void KEY_GPIO_Config(void)
{
	GPIO_InitTypeDef  GPIO_InitStruct;
	
	RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK, ENABLE);
	
	GPIO_InitStruct.GPIO_Pin = KEY1_GPIO_PIN;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	
	GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStruct);	
}

4 按键扫描

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

5 检测按键

  初始化 LED 灯及按键后,在 while 函数里不断调用 Key_Scan 函数,并判断其返回值,若返回值表示按键按下,则反转 LED 灯的状态。

#include "stm32f10x.h"  
#include "bsp_led.h"
#include "bsp_key.h"

void Delay( uint32_t count )
{
	for(; count!=0; count--);
}

int main(void)
{
	// 来到这里的时候,系统的时钟已经被配置成72M。
	LED_GPIO_Config();
	KEY_GPIO_Config();
	
	while(1)
	{
		if( Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN) ==KEY_ON )
			LED_G_TOGGLE;
		
		// if
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值