花了一个星期写出来的,四个按键的独立键盘扫描程序。可以区别长击和短击,同时采用计数方式来消抖。按下键一定时间内,松手后返回对应值;按下键超过一定时间,返回对应值。短击的返回值是在松手后才产生,长击则是超过时间就产生,长击松手后不会返回短击的值。
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; }
不过感觉程序还有地方可以改进。贴出来跟大家一起讨论。共享一份文档
| |