📄 key1.c
字号:
sbit P32 = P3^2;
#define PRESSTIME 700
#define TREMBLETIME 40
#define PLAYKEY P32
sbit KeyAdd_P14 = P1^4;
sbit KeyAdd_P15 = P1^5;
sbit KeyAdd_P16 = P1^6;
sbit KeyAdd_P17 = P1^7;
bit PlayKeyState=0;
xdata unsigned char KeyState = 0;
xdata unsigned char TempKey=0;
bit Key;
void ScanKey(void)
{
unsigned char Temp;
if(!Key)return;
P1 = 0xf0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
Temp = P1;
P1 = 0xff;
if((Temp&0xf0)!= 0xf0)
IntEntry = 1;
}
//-----------------------------------------------------------
//scan keybroad code
//intput:BIOS function
//P10-113:input port
//p14-p17:output port
//output:keybroad code
//___________________________________________________________
//73pin ,key0,p11
//72pin,key1,p12
//71pin,key2,p13
//70pin,key3,p14
//69pin,key4,p15
unsigned char ScanKeyCode()
{ data unsigned char i,k=0,Temp=0;
for(i = 0; i < 4;i++)
{ switch(i)
{ case 0:
P1 = 0xFE;
break;
case 1:
P1 = 0xFD;
break;
case 2:
P1 = 0xFB;
break;
case 3:
P1 = 0xF7;
break;
}
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
k++;
if(!KeyAdd_P14)//key3 low:(key0-key3,s3,5),(key1-key3,s7,9),(key2-key3,s1,d)
{
if(Temp) return 0xFF;//pressed the keys more than one at the same time,turn failture
Temp = k;
}
k++;
if(!KeyAdd_P15)//key4 low:(key0-key4,s6,6),(key1-key4,s5,a),(key2-key4,s4,e)
{
if(Temp) return 0xFF;//pressed the keys more than one at the same time,turn failture
Temp = k;
}
k++;
// if(!KeyAdd_P16)
// { if(Temp) return 0xFF;//pressed the keys more than one at the same time,turn failture
// Temp = k;
// }
k++;
// if(!KeyAdd_P17)
// { if(Temp) return 0xFF;//pressed the key more than one at the same time,turn failture
// Temp = k;
// }
}
return Temp;
P1 &= 0xF0;
}
//----------------------------------------------------------
//Get key value
//input:key code
//output:The key value
//Description:
//----------------------------------------------------------
void GetKeyValue(void)
{ data unsigned char Temp;
if(IntEntry)
IntExecute();
if(!KeyState) //don't check play key
{ if(!PlayKeyState)
{ if(PLAYKEY)
{ PlayKeyState = 1;
KeyState = 1;
Key = 0;
KeyTimer = 0;
TempKey = 0x11;
}
}
}
if(!KeyState) return;
if(PlayKeyState)
{ if(PLAYKEY)
Temp = 0x11;
else
Temp = 0;
}
else
Temp = ScanKeyCode();
switch (KeyState)
{ case 1:
if (KeyTimer > TREMBLETIME)
{ if(TempKey == Temp)
{ KeyTimer = 0;
KeyState++;
}
else
{ KeyState = 0;
P1 &= 0xF0;
Key = 1; //Enalbe key interrupter
PlayKeyState = 0;
}
}
break;
case 2:
if(KeyTimer > PRESSTIME)
{ if(TempKey == Temp)
{ NewKey = TempKey;
NewKey |= 0x20;//mark continue key
}
KeyTimer = 0;
KeyState = 4;
}
else
{ if(!Temp){
KeyTimer = 0;
KeyState++;
}
else if(Temp != TempKey)//find invalid key
KeyTimer = 0;
}
break;
case 3://single key release terrible program
if(KeyTimer > TREMBLETIME)
{ if(Temp)//single key release
{ KeyState = 2;//key jitter
}
else
{ NewKey = TempKey;//output a new single key
KeyState = 0;
P1 &= 0xF0;
Key = 1;//Enalbe key interrupter
PlayKeyState = 0;
}
}
break;
case 4://countinue key state
if(KeyTimer > PRESSTIME)
{ if(Temp == TempKey)
{ NewKey = TempKey;
NewKey |= 0x20;
}
KeyTimer = 0;
}
else
{ if(!Temp)
{ KeyTimer = 0;
KeyState++;
}
}
break;
case 5://continue key release
if(KeyTimer > TREMBLETIME)
{ if(Temp)
{ KeyState = 4;
}
else
{
NewKey = TempKey;
NewKey |= 0x40;
KeyState = 0;
P1 &= 0xF0;
Key = 1;//Enalbe key interrupter
PlayKeyState = 0;
}
}
break;
default:
break;
}
}
//-----------------------------------------------------------------
//interrupt 2 execute function
//input:none
//output:none
//-----------------------------------------------------------------
void IntExecute()
{ TempKey = ScanKeyCode();
if(!TempKey) return;
Key = 0; //INT1 disable
KeyState = 1;
KeyTimer = 0;
IntEntry = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -