#define LONG_KEY_UP 1 //长按键松开500ms #define LONG_KEY_DOWN 2 //长按键进行中 #define SINGLE_KEY 3 //单击完成(500ms无按键) #define DOUBLE_KEY 4 //双击完成(可扩展N击) #define NO_KEY 5 //无按键 #define KEYDOWN 1 #define KEYUP 0 //每10ms调用一次该函数 unsigned char ReadKey() { static unsigned char flag=0; static unsigned int keydowncount=0; static unsigned int keyupcount=0; unsigned char keystat; keystat=ReadKey(); //读按键状态 if(keystat==KEYDOWN) //按下状态 { if(keyupcount!=0) // 松开有计数 说明正在等待的时候按下 { keyupcount=0; flag=1; //等待连击 } keydowncount++; if(keydowncount>100) //长按状态 return LONG_KEY_DOWN; } else //松开状态 { if(keydowncount>=5) //有按下计数的时候才会启动 keyupcount++; if(keydowncount<5) //防抖 { keydowncount=0; return NO_KEY; } else if (keydowncount>=5&&keydowncount<100) //防抖成功而且 按下小于1s { if(keyupcount>50) //松开大于500ms { keydowncount=0; keyupcount=0; if(flag) //等待双击标志位 return DOUBLE_KEY; //双击 else { flag=0; //等待双击失败 return SINGLE_KEY; //单击 } } else //松开不到500ms { return NO_KEY; } } else if (keydowncount>=100) //按下大于1S { if(keyupcount>50) //松开500ms { keydowncount=0; keyupcount=0; flag=0; return LONG_KEY; } else { return NO_KEY; } } } }