OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5381|回复: 0

这样算oop不,刚刚了解这方面知识,看了一上午写了个按键扫描。

[复制链接]

3

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2018-8-5
在线时间
11 小时
发表于 2021-11-4 13:45:33 | 显示全部楼层 |阅读模式
本帖最后由 yikexiaoshu 于 2021-11-4 13:48 编辑


/* 硬件映射 */
#define PIN_KEY1 _pa1
#define PIN_KEY2 _pa2
#define KEY_PRESS 1
#define KEY_RELASE 0

#define LONG_CNT_MIN 50

typedef enum {
    KEY_VALUE_NONE, /* 无按键按下*/
    KEY_VALUE_SHORT,
    KEY_VALUE_LONG,
    KEY_VALUE_MAX,
}KeyValueEn;

typedef enum {
    KEY_STATE_IDEL, /* 未按下 */
    KEY_STATE_FILT, /* 滤波 */
    KEY_STATE_DOWN,
    KEY_STATE_CHECK_RELASE,
    KEY_STATE_MAX,
}KeyStateEn;

typedef enum {
    KEY_NUM1 = 1,
    KEY_NUM2,
    KEY_NUM_MAX,
}KeyNumEn;

typedef struct keyObjLable{
    u8 keyState; /* @KeyStateEn */
    u8 keyValue; /* @KeyValueEn */
    u8 keyNum;   /* @KeyNumEn */
    u8 keepCnt;
    u8 (*IsUp)(u8 keyNumValue);
    void (*KeyScan)(keyObjLable* keyN);
}KeyObj;

KeyObj g_key1Obj, g_key2Obj;

static u8 IsKeyUp(u8 keyNumValue);
static void KeyScan(KeyObj* keyN);

void InitCreatKye1Obj(void)
{
    g_key1Obj.keyNum = KEY_NUM1;
    g_key1Obj.keyState = KEY_STATE_IDEL;
    g_key1Obj.keyValue = KEY_VALUE_NONE;
    g_key1Obj.keepCnt = 0;
    g_key1Obj.IsUp = IsKeyUp;
    g_key1Obj.KeyScan = KeyScan;
}

/* 间隔50ms 调用一次 */
static void KeyScan(KeyObj* keyN)
{
    switch (keyN->keyState)
    {
        case KEY_STATE_IDEL :
        {
            if (keyN->IsUp(g_key1Obj.keyNum) == 0)
            {
                keyN->keepCnt = 0;
                keyN->keyState = KEY_STATE_FILT;
            }
        }
        break;
        case KEY_STATE_FILT :
        {
            if (keyN->IsUp(keyN->keyNum) == 0)
            {
                keyN->keyState = KEY_STATE_DOWN;
            }
        }
        break;
        case KEY_STATE_DOWN :
        {
            if (keyN->IsUp(keyN->keyNum) == 0)
            {
                if (++keyN->keepCnt >= LONG_CNT_MIN)
                {
                    keyN->keyValue = KEY_VALUE_LONG;
                    keyN->keyState = KEY_STATE_CHECK_RELASE;
                }
            }
            else
            {
                keyN->keyValue = KEY_VALUE_SHORT;
                keyN->keyState = KEY_STATE_IDEL;
            }
        }
        break;
        case KEY_STATE_CHECK_RELASE :
        {
            if (keyN->IsUp(keyN->keyNum) == 1)
            {
                keyN->keyState = KEY_STATE_IDEL;
            }
        }
        break;
        default :
            //err print lastword
            while(1);
        break;
    }
}

/* keyNum @KeyNumEn */
static u8 IsKeyUp(u8 keyNumValue)
{
    switch(keyNumValue)
    {
        case 1 :
        {
            return (PIN_KEY1 == KEY_PRESS);
        }
        break;
        case 2 :
        {
            return (PIN_KEY2 == KEY_PRESS);
        }
        break;
        default :
            //err print lastword
            while(1); /* 卡住等狗咬死 */
        break;
    }
}

void main(void)
{
    InitCreatKye1Obj();
    while(1)
    {
        if (g_timeFlag50Ms == SET)
        {
            g_timeFlag50Ms = RESET;
            g_key1Obj.KeyScan(&g_key1Obj);
        }
    }
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 16:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表