📄 ps2key.c
字号:
#include <reg52.h>
/*
----------------------------------------------------------------------------------------------
函数名:KeyBoard_Init(void)
功能: 键盘初始化程序
输入:
调用:
返回:
说明:
----------------------------------------------------------------------------------------------
*/
void KeyBoard_Init(void)
{
IT1=1;
EX1=1;
EA=1;
}
/*
-----------------------------------------------------------------------------------------------
函数名:Keyboard_out(void) interrupt 2
功能: 键盘中断程序,读取按键值
输入:
调用:
返回:
说明: 程序要求完全在中断程序中执行,所以不能用于需要实时要求的场合;
-----------------------------------------------------------------------------------------------
*/
/*
void Keyboard_out(void) interrupt 2
{
unsigned char i=0;
unsigned char j=0;
unsigned char key=0;
EX1=0;
do{
do{
while(Key_CLK);
key>>=1;
if(Key_Data)key|=0x80;
i++;
while(!Key_CLK);
}
while(i<9);
i=0;
while(Key_CLK);
while(!Key_CLK);
while(Key_CLK);
while(!Key_CLK);
while(!Key_Data);
key_value[j]=key;
j++;
}
while(j>2);
BF=1;
EX1=1;
}
*/
code unsigned char ASSIC2_1[61][2]=
{
0X15,'q',
0x16,'1',
0x1a,'z',
0x1b,'s',
0x1c,'a',
0x1d,'w',
0x1e,'2',
0x21,'c',
0x22,'x',
0x23,'d',
0x24,'e',
0x25,'4',
0x26,'3',
0x29,' ',
0x2a,'v',
0x2b,'f',
0x2c,'t',
0x2d,'r',
0x2e,'5',
0x31,'n',
0x32,'b',
0x33,'h',
0x34,'g',
0x35,'y',
0x36,'6',
0x3a,'m',
0x3b,'j',
0x3c,'u',
0x3d,'7',
0x3e,'8',
0x41,',',
0x42,'k',
0x43,'i',
0x44,'o',
0x45,'0',
0x46,'9',
0x49,'.',
0x4a,'/',
0x4b,'l',
0x4c,':',
0x4d,'p',
0x4e,'-',
0x52,'\'',
0x54,'[',
0x55,'=',
0x5b,']',
0x5d,'\\',
0x69,'1',
0x6b,'4',
0x6c,'7',
0x70,'0',
0x71,'.',
0x72,'2',
0x73,'5',
0x74,'6',
0x75,'8',
0x79,'+',
0x7a,'3',
0x7b,'-',
0x7c,'*',
0x7d,'9'
};
code unsigned char ASSIC2_2[61][2]=
{
0X15,'Q',
0x16,'1',
0x1a,'Z',
0x1b,'S',
0x1c,'A',
0x1d,'W',
0x1e,'2',
0x21,'C',
0x22,'X',
0x23,'D',
0x24,'E',
0x25,'4',
0x26,'3',
0x29,' ',
0x2a,'V',
0x2b,'F',
0x2c,'T',
0x2d,'R',
0x2e,'5',
0x31,'N',
0x32,'B',
0x33,'H',
0x34,'G',
0x35,'Y',
0x36,'6',
0x3a,'M',
0x3b,'J',
0x3c,'U',
0x3d,'7',
0x3e,'8',
0x41,',',
0x42,'K',
0x43,'I',
0x44,'O',
0x45,'0',
0x46,'9',
0x49,'.',
0x4a,'/',
0x4b,'l',
0x4c,':',
0x4d,'P',
0x4e,'-',
0x52,'\'',
0x54,'[',
0x55,'=',
0x5b,']',
0x5d,'\\',
0x69,'1',
0x6b,'4',
0x6c,'7',
0x70,'0',
0x71,'.',
0x72,'2',
0x73,'5',
0x74,'6',
0x75,'8',
0x79,'+',
0x7a,'3',
0x7b,'-',
0x7c,'*',
0x7d,'9'
};
/*
----------------------------------------------------------------------------------------------
函数名:Decode(unsigned char index)
功能: 按键查表函数
输入:
index:
按键索引;
调用:
返回:
assic2:
标准ASSIC2码输出;
说明:
本程序采用了2分法来实行查找,先将PS/2的通码进行排序,
然后作成一张标准表,最后进行查表。
----------------------------------------------------------------------------------------------
*/
unsigned char Decode(unsigned char index)
{
unsigned char assic2=0; //返回值
unsigned char comp0=0; //地址0.1.2
unsigned char comp1=0;
unsigned char comp2=61;
if((index>0x7d)|(index<0x15))return assic2=' ';
if(index==ASSIC2_1[comp0][0]){
return (assic2=ASSIC2_1[comp0][1]); //判别是否为低地址的值
}
if(index==ASSIC2_1[comp2][0]){
return (assic2=ASSIC2_1[comp2][1]); //判别是否为高地址的值
}
do{
comp1=(comp2+comp0)/2; //2分
if(index==ASSIC2_1[comp1][0]){
return (assic2=ASSIC2_1[comp1][1]); //相等判别
}
else if(index>ASSIC2_1[comp1][0]){ //高,将当前值送低
comp0=comp1;
}
else comp2=comp1; //低
if(comp0==comp2)return assic2=' '; //无
if((comp2-comp0)==1){
if(index==ASSIC2_1[comp2][0]){
return(assic2=ASSIC2_1[comp2][1]);
}
comp1=comp2;
}
}
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -