-
//此程序已经经过多年经验验证,如有疑问,请留言,我会尽快回复.
/**************************************** // 函数名称:Key_scan // 函数功能:检测按键功能 // 入口参数:无 // 出口参数:无 // 返 回 值: 无
//**************************************/ void Key_scan(void) // 2毫秒执行一次 { static uint8 key_value0=0;//按键前一次的状态寄存器 static uint8 key_delay=0;//延时抖动时间存器 static uint8 key_longtime;//长按按键基准时间1 static uint8 key_longtime1;//长按按键时间 总时间=key_longtime*key_longtime1*2ms+10ms(10ms为清抖时间) key_value=0; if(!P_K1)//按键扫描SW1 { key_value=1; } if(!P_K2)//按键扫描SW2 { key_value=2; } if(!P_K3)//按键扫描SW3 { key_value=4; } if(!P_K4)//按键扫描SW4 { key_value=8; } if(!P_K5)//按键扫描SW5 { key_value=16; } if(key_value==key_value0)//如不相等,保存当前按键值,清抖 { if(key_delay>5)//抖动处理 { if(key_value>0)//无按键按下确认,等于0时表示无按键,清释放标识位 { if(!f_onkey)//判断按键是否释放 { f_onkey=1; switch(key_value) { case 1://SW1有效执行内容 break; case 2://SW2有效执行内容 break; case 4://SW3有效执行内容 break; case 8://SW4有效执行内容 break; case 16://SW5有效执行内容 break; default: break; } } else { if(++key_longtime>90) { key_longtime=0; if(++key_longtime1>6) { key_longtime1=0; f_longkey=1;//长按按键有效 } } } } else//按键释放 { f_onkey=0; f_longkey=0; } } else //有按键 { key_delay++; } }
else//保存当前按键值 { key_value0=key_value; key_delay=0; } }