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