编写自己的键盘控制函数!
有的时候TC提供的屏幕输出函数并不能满足我们的实际需要比如我们需要一个输入字符后按下回车不换行
在图行模式按下某个键后显示自定义字符或图形 类似五子棋游戏中棋子移动问题等等.这就需要我们编写自己的屏幕输出函数和键盘控制函数而编写这样的函数需要读取键盘扫描码!
每个按键都对应一个唯一的扫描码来用于程序识别这个按键!但有些按键没有扫描码原因是它直接引起中断调用中断程序.
怎样获得扫描码以确定那个键被按下?:一是直接使用 Turbo C 提供
的键盘操作函数 bioskey()来识别,二是通过int86()函数,调用 BIOS
的 INT 16H,功能号为 0 的中断。它将按键的扫描码存放在 Ax 寄存器的高字节中。
下面介绍bioskey()函数的用法! bioskey()的原型为:
int bioskey(int cmd);
它在 bios.h 头文件中进行了说明,参数 cmd 用来确定 bioskey()如何操作:
操作
cmd
bioskey()返回按健的键值,该值是 2 个字节的整型数。若没有键按下,则该函数一
0
直等待,直到有键按下。当按下时,若返回值的低 8 位为非零,则表示为普通键,
其值代表该键的 ASCII 码。若返回值的低 8 位为 0,则高 8 位表示为扩展的 ASCII
码,表示按下的是特殊功能键。
bioskey()查询是否有键按下。若返回非 0 值,则表示有键按下,若为 0 表示没键按
1
下。
按过的状态由该函数返回的低 8 位的各位
2 bioskey()将返回一些控制键是否被按过,
值来表示:
字节位 对应的 16 进制数 含义
右边的 shift 键被按下
0 0x01
左边的 shift 键被按下
1 0x02
Ctrl 键被按下
2 0x04
Alt 键被按下
3 0x08
Scroll Lock 已打开
4 0x10
Num Lock 已打开
5 0x20
Caps Lock 已打开
6 0x40
Inset 已打开
7 0x80
当某位为 l 时,表示相应的键已按,或相应的控制功能已有效,如选参数 cmd 为 2,
若 key 值为 0x09,则表示右边的 shift 键被按,同时又按了 Alt 键。
其实bilskey()就是通过调用int86()来实现的!也需bilskey()就是int86()的宏定义有兴趣的朋友可以自 己查下相关资料
int int86(int intr_num,union REGS *inregs,union REGS *outregs);
这个函数在 bios.h 头文件中进行了说明,它的第一个参数 intr_num 表示 BIOS 调用类型
号,相当于 int n 调用的中断类型号 n,第二个参数表示是指向联合类型 REGS 的指针,它
用于接收调用的功能号及其它一些指定的入口参数, 以便传给相应的寄存器, 第三个参数也
是一个指向联合类型 REGS 的指针,它用于接收功能调用后的返回值,即出口参数,如调
用的结果,状态信息,这些值从相关寄存器中得到。
下面举个bioskey()应用的例子:
#include "Stdio.h"
#include "Conio.h"
#include <stdlib.h>
int main(void)
}
}
下面是我自己读取的键盘扫描码
小写字母
a=0x1e61
b=0x3062
c=0x2e63
d=0x2064
e=0x1265
f=0x2166
g=0x2267
h=0x2368
i=0x1769
j=0x246a
k=0x256b
l=0x266c
m=0x326d
n=0x316e
o=0x186f
p=0x1970
q=0x1071
r=0x1372
s=0x1f73
t=0x1474
u=0x1675
v=0x2f76
w=0x1177
x=0x2d78
y=0x1579
z=0x2c7a
大写字母
A=0x1e41
B=0x3042
C=0x2e43
D=0x2044
E=0x1245
F=0x2146
G=0x2247
H=0x2348
I=0x1749
J=0x244a
K=0x256b
L=0x264c
M=0x324d
N=0x314e
O=0x184f
P=0x1950
Q=0x1051
R=0x1352
S=0x1f53
T=0x1454
U=0x1655
V=0x2f56
W=0x1157
X=0x2d58
Y=0x1559
Z=0x2c5a
主键区数字
1=0x231
2=0x332
3=0x433
4=0x534
5=0x635
6=0x736
7=0x837
8=0x938
9=0xa39
0=0xb30
主键区shift+数字键字符
!=0x221
@=0x340
#=0x423
$=0x524
%=0x625
^=0x75e
&=0x826
*=0x92a
(=0xa28
)=0xb29
其他字符
`=0x2960
~=0x297e
_=0xc5f
+=0xd2b
|=0x2b7c
-=0xc2d
==0xd3d
\=0x2b5c
[=0x1a5b
]=0x1b5d
;=0x273b
'=0x2827
,=0x332c
.=0x342e
/=0x352f
=0x1b7d
:=0x273a
"=0x2822
<=0x333c
>=0x343e
?=0x353f
F1=0x3b00
F2=0x3c00
F3=0x3d00
F4=0x3e00
F5=0x3f00
F6=0x4000
F7=0x4100
F8=0x4200
F9=0x4300
F10=0x4400
F11=读不出
F12=读不出
shift+F1-F10
shift+F1=0x5400
shift+F2=0x5500
shift+F3=0x5600
shift+F4=0x5700
shift+F5=0x5800
shift+F6=0x5900
shift+F7=0x5a00
shift+F8=0x5b00
shift+F9=0x5c00
shift+F10=0x5d00
主键区功能键
ESC=0x11b
TAB=0xf09
CAPS LOCK=读不出
左shift=读不出
右shift=读不出
左ctrl=读不出
右ctrl=读不出
左alt=读不出
右alt=读不出
空格=0x3920
←退格=0xe08
回车=0x1c0d
小键盘区
/=0x352f
*=0x372a
-=0x4a2d
+=0x4e25
回车=0x1c0d
.=0x532e
0=0x5230
1=0x4f31
2=0x5032
3=0x5133
4=0x4b34
5=0x4c35
6=0x4d36
7=0x4737
8=0x4838
9=0x4939
中间键区
←=0x4b00
→=0x4d00
↑=0x4800
↓=0x5000
Delete=0x5300
End=0x4f00
pageDown=0x5100
Insert=0x5200
Home=0x4700
Pageup=0x4900