// 按键常量定义
#define KEY_NO_PRESSED 0
#define KEY_SHORT_PRESSED (1 << 0)
#define KEY_LONG_PRESSED (1 << 1)
// 取得按键值
int getkey(void)
{
int timeout;
BOOL flag;
// there is no key pressed
if (RA4) return 0;
// 判断按键是长按还是短按
timeout = 2000;
flag = FALSE; // FALSE means long pressed
while (timeout--)
{
if (RA4)
{
flag = TRUE;
break;
}
delay_us(1000);
}
if (flag) return KEY_SHORT_PRESSED;
else return KEY_LONG_PRESSED;
}
void main(void)
{
int key;
while (1)
{
/* wait for key press event */
do { key = getkey(); } while (key == KEY_NO_PRESSED);
/* handle key press event */
switch (key)
{
case KEY_SHORT_PRESSED:
/* handle key short pressed */
/* todo.. */
break;
case KEY_LONG_PRESSED:
/* handle key long pressed */
/* todo.. */
break;
}
}
}
当然这个代码是不考虑操作系统的存在,采用 IO 口查询的方式来做的。如果你选用了 OS 再加上一个下降沿的中断,效率会更加高一些。
[
本帖最后由 RockCarry 于 2009-8-17 14:49 编辑 ]