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

简介

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

电路原理图

按键电路原理图
在这里插入图片描述
按键与主芯片引脚原理图
在这里插入图片描述

其他知识

原理图分析

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

消除按键抖动

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

实现步骤

创建项目

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

初始化多个按键引脚

在这里插入图片描述

添加用户代码

key.h

#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

#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

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引脚实现跑马灯)

最近更新

  1. TCP协议是安全的吗?

    2024-01-09 04:28:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-09 04:28:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-09 04:28:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-09 04:28:01       18 阅读

热门阅读

  1. kotlin 单例

    2024-01-09 04:28:01       37 阅读
  2. Android开发 基于ARouter开源的路由框架的YmRouter

    2024-01-09 04:28:01       37 阅读
  3. 与AI合作 -- 写一个modern c++单例工厂2

    2024-01-09 04:28:01       45 阅读
  4. 检查unity打包IOS包含dlopen的块

    2024-01-09 04:28:01       30 阅读
  5. 面试经典150题(72-77)

    2024-01-09 04:28:01       34 阅读
  6. React Hooks之useState、useRef

    2024-01-09 04:28:01       50 阅读
  7. Mysql 中的常用命令

    2024-01-09 04:28:01       33 阅读
  8. 了解一下InternLM2

    2024-01-09 04:28:01       36 阅读
  9. linux 设备模型之类

    2024-01-09 04:28:01       29 阅读
  10. 复杂度分析-时间复杂度和空间复杂度

    2024-01-09 04:28:01       32 阅读
  11. mysql 通过 binglog 恢复数据

    2024-01-09 04:28:01       30 阅读