// 按键常量定义 
#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 编辑 ]