按键处理的函数

2019-10-16 07:59发布

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;
}


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

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
lycreturn
1楼-- · 2019-10-16 09:50
本帖最后由 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.如果松开了,说明按下一次就松开了,为单击模式,然后返回相应的值
shuaigew88
2楼-- · 2019-10-16 14:24
有些东西理论很简单,但是要解释就很麻烦。
孤狼一佐
3楼-- · 2019-10-16 18:06
shuaigew88 发表于 2016-11-21 20:06
有些东西理论很简单,但是要解释就很麻烦。

理论也不是太明白
孤狼一佐
4楼-- · 2019-10-16 20:34
 精彩回答 2  元偷偷看……
孤狼一佐
5楼-- · 2019-10-17 01:54
lycreturn 发表于 2016-11-21 19:57
大概看了下,这个函数是通过状态机(按键的状态)来实现的,这个函数会被定时调用以判断按键状态。
1.首先 ...

嗯嗯,有点明白了,谢谢啊
孤狼一佐
6楼-- · 2019-10-17 03:17
lycreturn 发表于 2016-11-21 19:57
大概看了下,这个函数是通过状态机(按键的状态)来实现的,这个函数会被定时调用以判断按键状态。
1.首先 ...

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

一周热门 更多>