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;
}
这是一个函数,但是不明白啥意思,谁能帮我讲解一下
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
大概看了下,这个函数是通过状态机(按键的状态)来实现的,这个函数会被定时调用以判断按键状态。
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.如果松开了,说明按下一次就松开了,为单击模式,然后返回相应的值
一周热门 更多>