📄 sys_key.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 + -