📄 pc_keybd.c
字号:
/*****************************************************************/
/* KEYBOARD INTERRUPT */
void Int1(void) interrupt 2 using 2
{
// static unsigned char value;
KData=1;
if (kb_bit_count < 11 && kb_bit_count > 2) // bit 3 to 10 is data & parity bit
{ // start and stop bits are ignored
value = value >> 1;
if (KData) value = value | 0x80;
kb_bit_count--;
}
else
{
if (--kb_bit_count == 0) // All bit received
{
DebugValue=value;
decode();
kb_bit_count=11;
}
}
}
/******************************************************************/
/* KEYBOARD ROUTINEs */
void KeyBd_Init(void)
{
inptr = KEYBDBUF;
outptr = KEYBDBUF;
buff_cnt=0;
kb_bit_count=11;
// IT1=1;
// KeyMaster=0;
// EX0=0;
}
void decode(void)
{
unsigned char i,temp;
FuncBit=0;
if(!is_up) //last data received was the up key identifier
{
switch (value)
{
case 0xFA:
FABit=1;
FuncBit=1;
break;
case 0xAA:
AABit=1;
FuncBit=1;
break;
case 0xEE:
EEBit=1;
FuncBit=1;
break;
case 0xFE:
ResendBit=1;
FuncBit=1;
break;
case 0xFF:
FFBit=1;
FuncBit=1;
break;
case 0xF0: // the up-key identifier
is_up =1;
FuncBit=1;
break;
case 0x12: //left SHIFT
shiftbit=1;
FuncBit=1;
break;
case 0x59: //right SHIFT
shiftbit=1;
FuncBit=1;
break;
case 0xE0: // the extend-key identifier
extendbit=1;
FuncBit=1;
break;
case 0x11:
AltRightBit=1;
FuncBit=1;
break;
case 0x14:
CtlRightBit=1;
FuncBit=1;
break;
case 0x70:
InsertBit=1;
FuncBit=1;
break;
case 0x71:
DeleteBit=1;
FuncBit=1;
break;
case 0x6b:
LArrowBit=1;
FuncBit=1;
break;
case 0x6c:
HomeBit=1;
FuncBit=1;
break;
case 0x69:
EndBit=1;
FuncBit=1;
break;
case 0x75:
UArrowBit=1;
FuncBit=1;
break;
case 0x72:
DArrowBit=1;
FuncBit=1;
break;
case 0x7d:
PageUpBit=1;
FuncBit=1;
break;
case 0x7a:
PageDownBit=1;
FuncBit=1;
break;
// case 0x76:
// ESCBit=1;
// KeyBdTrigger=1;
// FuncBit=1;
// break;
case 0x74:
RArrowBit=1;
FuncBit=1;
break;
// case 0x4a:
// NumSlashBit=1;
// FuncBit=1;
// break;
// case 0x5a:
// EnterBit=1;
// KeyBdTrigger=1;
// FuncBit=1;
// break;
default:
{
if (!extendbit)
{
if (!shiftbit)
{
i=0;
do
{
temp=unshifted[i][0];
if (temp == value)
{
DebugValue=unshifted[i][1];
// KEYBDBUF[0]=unshifted[i][1];
KeyBdTrigger=1;
break;
}
i++;
}while(temp);
}
else
{
i=0;
do
{
temp=shifted[i][0];
if (temp == value)
{
DebugValue=shifted[i][1];
KeyBdTrigger=1;
break;
}
i++;
}while(temp);
}
}
else
{
switch (value)
{
case 0x11:
AltRightBit=1;
FuncBit=1;
break;
case 0x14:
CtlRightBit=1;
FuncBit=1;
break;
case 0x70:
InsertBit=1;
FuncBit=1;
break;
case 0x71:
DeleteBit=1;
FuncBit=1;
break;
case 0x6b:
LArrowBit=1;
FuncBit=1;
break;
case 0x6c:
HomeBit=1;
FuncBit=1;
break;
case 0x69:
EndBit=1;
FuncBit=1;
break;
case 0x75:
UArrowBit=1;
FuncBit=1;
break;
case 0x72:
DArrowBit=1;
FuncBit=1;
break;
case 0x7d:
PageUpBit=1;
FuncBit=1;
break;
case 0x7a:
FuncBit=1;
PageDownBit=1;
break;
case 0x74:
RArrowBit=1;
FuncBit=1;
break;
// case 0x4a:
// NumSlashBit=1;
// FuncBit=1;
// break;
default:
{
if (!shiftbit)
{
i=0;
do
{
temp=unshifted[i][0];
if (temp == value)
{
DebugValue=unshifted[i][1];
KeyBdTrigger=1;
break;
}
i++;
}while(temp);
}
else
{
i=0;
do
{
temp=shifted[i][0];
if (temp == value)
{
DebugValue=shifted[i][1];
KeyBdTrigger=1;
break;
}
i++;
}while(temp);
}
break;
}
}
}
break;
}
}
}
else
{
is_up=0;
switch (value)
{
case 0xFA:
FABit=1;
// FuncBit=1;
break;
case 0xAA:
AABit=1;
// FuncBit=1;
break;
case 0xEE:
EEBit=1;
// FuncBit=1;
break;
case 0xFE:
ResendBit=1;
// FuncBit=1;
break;
case 0xFF:
FFBit=1;
// FuncBit=1;
break;
case 0x12: //left SHIFT
shiftbit=0;
// FuncBit=1;
break;
case 0x59: //right SHIFT
shiftbit=0;
// FuncBit=1;
break;
case 0x11:
AltRightBit=0;
// FuncBit=1;
break;
case 0x14:
CtlRightBit=0;
// FuncBit=1;
break;
case 0x70:
InsertBit=0;
// FuncBit=1;
break;
case 0x71:
DeleteBit=0;
// FuncBit=1;
break;
case 0x6b:
LArrowBit=0;
// FuncBit=1;
break;
case 0x6c:
HomeBit=0;
// FuncBit=1;
break;
case 0x69:
EndBit=0;
// FuncBit=1;
break;
case 0x75:
UArrowBit=0;
// FuncBit=1;
break;
case 0x72:
DArrowBit=0;
// FuncBit=1;
break;
case 0x7d:
PageUpBit=0;
// FuncBit=1;
break;
case 0x7a:
PageDownBit=0;
// FuncBit=1;
break;
case 0x74:
RArrowBit=0;
// FuncBit=1;
break;
// case 0x4a:
// NumSlashBit=0;
// FuncBit=1;
// break;
// case 0x5a:
// EnterBit=0;
// FuncBit=1;
// break;
default:
extendbit=0;
// FuncBit=1;
break;
}
// KeyBdTrigger=1;
}
}
//
void put_kbbuff (unsigned char c)
{
if (buff_cnt < BUFF_SIZE)
{
*inptr=c; //put char into buffer
inptr++; // Increment pointer
buff_cnt++;
if (inptr >= KEYBDBUF + BUFF_SIZE) // pointer wrapping
inptr = KEYBDBUF;
//ON_OK_LED();
// while(1);
}
}
// Set Keyboard LED status
void SetKeyLED (unsigned char s)
{
char i=0;
KeyBdTrigger=FABit=AABit=EEBit=FEBit=0;
if (SendKeyData (0xed))
{
KeyBd_Init();
KeyBdTrigger=0;
delayms(10);
// while(!KeyBdTrigger);
i=SendKeyData(s);
KeyBdTrigger=0;
}
else
{
Display_Screen(KeyBoard_Err1);
delayms(1000);
Clear_Screen();
}
}
// Send Echo to keyboard
char SendEEcho(void)
{
if (SendKeyData (0xee))
{
KeyBdTrigger=0;
EX1=1;
while(!KeyBdTrigger);
KeyBdTrigger=EX1=0;
if (EEBit) return 1;
else return 0;
}
else
{
Display_Screen(KeyBoard_Err1);
delayms(1000);
Clear_Screen();
return 0;
}
}
//Send Data from HOST to Keyboard
/**************************************************/
char SendKeyData(unsigned char code_a)
{
unsigned char i,j;
Keyclkbit=0;
ParityBit=1;
KData=1;
KClock=1;
EX1=0;
EA=1;
ResendBit=0;
if (KClock)
{
KClock=0; // Start protocal
delay50us();
delay50us();
KData=0; // release DATA bus
delay20us();
KClock=1; //release CLOCK
delay20us();
IE1=0;
EX1=0;
Keyclkbit=0;
// while(!Keyclkbit);
for (i=0; i<3; i++)
{
for (j=0; j<255;j++)
{
if (!KClock) break;
delay10us();
}
if (!KClock) break;
}
if(!KClock)
{
// EX0=0; //disable external interrupt 0
// Keyclkbit=0;
for (i=0; i<8; i++)
{
if (code_a & 0x01)
{
KData=1;
ParityBit=~ParityBit;
}
else
{
KData=0;
}
code_a >>= 1;
while(!KClock);
delay10us();
while(KClock);
_nop_();
_nop_();
// delay10us();
}
if (ParityBit)KData=1;
else KData=0;
while(!KClock);
delay10us();
while(KClock);
_nop_();
KData=1;
while (!KClock);
delay10us();
while(KClock);
KData=1;
}
else ResendBit=1;
}
else
{
ResendBit=1;
}
EX1=IE1=0;
if (ResendBit)return 0;
else return 1;
}
/******************************************************/
/* generate a pulse in clock line */
/* ------ */
/* xxxxxx______| xxxxxx */
/******************************************************/
void Clkpulse(void)
{
delay20us(); /* transmit it. */
KClock=0;
delay20us(); /* transmit it. */
KClock=1;
}
// Get data from keyboard buffer query
unsigned char getkey (void)
{
unsigned char bytecnt;
KeyBd_Init();
KeyBdTrigger=0;
IE1=0;
EX1=1;
ET1=ET0=0;
while(!KeyBdTrigger); // && !FuncBit);
EX1=0;
Set_Cursor(4,15);
// bytecnt=KEYBDBUF[0];
DisplayNum(DebugValue);
while(StartPB);
return DebugValue;
}
/*
void delay50us(void)
{
int i;
for (i=0; i<9; i++);
}
void delay20us(void)
{
char i;
for (i=0; i<3; i++);
}
void delay10us(void)
{
char i;
for (i=0; i<1; i++);
} */
void delay50us(void)
{
delay20us();
delay20us();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void delay20us(void)
{
delay10us();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
/* _nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
*/}
void delay10us(void)
{
char i;
for (i=0; i<2 ;i++);
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -