三、GPIO按键读取

在上一篇文章中,我们详细讲解了GPIO的写函数。万事万物都具有一定的相对性,GPIO的操作也不例外。既然有写操作,那么必然也有读操作。有了上一篇文章的基础,理解本篇内容将会更加容易。

一、这篇文章能了解什么

本篇文章将基于上一篇的内容,进一步探讨如何实现对LED灯的控制。

阅读完本篇文章后,您将了解到以下内容:

1.GPIO输入的初始化

2.GPIO读操作的实现

3.按键消抖

4.使用按键控制LED灯的实现方法

通过对这些知识的掌握,您将能够更全面地理解和运用GPIO操作,实现更复杂的功能。

1.1 GPIO输入的初始化

首先,我们需要初始化用于按键的GPIO引脚。以下是一个示例代码,展示了如何初始化GPIO引脚以读取按键输入。

cpp 复制代码
void KEY_Init(){
    GPIO_InitTypeDef  GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   //启动GPIO的时钟线,让时钟进去以驱动其GPIO
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//设不设置都可以
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

在上述代码中,我们首先启动了GPIOA的时钟,然后配置了GPIO引脚2为上拉输入模式。

1.2 GPIO读操作的实现

接下来,我们需要实现GPIO读操作,以检测按键的状态。通过读取GPIO引脚的电平,可以判断按键是否被按下。

cpp 复制代码
uint8_t KEY_Read(){
    return GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2);
}

上述函数KEY_Read用于读取GPIOA引脚2的状态。如果返回值为0,则表示按键被按下;如果返回值为1,则表示按键未被按下。

1.3 按键消抖

在实际使用按键时,由于机械抖动的存在,会导致按键在短时间内多次触发。为了解决这个问题,我们需要进行按键消抖处理。以下是一个简单的按键消抖算法示例:

cpp 复制代码
int Key_detection(void){
    int Key_flag;
    if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2)==0) {
        Delay_Ms(20);
        if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2)==0) {
            while(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2));
            Key_flag=1;
        }
    } else Key_flag= 0;
    return Key_flag;
}

按键消抖的代码其实还可以更加精简,小伙伴们有好的方法嘛,可以留言在评论区。

二、代码程序

2.1 main.c(使用按键控制LED灯的实现方法)

cpp 复制代码
int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	SystemCoreClockUpdate();
	Delay_Init();
	USART_Printf_Init(115200);	
	printf("SystemClk:%d\r\n",SystemCoreClock);
	printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );
	printf("This is printf example\r\n");

	LED_Init();
	KEY_Init();
	while(1)
    {
	    if(Key_detection()==1){
	        GPIO_ResetBits(GPIOA, GPIO_Pin_0 |GPIO_Pin_1 );
	    }else{
	        GPIO_SetBits(GPIOA, GPIO_Pin_0 |GPIO_Pin_1 );
	    }

	}
}

2.2 按键原理图

相关推荐
Ronin-Lotus3 小时前
嵌入式硬件与应用篇---寄存器GPIO控制
stm32·单片机·嵌入式硬件·微处理器原理与应用
星辰pid10 小时前
STM32控制四自由度机械臂(SG90舵机)(硬件篇)(简单易复刻)
stm32·单片机·嵌入式硬件·机械臂
威桑11 小时前
STM32 专有名词缩写整合
stm32·单片机·嵌入式硬件
星源~12 小时前
tree 命令集成到 Git Bash:可视化目录结构的指南
git·单片机·物联网·嵌入式·项目开发
SKYDROID云卓小助手13 小时前
无人设备遥控器之自动调整编码技术篇
人工智能·嵌入式硬件·算法·自动化·信号处理
所念皆星海91113 小时前
图灵完备之路(数电学习三分钟)----数据选择器与总线
嵌入式硬件·通信·数电
智者知已应修善业14 小时前
【51单片机节日彩灯控制器设计】2022-6-11
c语言·经验分享·笔记·单片机·嵌入式硬件·51单片机
开-悟15 小时前
嵌入式编程-使用AI查找BUG的启发
c语言·人工智能·嵌入式硬件·bug
许白掰17 小时前
【stm32】HAL库开发——CubeMX配置RTC,单片机工作模式和看门狗
stm32·单片机·嵌入式硬件·学习·实时音视频
DIY机器人工房18 小时前
0.96寸OLED显示屏 江协科技学习笔记(36个知识点)
笔记·科技·stm32·单片机·嵌入式硬件·学习·江协科技