硬汉嵌入式论坛

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

[有问必答] 检测一个按键非阻塞状态程序如何理解???

[复制链接]

2

主题

15

回帖

2

积分

新手上路

wewe

积分
2
QQ
发表于 2015-3-31 15:44:21 | 显示全部楼层 |阅读模式
/*
*********************************************************************************************************
*    函 数 名: bsp_DetectButton
*    功能说明: 检测一个按键。非阻塞状态,必须被周期性的调用。
*    形    参:按键结构变量指针
*    返 回 值: 无
*********************************************************************************************************
*/
static void bsp_DetectButton(BUTTON_T *_pBtn)
{
    /*   首先要检测所有按键初始化完成,即所有按键为弹起,即正常的状态   */


    /* 如果没有初始化按键函数,则报错
    if (_pBtn->IsKeyDownFunc == 0)
    {
        printf("Fault : DetectButton(), _pBtn->IsKeyDownFunc undefine");
    }
    */

    if (_pBtn->IsKeyDownFunc())       /*_pBtn->IsKeyDownFunc()首先检测按键的状态,返回1表示按下*/
    {
        if (_pBtn->Count < _pBtn->FilterTime)  /*如果滤波器计数器<滤波时间50mS*/
        {
            _pBtn->Count = _pBtn->FilterTime;
        }
        else if(_pBtn->Count < 2 * _pBtn->FilterTime)     /*滤波时间50mS<=如果滤波器计数器<2倍滤波时间100mS时*/
        {
            _pBtn->Count++;            /*假如条件成立,这里为什么要自加???*/
        }
        else                        /*滤波计数器>=2倍的滤波时间时100mS*/
        {
            if (_pBtn->State == 0)    /*初始化后为0(表示为按下),条件成立*/
            {
                _pBtn->State = 1;    /*赋值1表示按下*/

                /* 发送按钮按下的消息 */
                if (_pBtn->KeyCodeDown > 0)     /*初始化后s_BtnUser.KeyCodeDown = KEY_DOWN_USER为1(枚举自增)*/
                {
                    /* 键值放入按键FIFO */
                    bsp_PutKey(_pBtn->KeyCodeDown);      /*表示按键按下存入FIFO的s_Key.Buf[0]*/
                }
            }

            if (_pBtn->LongTime > 0)   /*长按时间初始化后为1000mS*/
            {
                if (_pBtn->LongCount < _pBtn->LongTime)     /*如果长按计数器(没定义啊???)<长按时间*/
                {
                    /* 发送按钮持续按下的消息 */
                    if (++_pBtn->LongCount == _pBtn->LongTime)
                    {
                        /* 键值放入按键FIFO */
                        bsp_PutKey(_pBtn->KeyCodeLong);                        
                    }
                }
                else
                {
                    if (_pBtn->RepeatSpeed > 0)
                    {
                        if (++_pBtn->RepeatCount >= _pBtn->RepeatSpeed)
                        {
                            _pBtn->RepeatCount = 0;
                            /* 常按键后,每隔10ms发送1个按键 */
                            bsp_PutKey(_pBtn->KeyCodeDown);                                                        
                        }
                    }
                }
            }
        }
    }
    else       /*_pBtn->IsKeyDownFunc()首先检测按键的状态,返回0表示弹起或者是为按下*/
    {
        if(_pBtn->Count > _pBtn->FilterTime)
        {
            _pBtn->Count = _pBtn->FilterTime;
        }
        else if(_pBtn->Count != 0)
        {
            _pBtn->Count--;
        }
        else                   /*如果_pBtn->Count=0,即滤波计数器为0*/
        {
            if (_pBtn->State == 1)
            {
                _pBtn->State = 0;

                /* 发送按钮弹起的消息 */
                if (_pBtn->KeyCodeUp > 0)
                {
                    /* 键值放入按键FIFO */
                    bsp_PutKey(_pBtn->KeyCodeUp);            
                }
            }
        }

        _pBtn->LongCount = 0;
        _pBtn->RepeatCount = 0;
    }
}

第一个问题
else if(_pBtn->Count < 2 * _pBtn->FilterTime)     /*滤波时间50mS<=如果滤波器计数器<2倍滤波时间100mS时*/
        {
            _pBtn->Count++;            /*假如条件成立,这里为什么要自加???*/
        }


第二个问题

/* 按键滤波时间50ms, 单位10ms
只有连续检测到50ms状态不变才认为有效,包括弹起和按下两种事件
*/
这里我怎么感觉是大于100mS才认为有效啊???

else                        /*滤波计数器>=2倍的滤波时间时100mS*/
        {
            if (_pBtn->State == 0)    /*初始化后为0(表示为按下),条件成立*/
            {
                _pBtn->State = 1;    /*赋值1表示按下*/


                /* 发送按钮按下的消息 */
                if (_pBtn->KeyCodeDown > 0)     /*初始化后s_BtnUser.KeyCodeDown = KEY_DOWN_USER为1(枚举自增)*/
                {
                    /* 键值放入按键FIFO */
                    bsp_PutKey(_pBtn->KeyCodeDown);      /*表示按键按下存入FIFO的s_Key.Buf[0]*/
                }
            }
爱好&偏执
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106913
QQ
发表于 2015-3-31 21:46:40 | 显示全部楼层
从_pBtn->FilterTime 到2 * _pBtn->FilterTime计数
回复

使用道具 举报

2

主题

15

回帖

2

积分

新手上路

wewe

积分
2
QQ
 楼主| 发表于 2015-4-1 08:10:16 | 显示全部楼层

回 eric2013 的帖子

eric2013:从_pBtn->FilterTime 到2 * _pBtn->FilterTime计数 (2015-03-31 21:46) 
感谢,指点,我在琢磨一下
爱好&偏执
回复

使用道具 举报

2

主题

15

回帖

2

积分

新手上路

wewe

积分
2
QQ
 楼主| 发表于 2015-4-1 15:22:54 | 显示全部楼层
游客,如果您要查看本帖隐藏内容请回复
爱好&偏执
回复

使用道具 举报

2

主题

15

回帖

2

积分

新手上路

wewe

积分
2
QQ
 楼主| 发表于 2015-4-1 15:23:34 | 显示全部楼层
游客,如果您要查看本帖隐藏内容请回复
爱好&偏执
回复

使用道具 举报

2

主题

15

回帖

2

积分

新手上路

wewe

积分
2
QQ
 楼主| 发表于 2015-4-1 15:31:23 | 显示全部楼层

_pBtn->FilterTime  到  2 * _pBtn->FilterTime计数    这段时间是滤波+检测按键的有效性(按下的持续时间)?这样理解感觉合理
爱好&偏执
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106913
QQ
发表于 2015-4-1 16:07:56 | 显示全部楼层
_pBtn->Count 的初始赋值就是 _pBtn->FilterTime;  这么做是为了方便程序代码的处理。
回复

使用道具 举报

2

主题

15

回帖

2

积分

新手上路

wewe

积分
2
QQ
 楼主| 发表于 2015-4-1 16:10:57 | 显示全部楼层

回 eric2013 的帖子

eric2013:_pBtn->Count 的初始赋值就是 _pBtn->FilterTime;  这么做是为了方便程序代码的处理。 (2015-04-01 16:07) 
好的,我明白点啦!谢谢您
爱好&偏执
回复

使用道具 举报

2

主题

15

回帖

2

积分

新手上路

wewe

积分
2
QQ
 楼主| 发表于 2015-4-1 16:17:54 | 显示全部楼层
else if(_pBtn->Count < 2 * _pBtn->FilterTime)     /*滤波时间50mS<=如果滤波器计数器<2倍滤波时间100mS时*/
        {
            _pBtn->Count++;            
        }

这段代码就是实现按键检测的,时间为50mS
爱好&偏执
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106913
QQ
发表于 2015-4-1 21:33:16 | 显示全部楼层

回 heqin 的帖子

heqin:    else if(_pBtn->Count < 2 * _pBtn->FilterTime)     /*滤波时间50mS<=如果滤波器计数器<2倍滤波时间100mS时*/
        {
        &nb .. (2015-04-01 16:17) 
对,就是这样的。
回复

使用道具 举报

4

主题

5

回帖

4

积分

新手上路

积分
4
发表于 2016-3-16 19:21:46 | 显示全部楼层
[s:151]  [s:151]  [s:151]
回复

使用道具 举报

2

主题

70

回帖

76

积分

初级会员

积分
76
发表于 2016-4-10 14:03:20 | 显示全部楼层
[s:151] [s:151] [s:151]
回复

使用道具 举报

3

主题

10

回帖

19

积分

新手上路

积分
19
发表于 2016-4-14 21:15:45 | 显示全部楼层
学习一下
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2017-5-7 14:33:42 | 显示全部楼层
谢谢分享,支持一下!
回复

使用道具 举报

0

主题

13

回帖

0

积分

新手上路

积分
0
发表于 2017-5-16 02:19:46 | 显示全部楼层

回 heqin 的帖子

heqin:[内容隐藏] (2015-04-01 15:22) 
edfwed
回复

使用道具 举报

6

主题

21

回帖

39

积分

新手上路

积分
39
发表于 2022-4-23 11:28:24 | 显示全部楼层
我也有点不明白
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106913
QQ
发表于 2022-4-23 11:29:36 | 显示全部楼层
PYL4869 发表于 2022-4-23 11:28
我也有点不明白

可以看视频教程学习。

10、视频教程第10期:STM32H7的GPIO专题,非阻塞式驱动编程思想,按键FIFO,蜂鸣器驱动的新式玩法(2022-03-23)
https://www.armbbs.cn/forum.php?mod=viewthread&tid=111527

11、视频教程第11期:STM32H7的GPIO实战,深化非阻塞编程思想,移植驱动到全新器件上,开启Event Recorder狂暴模式(2022-04-01)
https://www.armbbs.cn/forum.php?mod=viewthread&tid=111702
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-9 16:55 , Processed in 0.359037 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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