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

本文介绍了如何在STM32F103C8T6上实现多按键检测,通过电路连接和程序设计,利用有限状态机识别按键的短按和长按。详细讲解了电路连接、关键代码实现及最终效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

制作航模遥控器需要用到多按键检测,实现过程中主要参考了以下两篇文章,尤其是第一篇收获最大,作者的代码思想很好,但文中部分代码有误,实际运行时检测到的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
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值