📄 keyscan.c
字号:
/*
KEY SCAN ROUTIN:Scan 12 keys only in 3 I/O pin.
*/
#dfeine KeySTBPin=p1^2;
#dfeine KeyClkPin=p3^7;
#dfeine KeyDataPin=p1^4;
enum
{
KEY_0=0,
KEY_1,
KEY_2,
KEY_3,
KEY_4,
KEY_5,
KEY_6,
KEY_7,
KEY_8,
KEY_9,
KEY_A,
KEY_MAX=IR_NONE
};
enum
{
KEY_SCAN;
KEY_JITTER;
KEY_RELEASE
};
static BYTE bIOKeyPress=IR_NONE;
static BYTE bIOKeyRoutineState=KEY_SCAN;
static void vKeyDelay(BYTE t)
{
BYTE i;
for(i=0;i<t;i++)
{
nop;
nop;
nop;
nop;
}
}
static void vIOkey_init(void)
{
bIOKeyRoutineState=KEY_SCAN;
bIOKeyPress=IR_NONE;
KeySTBPin=HIGH_LVL;
KeyClkPin=HIGH_LVL;
KeyDataPin=HIGH_LVL;
}
BOOL bIOKey_Scans(void)
{
unsigned char keyh,keyc,keyd;
KeySTBPin=HIGH_LVL;
vKeyDelay(5);
if(KeySTBPin==LOW_LVL)
{
if((KeyClkPin==HIGH_LVL)&&(KeyDataPin==HIGH_LVL))
{
bIOKeyPress=KEY_A;
return TRUE;
}
}
KeySTBPin=LOW_LVL;
KeyClkPin=HIGH_LVL;
KeyDataPin=HIGH_LVL;
vKeyDelay(5);
keyc=KeyClkPin;
keyd=KeyDataPin;
if((keyc==LOW_LVL)&&(keyd==LOW_LVL))
{
bIOKeyPress=KEY_0;
return TRUE;
}
else if(keyc==LOW_LVL)
{
bIOKeyPress=KEY_1;
return TRUE;
}
else if(keyd==LOW_LVL)
{
bIOKeyPress=KEY_2;
return TRUE;
}
KeyClkPin=LOW_LVL;
KeySTBPin=HIGH_LVL;
KeyDataPin=HIGH_LVL;
vKeyDelay(5);
keyh=KeySTBPin;
keyd= KeyDataPin;
if((keyh==LOW_LVL)&&(keyd==LOW_LVL))
{
bIOKeyPress=KEY_3;
return TRUE;
}
else if(keyh==LOW_LVL)
{
bIOKeyPress=KEY_4;
return TRUE;
}
else if(keyd==LOW_LVL)
{
bIOKeyPress=KEY_5;
return TRUE;
}
KeyDataPin=LOW_LVL;
KeySTBPin=HIGH_LVL;
KeyClkPin=HIGH_LVL;
vKeyDelay(5);
keyh=KeySTBPin;
keyc=KeyClkPin;
if((keyc==LOW_LVL)&&(keyh==LOW_LVL))
{
bIOKeyPress=KEY_6;
return TRUE;
}
else if(keyh==LOW_LVL)
{
bIOKeyPress=KEY_7;
return TRUE;
}
else if(keyc==LOW_LVL)
{
bIOKeyPress=KEY_8;
return TRUE;
}
vIOkey_init();
return FALSE;
}
BOOL bIOKey_Jitter(void)
{
unsigned char keyh,keyc,keyd;
switch(bIOKeyPress)
{
case KEY_0:
case KEY_1:
case KEY_2:
keyc=KeyClkPin;
keyd=KeyDataPin;
if(bIOKeyPress==KEY_0)
{
if((keyc==LOW_LVL)&&(keyd==LOW_LVL))
{
return TRUE;
}
}
else if(bIOKeyPress==KEY_1)
{
if(keyc==LOW_LVL)
{
return TRUE;
}
}
else if(bIOKeyPress==KEY_2)
{
if(keyd==LOW_LVL)
{
return TRUE;
}
}
break;
case KEY_3:
case KEY_4:
case KEY_5:
keyh=KeySTBPin;
keyd= KeyDataPin;
if(bIOKeyPress==KEY_3)
{
if((keyh==LOW_LVL)&&(keyd==LOW_LVL))
{
return TRUE;
}
}
else if (bIOKeyPress==KEY_4)
{
if(keyh==LOW_LVL)
{
return TRUE;
}
}
else if (bIOKeyPress==KEY_5)
{
if(keyd==LOW_LVL)
{
return TRUE;
}
}
break;
case KEY_6:
case KEY_7:
case KEY_8:
keyh=KeySTBPin;
keyc=KeyClkPin;
if(bIOKeyPress==KEY_6)
{
if((keyc==LOW_LVL)&&(keyh==LOW_LVL))
{
return TRUE;
}
}
else if(bIOKeyPress==KEY_7)
{
if(keyh==LOW_LVL)
{
return TRUE;
}
}
else if(bIOKeyPress==KEY_8)
{
if(keyc==LOW_LVL)
{
return TRUE;
}
}
break;
case KEY_A:
if((KeySTBPin==LOW_LVL)&&(KeyClkPin==HIGH_LVL)&&(KeyDataPin==HIGH_LVL))
{
return TRUE;
}
break;
default:
bIOKeyPress=IR_NONE;
break;
}
bIOKeyPress=IR_NONE;
return FALSE;
}
BYTE bKXD_Check_IOKey_Release(void)
{
BYTE bKey=IR_NONE;
unsigned char keyh,keyc,keyd;
switch(bIOKeyPress)
{
case KEY_0:
case KEY_1:
case KEY_2:
keyc=KeyClkPin;
keyd=KeyDataPin;
if((keyc==HIGH_LVL)&&(keyd==HIGH_LVL)&&(bIOKeyPress==KEY_0))
{
bKey=bIOKeyPress;
}
else if(keyc==HIGH_LVL&&(bIOKeyPress==KEY_1))
{
bKey=bIOKeyPress;
}
else if(keyd==HIGH_LVL&&(bIOKeyPress==KEY_2))
{
bKey=bIOKeyPress;
}
break;
case KEY_3:
case KEY_4:
case KEY_5:
keyh=KeySTBPin;
keyd= KeyDataPin;
if((keyh==HIGH_LVL)&&(keyd==HIGH_LVL)&&(bIOKeyPress==KEY_3))
{
bKey=bIOKeyPress;
}
else if(keyh==HIGH_LVL&&(bIOKeyPress==KEY_4))
{
bKey=bIOKeyPress;
}
else if(keyd==HIGH_LVL&&(bIOKeyPress==KEY_5))
{
bKey=bIOKeyPress;
}
break;
case KEY_6:
case KEY_7:
case KEY_8:
keyh=KeySTBPin;
keyc=KeyClkPin;
if((keyc==HIGH_LVL)&&(keyh==HIGH_LVL)&&(bIOKeyPress==KEY_6))
{
bKey=bIOKeyPress;
}
else if(keyh==HIGH_LVL&&(bIOKeyPress==KEY_7))
{
bKey=bIOKeyPress;
}
else if(keyc==HIGH_LVL&&(bIOKeyPress==KEY_8))
{
bKey=bIOKeyPress;
}
break;
case KEY_A:
if((KeySTBPin==HIGH_LVL)&&(KeyClkPin==HIGH_LVL)&&(KeyDataPin==HIGH_LVL))
{
bKey=bIOKeyPress;
}
break;
default:
KeyDataPin=HIGH_LVL;
KeyClkPin=HIGH_LVL;
KeySTBPin=HIGH_LVL;
bIOKeyPress=IR_NONE;
break;
}
if(bKey!=IR_NONE)
bIOKeyPress=IR_NONE;
return bKey;
}
BYTE bKXD_IOKey_Routine(void)
{
BYTE bKeyValue=IR_NONE;
switch(bIOKeyRoutineState)
{
case KEY_SCAN:
if(bIOKey_Scans()==TURE)
bIOKeyRoutineState=KEY_JITTER;
break;
case KEY_JITTER:
if(bIOKey_Jitter()==TURE)
bIOKeyRoutineState=KEY_RELEASE;
else
bIOKeyRoutineState=KEY_SCAN;
break;
case KEY_RELEASE:
bKeyValue=bKXD_Check_IOKey_Release();
if(bKeyValue!=IR_NONE)
bIOKeyRoutineState=KEY_SCAN;
break;
default:
bIOKeyRoutineState=KEY_SCAN;
break;
}
return bKeyValue;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -