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