基于STM32F103C8T6的多按键检测 | 有限状态机短按、长按识别 | 标准库函数实现方法

制作航模遥控器需要用到多按键检测,使用有限状态机实现检测短按、长按,修正了原文中的一些错误
摘要由CSDN通过智能技术生成

前言

制作航模遥控器需要用到多按键检测,实现过程中主要参考了以下两篇文章,尤其是第一篇收获最大,作者的代码思想很好,但文中部分代码有误,实际运行时检测到的IO电平是错误的,花费了一天时间才调通,简单记录一下。

https://blog.csdn.net/qq_42679566/article/details/105892105

https://www.cnblogs.com/ZzJan/p/11334869.html

1.电路连接

使用STM32F103C8T6蓝色板,按键采用共阴极连接。

6个按键:
                CH1Left     接PB5
                CH1Right   接PB4
                CH2Up      接PA15
                CH2Down  接PB3
                CH4Left     接PA12
                CH4Right  接PA11

串口USB-TTL接法:    
                GND       电源地
                3V3         接3.3V
                TXD        接PB7
                RXD       接PB6
        ST-LINK V2接法:
                GND       电源地
                3V3         接3.3V
                SWCLK   接DCLK
                SWDIO    接DIO

2.程序实现

key.h - 主要定义结构体和函数预定义

#ifndef __KEY_H
#define __KEY_H	 
#include "stm32f10x.h"
#include "stm32f10x_gpio.h" 
typedef struct // 构造按键初始化类
{
	GPIOMode_TypeDef GPIO_Mode; // 初始化按键模式
	GPIO_TypeDef* GPIOx; // 初始化按键口
	uint16_t GPIO_Pin_x; // 初始化按键引脚好
	uint32_t RCC_APB2Periph_GPIOx; // 初始化时钟
}Key_Init;

typedef enum _KEY_STATUS_LIST // 按键状态
{
	KEY_NULL = 0x00, // 无动作
	KEY_SURE = 0x01, // 确认状态
	KEY_UP   = 0x02, // 按键抬起
	KEY_DOWN = 0x04, // 按键按下
	KEY_LONG = 0x08, // 长按
}KEY_STATUS_LIST;

typedef struct _KEY_COMPONENTS // 状态机类
{
    FunctionalState KEY_SHIELD; //按键屏蔽,DISABLE(0):屏蔽,ENABLE(1):不屏蔽
	uint8_t KEY_COUNT;        	//按键长按计数
    Bit
  • 15
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值