1.原理
当按键盘上任一键时,对键盘的扫描代码是两字节代码。扫描代码的低字节是按键的ASCII码,汉字则是由两个扫描代码组成,而高字节是键位代码。当按键是一般ASCII字符键时,从扫描代码的低字节中可以得到它们的ASCII代码值;当按键是汉字时,扫描代码的低字节小于零,两个扫描代码的低字节各自加上256便是汉字的ASCII代码。但是,当按键是特殊键时,扫描代码的低字节是零,此时必须使用高字节的键位代码判别它们。程序中调用ROM_BIOS的int16H 的0号功能把键盘扫描代码置入AX后返回,AX的值是int86()的返回值。如此便可以得到按键和汉字的ASCII代码值及特殊键的键位码。
2.程序清单
#include<stdio.h>
#include<dos.h>
char getkey(void);
void main()
{
int j1 = 0;
int j = 0;
union
{
int c;
char ch[2];
}cc;
do
{
printf("\n\n[请输入任意键或组合键或汉字]\n");
cc.c=getkey();
if(cc.ch[0]==0)
{
printf("计算机特殊键键位码:00-%d",cc.ch[1]);
}
else if(cc.ch[0]>0)
{
j++;
if(j==2)
{
putchar(j1);
putchar(cc.ch[0]+256);
printf("的ASCII码是%d",j1);
printf("和%d",cc.ch[0]+256);
printf("\n机器码是%x%x",j1,cc.ch[0]+256);
printf("\n区位码是%d%d",j1-160,cc.ch[0]+96);
j = 0;
}
else
{
j1 = cc.ch[0]+256;
}
}
else
{
printf("%c",cc.ch[0]);
printf("的ASCII码是%d",cc.ch[0]);
printf("\n机器码是%x",cc.ch[0]);
}
}while(cc.ch[0]!=27);
}
char getkey(void)
{
union REGS regs;
regs.h.ah = 0;
return int86(0x16,®s,®s);
}