在Proteus软件仿真STM32F103寄存器玩俄罗斯方块之第二篇

这篇文章主要是代码分享,以及简单解析。
对代码哪里不理解的,欢迎找我讨论哈。
和上篇代码结构不一样的地方是多文件和分模块,使得工程更加有条理。
这篇文章主要是单片机输入和输出典型代表,这个在单片机初学中是很常见的。
这次的代码是直接按照文件抛出来的,不像上次解释的那么细。

独立按钮的处理

独立按钮在单片机初学阶段一定是绕不开的。
计算机系统的组成里边包括输入和输出两个部分。
我们的单片机也是一个计算机系统,区别是单片机是专用的,高度可裁剪的计算机系统
独立按键就是一个典型的输入部分。
在这里不给你讲按键过于细节的部分。
在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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值