OpenEdv-开源电子网

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

按键处理的函数

[复制链接]

1

主题

11

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2016-10-12
在线时间
2 小时
发表于 2016-11-21 19:57:20 | 显示全部楼层 |阅读模式
1金钱
u8 get_key_state(void)
{
        static u8  temp_key_state = KEY_STATE_UP;
    static u8  temp_key_value = 0;
    static u32 temp_key_dealy_count = 0;                //消抖计时
    static key_value_truct temp_key_value_mode;
        if (temp_key_state == KEY_STATE_UP)        //按键为弹起状态                          /* 按键为弹起状态             */
    {
        temp_key_value = get_key_value(&temp_key_value_mode);
        if(temp_key_value > 0)
        {
            temp_key_dealy_count = 0;
            temp_key_state = KEY_STATE_DOWN;
        }
        }
        if (temp_key_state == KEY_STATE_DOWN)                           /* 判断按键是否按下           */
    {
        temp_key_dealy_count++;                                                                                //消抖计时自加
        if (temp_key_dealy_count > KEY_DELAY_COUNT)                                        //如果大于消抖计数器数值则进行清零
        {
            temp_key_dealy_count = 0;                                                               
            if (temp_key_value == get_key_value(&temp_key_value_mode))   /* 判断按键是否为按下状态     */
            {   
                if (temp_key_value_mode.key_mode == KEY_MODE_COMBO)      /* 判断按键是否为连击模式     */
                {
                    return  temp_key_value;                                                               
                }
                else
                {
                    return  0x00;
                }
            }
            else                                                      
            {
                temp_key_state = KEY_STATE_UP;                                                         /* 按键弹起                    */
                if (temp_key_value_mode.key_mode == KEY_MODE_NORMAL)    /* 如果按键为单击模式返回键值  */
                {
                    return  temp_key_value;
                }
                else
                {
                    return  0x00;
                }   
            }   
        }
    }
        return 0x00;
}


这是一个函数,但是不明白啥意思,谁能帮我讲解一下

最佳答案

查看完整内容[请看2#楼]

大概看了下,这个函数是通过状态机(按键的状态)来实现的,这个函数会被定时调用以判断按键状态。 1.首先判断按键是否为弹起(未按下)状态,如果为弹起态,则调用函数get_key_value判断有没有按键按下,如果有新的按键按下,清零temp_key_dealy_count(用作重新开始计数),按键状态变为按下态; 2.然后调到下一个if语句,由于按键按下态,if条件成立,先执行temp_key_dealy_count自加, 2.1.然后又一个if判断temp_key ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

2165

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5773
金钱
5773
注册时间
2013-11-22
在线时间
1211 小时
发表于 2016-11-21 19:57:21 | 显示全部楼层
本帖最后由 lycreturn 于 2016-11-21 20:55 编辑

大概看了下,这个函数是通过状态机(按键的状态)来实现的,这个函数会被定时调用以判断按键状态。
1.首先判断按键是否为弹起(未按下)状态,如果为弹起态,则调用函数get_key_value判断有没有按键按下,如果有新的按键按下,清零temp_key_dealy_count(用作重新开始计数),按键状态变为按下态;
2.然后调到下一个if语句,由于按键按下态,if条件成立,先执行temp_key_dealy_count自加,
       2.1.然后又一个if判断temp_key_dealy_count 有没有达到设定值KEY_DELAY_COUNT(这个用作按键消抖),由于没达到设定值返回0x00, 但是记住这个时候按键任然是按下态       2.2.下一次调用函数get_key_state,由于按键是按下态,直接执行判断temp_key_dealy_count有没有达到KEY_DELAY_COUNT,没有达到,返回0x00,按键任然是按下态;直到temp_key_dealy_count达到KEY_DELAY_COUNT。
3.这时候执行到 if (temp_key_dealy_count > KEY_DELAY_COUNT) 里面,temp_key_dealy_count清零方便下一次计数。然后再次读取按键状态,
      3.1.如果按键任然处理按下状态,根据设置,判断是否为连击模式,然后返回相应的值;
      3.2.如果松开了,说明按下一次就松开了,为单击模式,然后返回相应的值
回复

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-6-15
在线时间
474 小时
发表于 2016-11-21 20:06:53 | 显示全部楼层
有些东西理论很简单,但是要解释就很麻烦。
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2016-10-12
在线时间
2 小时
 楼主| 发表于 2016-11-21 20:42:40 | 显示全部楼层
shuaigew88 发表于 2016-11-21 20:06
有些东西理论很简单,但是要解释就很麻烦。

理论也不是太明白
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2016-10-12
在线时间
2 小时
 楼主| 发表于 2016-11-23 19:09:50 | 显示全部楼层
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2016-10-12
在线时间
2 小时
 楼主| 发表于 2016-11-23 19:12:16 | 显示全部楼层
lycreturn 发表于 2016-11-21 19:57
大概看了下,这个函数是通过状态机(按键的状态)来实现的,这个函数会被定时调用以判断按键状态。
1.首先 ...

嗯嗯,有点明白了,谢谢啊
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2016-10-12
在线时间
2 小时
 楼主| 发表于 2016-11-23 19:22:26 | 显示全部楼层
lycreturn 发表于 2016-11-21 19:57
大概看了下,这个函数是通过状态机(按键的状态)来实现的,这个函数会被定时调用以判断按键状态。
1.首先 ...

temp_key_value = get_key_value(&temp_key_value_mode);
这一句还不太明白,调用get_key_value时为啥要和temp_key_value_mode与呢,与一下啥意思
回复

使用道具 举报

3

主题

2165

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5773
金钱
5773
注册时间
2013-11-22
在线时间
1211 小时
发表于 2016-11-23 21:47:43 | 显示全部楼层
孤狼一佐 发表于 2016-11-23 19:22
temp_key_value = get_key_value(&temp_key_value_mode);
这一句还不太明白,调用get_key_value时为啥 ...

&temp_key_value_mode  这个不是与,是取地址符,这是c语言基础知识,LZ得加强一下。&temp_key_value_mode是变量temp_key_value_mode的地址。
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2016-10-12
在线时间
2 小时
 楼主| 发表于 2016-11-27 08:59:18 | 显示全部楼层
哦,知道了,C语言基础不好,要加强了,谢谢亲
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2016-10-12
在线时间
2 小时
 楼主| 发表于 2016-11-27 09:00:03 | 显示全部楼层
哦,知道了,C语言基础不好,要加强了,谢谢亲
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 14:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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