⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sys_key.c

📁 其乐达(Cheertek)LCD驱动芯片(CT675)的C51源代码
💻 C
字号:
#include "INC\SYS_DECLARE.H"
#include "INC\SYS_GLOBAL.H"

#include "INC\SYS_INITIAL.H"
#include "INC\SYS_KEY.H"
#include "INC\SYS_IR.H"

ST_KEY_STATUS_TYPE  stKeyStatus;

/***************************************************************************/
BYTE code RepeatRate[]=
{   // Max. = 15
    15, // 300 mS
    13, // 260 mS
    10, // 100 mS
    3   // 60 mS
};

void _Key_Polling(void);
void _IR_Polling(void);

/***************************************************************************/
void SYS_Key(void)
{
    _Key_Polling();

    if(gbKeyCode == KEY_NO_KEY)
    {
        _IR_Polling();
    }
#if(UART_DEBUG_MSG)
    else
    {
        printf("Got KEY : 0x%02X\n", (int)gbKeyCode);
    }
#endif // UART_DEBUG_MSG
}

/***************************************************************************/
void SYS_Key_Initial(void)
{
    stKeyStatus.Stage = CHECK_PRESS;
    stKeyStatus.Index = 0;
    stKeyStatus.Times = RepeatRate[stKeyStatus.Index];

    gbPreKeyCode = KEY_NO_KEY;
    gbKeyCode    = KEY_NO_KEY;
    gfKeyRepeat  = FALSE;
}

/***************************************************************************/
BYTE GetKeyCode(void)
{
    // Check Combine-Key
    //             76543210
    if((P2 & BIN(0x00111100)) == 0) return KEY_LOAD_DEFAULT;
    if((P2 & BIN(0x00110100)) == 0) { SYS_CpuEnterIspMode(); return KEY_NO_KEY; }

    if(KEY_UP_PIN    == 0) return KEY_UP;
    if(KEY_DOWN_PIN  == 0) return KEY_DOWN;
    if(KEY_LEFT_PIN  == 0) return KEY_LEFT;
    if(KEY_RIGHT_PIN == 0) return KEY_RIGHT;
    if(KEY_MENU_PIN  == 0) return KEY_MENU;
    if(KEY_EXIT_PIN  == 0) return KEY_EXIT;
    if(KEY_PWR_PIN   == 0) return KEY_POWER;

    return KEY_NO_KEY;
}

/***************************************************************************/
void _Key_Polling(void)
{
    BYTE bKeyCode;

    if(gfScanKey == FALSE) return;
    gfScanKey = FALSE;

    switch(stKeyStatus.Stage)
    {
        case CHECK_PRESS:
            bKeyCode = GetKeyCode();
            if(bKeyCode != gbPreKeyCode)
            {
                gbPreKeyCode = bKeyCode;
                stKeyStatus.Stage = CHECK_BOUNCE;
            }
            break;

        case CHECK_BOUNCE:
            bKeyCode = GetKeyCode();
            if(bKeyCode == gbPreKeyCode)
            {
                stKeyStatus.Stage = CHECK_RELEASE;
                gbKeyCode = gbPreKeyCode;   // KeyEvents
            }
            else
                stKeyStatus.Stage = CHECK_PRESS;
            break;

        case CHECK_RELEASE:
            bKeyCode = GetKeyCode();
            if(bKeyCode == KEY_NO_KEY)
            {
                gbPreKeyCode = KEY_NO_KEY;
                stKeyStatus.Stage = CHECK_PRESS;
            }
            else if(bKeyCode != gbPreKeyCode)
            {
                stKeyStatus.Stage = CHECK_PRESS;
            }
            else    // (bKeyCode == gbPreKeyCode) check Repeat
            {
                if(gfKeyRepeat)
                {
                    stKeyStatus.Times--;
                    if(stKeyStatus.Times == 0)
                    {
                        if(stKeyStatus.Index != 3) stKeyStatus.Index++;
                        stKeyStatus.Times = RepeatRate[stKeyStatus.Index];
                        gbKeyCode = gbPreKeyCode;   // KeyEvents
                    }
                }
            }
            break;

        default:
            break;
    }
}

/***************************************************************************/
void _IR_Polling(void)
{
    if(gfIrKeyReady == FALSE) return;

#if(UART_DEBUG_MSG)
    printf("IR = %02X %02X %02X %02X\n", (int)gbIrCustomCode, (int)gbIrCustomCodeNot, (int)gbIrDataCode, (int)gbIrDataCodeNot);
#endif // UART_DEBUG_MSG

    if((gbIrCustomCode == 0x01) && (gbIrCustomCodeNot == 0xFE))
    {
        if(gbIrDataCode == 0x40)    gbKeyCode = KEY_UP;
        if(gbIrDataCode == 0x41)    gbKeyCode = KEY_LEFT;
        if(gbIrDataCode == 0x42)    gbKeyCode = KEY_MENU;
        if(gbIrDataCode == 0x43)    gbKeyCode = KEY_RIGHT;
        if(gbIrDataCode == 0x44)    gbKeyCode = KEY_DOWN;
    }

    gfIrKeyReady = FALSE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -