这篇文章主要是代码分享,以及简单解析。
对代码哪里不理解的,欢迎找我讨论哈。
和上篇代码结构不一样的地方是多文件和分模块,使得工程更加有条理。
这篇文章主要是单片机输入和输出典型代表,这个在单片机初学中是很常见的。
这次的代码是直接按照文件抛出来的,不像上次解释的那么细。
独立按钮的处理
独立按钮在单片机初学阶段一定是绕不开的。
计算机系统的组成里边包括输入和输出两个部分。
我们的单片机也是一个计算机系统,区别是单片机是专用的,高度可裁剪的计算机系统。
独立按键就是一个典型的输入部分。
在这里不给你讲按键过于细节的部分。
在PID电机调速那篇文章中也就简单的独立按钮处理。这个工程里就是更规范化了,适合在实际工程中使用。同样这个工程中也没有做消抖处理。
下边的代码是按键配置头文件,也就是h文件。
#ifndef __BUTTON_CFG_H_
#define __BUTTON_CFG_H_
#include "Reg.h"
typedef enum
{
Btn_Up,
Btn_Down,
Btn_Left,
Btn_Right,
Btn_TotalNum
}Button;
typedef enum
{
Btn_Sta_Press,
Btn_Sta_Release,
Btn_Sta_PressLong,
}Button_State;
typedef struct
{
Button BtnID;
GPIO_TypeDef *GPIOx;
uint8_t Pinx;
uint8_t FreeLevel;
}ButtonCfg_Def;
#endif
下边的代码是按键配置C文件。
实际上配置文件里的GPIOB这个参数没有使用,原因就是在写GPIO这个初始化文件的时候是直接针对B端口的函数,没有写成通用的。
#include "button_cfg.h"
const ButtonCfg_Def BtnCfg[Btn_TotalNum] = {
{
Btn_Up, GPIOB, 5, 1},
{
Btn_Down, GPIOB, 6, 1},
{
Btn_Left, GPIOB, 7, 1},
{
Btn_Right, GPIOB, 8, 1},
};
下边的代码是按键对外开放的接口文件,也就是h文件。
一般情况下这种接口文件尽可能要简短。
#ifndef __BUTTON_H
#define __BUTTON_H
#include "button_cfg.h"
void Button_Init(void);
void Button_Step(void);
uint8_t Button_Read(Button *btn,Button_State *sta);
#endif
下边的代码是按键功能C语言实现的代码文件,里边实现了简单的环形队列,用于存放按键触发的状态。
按键功能的实现,很大程度取决你习惯用什么技术,有的人喜欢用回调去做,这种方式在图形界面中比较常见。
这种方式在之前H7 串口的那几篇文章中有实现。
#include "button.h"
#include "GPIO.h"
#define BtnQueueDeep 16ul
typedef struct{
Button btn;
Button_State sta;
uint8_t reset;
}BtnQueue_Def;
static BtnQueue_Def BtnQueue[BtnQueueDeep];
struct BtnRW_CB
{
uint8_t ReadNum;
uint8_t WriteNum;
}BtnRW;
static uint8_t Btn_PressCount[Btn_TotalNum];
static Button_State Btn_LastSta[Btn_TotalNum];
extern ButtonCfg_Def BtnCfg[Btn_TotalNum];
static void BtnQueueWrite(Button btn,Button_State sta)
{
Btn_LastSta[btn] = sta;
BtnQueue[BtnRW.WriteNum].btn = btn;
BtnQueue[BtnRW.WriteNum].sta = sta;
BtnQueue[BtnRW.WriteNum ++].reset

最低0.47元/天 解锁文章
987

被折叠的 条评论
为什么被折叠?



