嵌入式linux按键扫描,嵌入式C语言高级编程之复杂按键扫描状态机

三、最后也是最重要的一步就是按键状态扫描的实现。

// 定义一个全局的按键状态

Type_Key_Status key_status = KEY_NULL;

void key_scan(void)

{

uint16_t old_key_value = 0,new_key_value =0;

switch(key_status)

{

case KEY_NULL:

old_key_value = read_key();

if(old_key_value == 0) //没按键按下

{

return;

}

delay_ms(50);

new_key_value = read_key();

if(old_key_value == new_key_value)

{

old_key_value = new_key_value; //有键按下,状态跳转

key_short_press_callback(new_key_value) //回调按下处理函数

key_status = KEY_PRESS;

}else

{

key_status = KEY_NULL;

}

break;

case KEY_PRESS:

delay_ms(50);

new_key_value = read_key();

if(old_key_value == new_key_value)

{

old_key_value = new_key_value;

key_long_press_callback(new_key_value); //回调长按下处理

key_status = KEY_LONG_PRESS;

}else

{

key_short_release_callback(new_key_value); //回调短按释放处理

key_status = KEY_RELEASE;

}

break;

case KEY_LONG_PRESS:

delay_ms(50);

new_key_value = read_key();

if(old_key_value == new_key_value)

{

old_key_value = new_key_value;

key_long_long_press_callback(new_key_value); //回调超长按下处理

key_status = KEY_RELEASE; //更具自定义功能状态去跳转

}else

{

key_long_release_callback(new_key_value); //回调长按释放处理

key_status = KEY_RELEASE;

}

break;

case KEY_RELEASE:

release_key_handle();

key_status = KEY_NULL; //释放回到正常检测状态

break;

}

};

四、最后就是在各个按键状态的基础上实现处理函数,这里就可以对编码的那就值进行解析,分别处理,对于按键释放有组合也很好处理。

void key_short_press_handle(uint16_t key_value)

{

switch(key_value & USER_KEY_ALL_MSK)

{

//没有组合键

case USER_KEY1_MSK:

break;

case USER_KEY2_MSK:

break;

case USER_KEY3_MSK:

break;

case USER_KEY4_MSK:

break;

case USER_KEY5_MSK:

break;

case USER_KEY6_MSK:

break;

//组合按键

case USER_KEY1_MSK|USER_KEY2_MSK : break;

...

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值