硬汉嵌入式论坛

 找回密码
 立即注册
查看: 6061|回复: 8
收起左侧

[有问必答] 关于例程中的按键FIFO的BUG

[复制链接]

1

主题

9

回帖

1

积分

新手上路

积分
1
发表于 2015-7-7 11:00:17 | 显示全部楼层 |阅读模式
我在调试按键FIFO的时候,发现组合按键不好使,组合按键一触发,
肯定也把他们中的单个按键压入FIFO,这个还好,把IsKeyDown函数
里的按键判断改下就可以了,但是在测试长按键的时候发现触发长按
键同时也会把按键按下和按键抬起两个动作压入FIFO,这个BUG解决没有?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2015-7-7 11:19:16 | 显示全部楼层
这个代码是由站长来维护的,您可以旺旺联系我们的淘宝售后,旺旺ID:armfly就是我们站长。
回复

使用道具 举报

1

主题

9

回帖

1

积分

新手上路

积分
1
 楼主| 发表于 2015-7-7 11:34:27 | 显示全部楼层
额,抱歉哈,我用的不是你们的板子,不过学的是你们的程序,
你们的程序写的真的是很好的!我们的板子是我们实验室自己做的。
不过真的非常感谢你们提供这么好的例程!
对了,这个BUG我刚刚已经解决了,谢谢硬汉回复哈!
回复

使用道具 举报

1

主题

9

回帖

1

积分

新手上路

积分
1
 楼主| 发表于 2015-7-7 11:36:44 | 显示全部楼层
只需要把DetectKey()中稍微改动下就可以了,按照状态机的思想,把pBtn->State=1后再添加一个pBtn->State=2状态就可以解决了
回复

使用道具 举报

8

主题

33

回帖

7

积分

新手上路

积分
7
发表于 2015-7-7 11:38:30 | 显示全部楼层
分享一下啊
回复

使用道具 举报

1

主题

9

回帖

1

积分

新手上路

积分
1
 楼主| 发表于 2015-7-7 11:43:06 | 显示全部楼层
直接贴修改后的代码
static void DetectKey(uint8_t i)
{
    KEY_T *pBtn;

    pBtn = &s_tBtn;
    if (pBtn->IsKeyDownFunc())
    {
        if (pBtn->Count < KEY_FILTER_TIME)
        {
            pBtn->Count = KEY_FILTER_TIME;
        }
        else if(pBtn->Count < 2 * KEY_FILTER_TIME)
        {
            pBtn->Count++;
        }
        else
        {
            if (pBtn->State == 0)
            {
                pBtn->State = 1;

                /* 发送按钮按下的消息 */
                PutKey((uint8_t)(3 * i + 1));
            }
            
            
            else if (pBtn->State == 1)
            {
                if (pBtn->LongTime > 0)
                {
                    if (pBtn->LongCount < pBtn->LongTime)
                    {
                        pBtn->LongCount++;
                        if (pBtn->LongCount == pBtn->LongTime)
                        {
                            /* 键值放入按键FIFO */
                            PutKey((uint8_t)(3 * i + 3));
                            pBtn->State = 2;
                        }
                    }
                }
                else
                {
                    if (pBtn->RepeatSpeed > 0)
                    {
                        if (++pBtn->RepeatCount >= pBtn->RepeatSpeed)
                        {
                            pBtn->RepeatCount = 0;
                            /* 常按键后,每隔10ms发送1个按键 */
                            PutKey((uint8_t)(3 * i + 1));
                        }
                    }
                }
            }
        }
    }
    else
    {
        if(pBtn->Count > KEY_FILTER_TIME)
        {
            pBtn->Count = KEY_FILTER_TIME;
        }
        else if(pBtn->Count != 0)
        {
            pBtn->Count--;
        }
        else
        {
            if (pBtn->State == 1)
            {
                pBtn->State = 0;
               
                /* 发送按钮弹起的消息 */
                PutKey((uint8_t)(3 * i + 2));
            }
            else if (pBtn->State == 2)
            {
                pBtn->State = 0;
            }
        }

        pBtn->LongCount = 0;
        pBtn->RepeatCount = 0;
    }
}
回复

使用道具 举报

1

主题

9

回帖

1

积分

新手上路

积分
1
 楼主| 发表于 2015-7-7 12:09:39 | 显示全部楼层
额,前面贴了代码,可能提交失败了,再次提交
static void DetectKey(uint8_t i)
{
    KEY_T *pBtn;

    pBtn = &s_tBtn;
    if (pBtn->IsKeyDownFunc())
    {
        if (pBtn->Count < KEY_FILTER_TIME)
        {
            pBtn->Count = KEY_FILTER_TIME;
        }
        else if(pBtn->Count < 2 * KEY_FILTER_TIME)
        {
            pBtn->Count++;
        }
        else
        {
            if (pBtn->State == 0)
            {
                pBtn->State = 1;

                /* 发送按钮按下的消息 */
                PutKey((uint8_t)(3 * i + 1));
            }
            
            
            else if (pBtn->State == 1)
            {
                if (pBtn->LongTime > 0)
                {
                    if (pBtn->LongCount < pBtn->LongTime)
                    {
                        pBtn->LongCount++;
                        if (pBtn->LongCount == pBtn->LongTime)
                        {
                            /* 键值放入按键FIFO */
                            PutKey((uint8_t)(3 * i + 3));
                            pBtn->State = 2;
                        }
                    }
                }
                else
                {
                    if (pBtn->RepeatSpeed > 0)
                    {
                        if (++pBtn->RepeatCount >= pBtn->RepeatSpeed)
                        {
                            pBtn->RepeatCount = 0;
                            /* 常按键后,每隔10ms发送1个按键 */
                            PutKey((uint8_t)(3 * i + 1));
                        }
                    }
                }
            }
        }
    }
    else
    {
        if(pBtn->Count > KEY_FILTER_TIME)
        {
            pBtn->Count = KEY_FILTER_TIME;
        }
        else if(pBtn->Count != 0)
        {
            pBtn->Count--;
        }
        else
        {
            if (pBtn->State == 1)
            {
                pBtn->State = 0;
               
                /* 发送按钮弹起的消息 */
                PutKey((uint8_t)(3 * i + 2));
            }
            else if (pBtn->State == 2)
            {
                pBtn->State = 0;
            }
        }

        pBtn->LongCount = 0;
        pBtn->RepeatCount = 0;
    }
}
回复

使用道具 举报

1

主题

9

回帖

1

积分

新手上路

积分
1
 楼主| 发表于 2015-7-7 12:12:39 | 显示全部楼层
其实很简单,代码几乎没什么变化
回复

使用道具 举报

3

主题

10

回帖

19

积分

新手上路

积分
19
发表于 2016-4-14 15:26:50 | 显示全部楼层
谢谢分享!正是需要的!
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-14 02:02 , Processed in 0.043152 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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