不影响使用.
// 如有朋友发现问题所在请联系我.
/*********************************************************/
#include #define KEY_IO P1 //按键所连的IO口
#define NO_KEY_VALUE 0xf //当按键没有被按下时IO口的值
#define KEY_WOBBLE_TIME 150 //去抖动时间(待定)
#define KEY_OVER_TIME 500 //等待进入连击时间(待定),该常数要比正常
//按键时间要长,防止非目的性进入连击模式
#define KEY_QUICK_TIME 200 //等待按键抬起的连击时间(待定)
typedef unsigned char uchar;
typedef unsigned int uint;
uchar ReadKey(){ //判断哪个键被按下
static uchar lastKey = NO_KEY_VALUE ;
static uint keyCount = 0;
static uint keyOverTime = KEY_OVER_TIME;
uchar keyTemp = NO_KEY_VALUE ;
keyTemp = KEY_IO & NO_KEY_VALUE ; //读取键值
if(keyTemp == NO_KEY_VALUE ){ //无按键按下时
keyCount = 0;
keyOverTime = KEY_OVER_TIME;
return NO_KEY_VALUE ;
}else{ //有按键按下时
if(keyTemp==lastKey){
if(++keyCount == KEY_WOBBLE_TIME){ //不是第1次按下判断抖动是否结束
return keyTemp; //去抖结束,返回键值
}else{
if(keyCount>keyOverTime){
keyCount = 0;
keyOverTime = KEY_QUICK_TIME;
}
return NO_KEY_VALUE ;
}
}else{ //是第1次按下则保存键值,下次执行此函数时与读到的键值作比较
lastKey = keyTemp ; //保存第1次读到的键值
keyCount = 0; //延时计数器清零
keyOverTime = KEY_OVER_TIME ;
return NO_KEY_VALUE ;
}
}
}
/
以上程序例子我用三个按键连在P1^0,P1^1,P1^2,使用中根据实际需要更改
KEY_IO P1 , NO_KEY_VALUE ,KEY_WOBBLE_TIME , KEY_OVER_TIME 500,
#define KEY_QUICK_TIME 200 .
如只需要判断单击,把判断连击的代码删除即可.
抛砖引玉^^