STM32-GPIO输入——按键检测

1 软件设计

为了使程序更有条例,方便移植在"工程模板"之上新建"bsp_key.c"及"bsp_key.h"文件,这些文件也可根据您的喜好命名,这 些文件不属于STM32HAL库的内容,是由我们自己根据应用需要编写的

1.1 编程要点

1)使能GPIO端口时钟;

2) 初始化GPIO目标引脚为输入模式(浮空输入);

3.)编写简单测试程序,检测按键的状态,实现按键控制LED灯。

1.2 代码分析

1.2.1 按键引脚宏定义

为了方便移植,我们把按键引脚等资源宏定义到 "bsp_key.h"文件中,以下代码根据按键的硬件连接,把检测按键输入的GPIO端口、GPIO引脚号以及GPIO端口时钟 封装起来了。以下是我的开发板的定义,不同硬件根据自己资源更改。

#ifndef __KEY_H
#define	__KEY_H

#include "stm32f1xx.h"
#include "main.h"
//引脚定义
/*******************************************************/
#define KEY1_PIN                  GPIO_PIN_0                 
#define KEY1_GPIO_PORT            GPIOA                      
#define KEY1_GPIO_CLK_ENABLE()    __HAL_RCC_GPIOA_CLK_ENABLE()

#define KEY2_PIN                  GPIO_PIN_13                 
#define KEY2_GPIO_PORT            GPIOC                      
#define KEY2_GPIO_CLK_ENABLE()     __HAL_RCC_GPIOC_CLK_ENABLE()
/*******************************************************/

 /** 按键按下标置宏
	* 按键按下为高电平,设置 KEY_ON=1, KEY_OFF=0
	* 若按键按下为低电平,把宏设置成KEY_ON=0 ,KEY_OFF=1 即可
	*/
#define KEY_ON	1
#define KEY_OFF	0

void Key_GPIO_Config(void);
uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);

#endif /* __KEY_H */

1.2.2 按键初始化函数

利用上面的宏,编写按键的初始化函数。代码如下:

void Key_GPIO_Config(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;



    /*开启按键GPIO口的时钟*/

    KEY1_GPIO_CLK_ENABLE();

    KEY2_GPIO_CLK_ENABLE();

    /*选择按键的引脚*/	

    GPIO_InitStructure.Pin = KEY1_PIN; 



    /*设置引脚为输入模式*/

    GPIO_InitStructure.Mode = GPIO_MODE_INPUT; 


    /*设置引脚不上拉也不下拉*/

    GPIO_InitStructure.Pull = GPIO_NOPULL;

    /*使用上面的结构体初始化按键*/

    HAL_GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure);

    /*选择按键的引脚*/

    GPIO_InitStructure.Pin = KEY2_PIN; 


    /*使用上面的结构体初始化按键*/

    HAL_GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStructure);

 
}

1.2.3 检测按键的状态

初始化按键后,就可以通过检测对应引脚的电平来判断按键状态,需注意的是我的按键是有硬件消抖的,若你的按键没有的话需要添加软件消抖,简单的软件消抖只需要加延时就可以了,代码如下:

uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)

{			

	/*检测是否有按键按下 */

	if(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == KEY_ON )  

	{	 

		/*等待按键释放 */

		while(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == KEY_ON);   

		return 	KEY_ON;	 

	}

	else

		return KEY_OFF;

}

1.2.4 主函数代码

在主函数进行初始化,然后调用Key_Scan函数,轮询检测按键的状态,按下一次LED灯翻转一次。代码如下:

int main(void)
{
  /* 系统时钟初始化成72MHz */
  SystemClock_Config();
	/* LED 端口初始化 */
	LED_GPIO_Config();	 
    /*初始化按键*/
    Key_GPIO_Config();
	/* 轮询按键状态,若按键按下则反转LED */ 
	while(1)                            
	{	   
		if( Key_Scan(KEY1_GPIO_PORT,KEY1_PIN) == KEY_ON  )
		{
			/*LED1反转*/
			LED1_TOGGLE;
		}   
    
    if( Key_Scan(KEY2_GPIO_PORT,KEY2_PIN) == KEY_ON  )
		{
			/*LED2反转*/
			LED2_TOGGLE;
		}   
	}
}
相关推荐
scan128 分钟前
单片机串口接收状态机STM32
stm32·单片机·串口·51·串口接收
Qingniu011 小时前
【青牛科技】应用方案 | RTC实时时钟芯片D8563和D1302
科技·单片机·嵌入式硬件·实时音视频·安防·工控·储能
Mortal_hhh2 小时前
VScode的C/C++点击转到定义,不是跳转定义而是跳转声明怎么办?(内附详细做法)
ide·vscode·stm32·编辑器
深圳市青牛科技实业有限公司3 小时前
【青牛科技】应用方案|D2587A高压大电流DC-DC
人工智能·科技·单片机·嵌入式硬件·机器人·安防监控
Mr.谢尔比3 小时前
电赛入门之软件stm32keil+cubemx
stm32·单片机·嵌入式硬件·mcu·信息与通信·信号处理
LightningJie3 小时前
STM32中ARR(自动重装寄存器)为什么要减1
stm32·单片机·嵌入式硬件
鹿屿二向箔4 小时前
STM32外设之SPI的介绍
stm32
西瓜籽@4 小时前
STM32——毕设基于单片机的多功能节能窗控制系统
stm32·单片机·课程设计
远翔调光芯片^138287988726 小时前
远翔升压恒流芯片FP7209X与FP7209M什么区别?做以下应用市场摄影补光灯、便携灯、智能家居(调光)市场、太阳能、车灯、洗墙灯、舞台灯必看!
科技·单片机·智能家居·能源
极客小张7 小时前
基于STM32的智能充电桩:集成RTOS、MQTT与SQLite的先进管理系统设计思路
stm32·单片机·嵌入式硬件·mqtt·sqlite·毕业设计·智能充电桩