普中STM32-PZ6806L开发板(HAL库函数实现-按键扫描)

简介

实现按键扫描, 实现四个按键按下控制灯的亮灭

电路原理图

按键电路原理图

按键与主芯片引脚原理图

其他知识

原理图分析

Key_UP按下会有高电平输入, 所以电路设置应该是默认低电平, 初始化为下拉输入

Key_Left/Right/Down按下会有低电平, 初始化为下拉输入

消除按键抖动

按键按下内部弹片会有抖动,引起检测多次触发信号, 需要进行延时防止抖动

实现步骤

创建项目

参考 普中STM32-PZ6806L开发板(STM32CubeMX创建项目并点亮LED灯)

初始化多个按键引脚

添加用户代码

key.h

c 复制代码
#ifndef __KEY_H__
#define __KEY_H__

#include "stm32f1xx_hal.h"

typedef enum
{
	KEY_PRESSED,
	KEY_NORMAL,
} KEY_Status;

typedef struct 
{
	GPIO_TypeDef *GPIOx;
	uint16_t GPIO_Pin;
	GPIO_PinState PressedState;
	void (*KeyPressedCallback)(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
}KEY_Info;

KEY_Status KEY_CheckStatus(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PressedState);

void KEY_KeysForeachAction(KEY_Info *keys, uint8_t size);

#endif //__KEY_H__

key.c

c 复制代码
#include "key.h"

KEY_Status KEY_CheckStatus(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PressedState)
{
	if ( PressedState == HAL_GPIO_ReadPin(GPIOx, GPIO_Pin) )
	{
		HAL_Delay(100);
		if ( PressedState == HAL_GPIO_ReadPin(GPIOx, GPIO_Pin) )
		{
			return KEY_PRESSED;
		}
	}
	return KEY_NORMAL;
}

void KEY_KeysForeachAction(KEY_Info *keys, uint8_t size)
{
	while (1)
	{
		for (int i = 0; i < size; ++i)
		{
			if ( KEY_PRESSED == KEY_CheckStatus(keys[i].GPIOx, keys[i].GPIO_Pin, keys[i].PressedState) )
			{
				keys[i].KeyPressedCallback(keys[i].GPIOx, keys[i].GPIO_Pin);
				break;
			}
		}
	}
}

main.c

c 复制代码
void onKeyPress( GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
	if ( KEY_UP_GPIO_Port ==  GPIOx && KEY_UP_Pin == GPIO_Pin)
	{
		LED_LightControl(LED1, LED_ON);
	}
	else if (KEY_DOWN_GPIO_Port ==  GPIOx && KEY_DOWN_Pin == GPIO_Pin)
	{
		LED_LightControl(LED1, LED_OFF);
	}
	else if (KEY_LEFT_GPIO_Port ==  GPIOx && KEY_LEFT_Pin == GPIO_Pin)
	{
		LED_LightControl(LED2, LED_ON);
	}
	else if (KEY_RIGHT_GPIO_Port ==  GPIOx && KEY_RIGHT_Pin == GPIO_Pin)
	{
		LED_LightControl(LED2, LED_OFF);
	}
}

int main()
{
KEY_Info infos[4] = 
	{
		{ KEY_UP_GPIO_Port, KEY_UP_Pin, GPIO_PIN_SET, onKeyPress},
		{ KEY_DOWN_GPIO_Port, KEY_DOWN_Pin, GPIO_PIN_RESET, onKeyPress},
		{ KEY_LEFT_GPIO_Port, KEY_LEFT_Pin, GPIO_PIN_RESET, onKeyPress},
		{ KEY_RIGHT_GPIO_Port, KEY_RIGHT_Pin, GPIO_PIN_RESET, onKeyPress},
	};
	...

	while(1)
	{
		KEY_KeysForeachAction((KEY_Info*)infos, sizeof(infos)/sizeof(KEY_Info));
	}
	...
}

共赏

普中STM32-PZ6806L开发板(HAL库函数实现-按键扫描) 点灯

代码

不需要下载, 基本代码上面都提供了

参考

普中STM32-PZ6806L开发板(HAL库函数实现-批量操作GPIO引脚实现跑马灯)

相关推荐
嵌入式阿蔡41 分钟前
OTA 实战四:安全启动与固件签名(Secure Boot)—— 拒绝非法固件
网络·stm32·单片机·嵌入式硬件·嵌入式实时数据库
LCMICRO-133108477461 小时前
国产长芯微LP8628完全P2P替代AD8628,零漂移、单电源、输入输出轨到轨高精度运放
arm开发·嵌入式硬件·fpga开发·硬件工程·精密运放·ad8628
DevHub1 小时前
电视盒子刷 Armbian 教程:30 元旧盒子变 NAS 跑 Docker,200+ 机型可刷
linux·嵌入式硬件·docker·容器·开源·电视盒子
wuyk55510 小时前
4.树:一对多的层次数据结构
开发语言·数据结构·stm32·单片机
天空'之城12 小时前
单片机基础核心知识点汇总(五)
单片机·嵌入式硬件
恒锐丰-罗生17 小时前
SS8103 芯片解析:45V 同步整流降压半桥恒流驱动控制器 大功率光源国产优选 告别低灰闪烁!
驱动开发·嵌入式硬件·硬件工程
FakeOccupational18 小时前
【电路笔记 STM32】stm32f103 实现HAL_UART_Transmit_DMA + 普通模式/连续模式的 UART DMA 收发
笔记·stm32·嵌入式硬件
wuyk55518 小时前
第 6 章 FOC 完整系统整合:从算法到真机跑起来
c语言·开发语言·stm32·单片机·嵌入式硬件
恒锐丰科技韩生18 小时前
率能 SS6810H|10‑32V 双通道 H 桥步进电机驱动 ETSSOP20 打印机安防舞台灯光专用
嵌入式硬件·硬件工程
1560820721919 小时前
直流耦合采集卡前端电路调试
嵌入式硬件·fpga开发