分享

独立键盘扫描程序,带松手检测,可区别长击与短击

 filedot 2012-07-14
独立键盘扫描程序,带松手检测,可区别长击与短击  发表于 2012-06-10 19:10:01 我想评分   回到列表    收藏此帖 [您是本帖的第293位阅读者]     [1楼] 
寒寒
我是GG    高级会员
用户等级:工程师
加为好友 发短消息
所有发言 个人档案
最后登陆时间:2012-07-12 09:35:16
状态:离线

 花了一个星期写出来的,四个按键的独立键盘扫描程序。可以区别长击和短击,同时采用计数方式来消抖。按下键一定时间内,松手后返回对应值;按下键超过一定时间,返回对应值。短击的返回值是在松手后才产生,长击则是超过时间就产生,长击松手后不会返回短击的值。

u8 Key_Scan(void)
{
u8 key_ret = 0;
static u8 key_num = 0,del_count,tim_count;
static bit key_flag = 0;
if((!SET)||(!KUP)||(!KDN)||(!KOK)){/*判断是否有键按下*/
if(++del_count==5){/*计数消抖*/
del_count = 0;
if(++tim_count>4){/*长按识别*/
key_flag = 0;/*短按无效*/
tim_count = 4;/*锁定长按*/
switch(key_num){
case 1:key_ret = 5;break;
case 2:key_ret = 6;break;
case 3:key_ret = 7;break;
case 4:key_ret = 8;break;
}
}
else{/*短按有效*/
key_flag = 1;/*短按标志位*/
if(!SET)key_num = 1;/*一下用于识别按键*/
if(!KUP)key_num = 2;
if(!KDN)key_num = 3;
if(!KOK)key_num = 4;
}
}
}else{/*松手之后*/
tim_count = 0;
if(key_flag){/*松手*/
key_flag = 0;
switch(key_num){
case 1:key_ret = 1;break;
case 2:key_ret = 2;break;
case 3:key_ret = 3;break;
case 4:key_ret = 4;break;
}
}
}
return key_ret;
}

不过感觉程序还有地方可以改进。贴出来跟大家一起讨论。共享一份文档

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多