QB编程的相关知识-键盘

来自: 作者:

当在键盘上“按下”或“放开”一个键时,如果键盘中断是允许的(21H端口的第1位=0,如果你能操作21H,就可以封锁键盘硬盘等等设备),就会产生一个类型9的中断,并转入到BIOS的键盘中断处理程序:
从8255可编程外围接口芯片的输入端60H读取一个字节(其低7位是键的扫描码)
当按下时,最高位为0,称为通码;
当放开时,最高位为1,称为断码
如按下Esc键时产生一个通码为01H(000000
01B),放开Esc键时产生一个断码为81H(10000001B)。键盘上每一个键都对应一
个扫描码,从01(Esc)到83(Del),或从01H到53H,所以根据扫描码就可以判断用户对键盘的操作。然后BIOS16H中断会根据一个表来返回键的ASC码,这样就可以通过调用INT16H直接获得字符了无需与扫描码打交道了!在QB中的INKEY$语句实际上是调用了DOS中断INT21中的有关键盘功能。在键盘中SHIFT AIT CTRL 大小写转换等等这些功能建也可以通过中断调用来判断,用户在键盘上输入都保存在一个32个字节大小的键盘缓冲区里,地址在41:1E,我们可以来直接读也可以自己来模拟键盘的输入,比如一个获得密码的功能

通过上面的知识,我们自己写段程序来观察键盘扫描码
CLS
DO
Keys = INP(&H60) '从60H端口获得键盘状态
LOCATE 4, 12: PRINT HEX$(KeyS);" " '用16进制方式显示扫描码
LOOP UNTIL INKEY$=CHR$(27) '当按下ESDC键的时候就退出

下面是我找到的键盘标志位的资料
键盘上的大小写建SHIFT ALT CTRL....等等这样的功能建在内存41:17中
bit0=1:按下右移键Right Shift
bit1=1:按下左移键Left Shift
bit2=1:按下控制键Ctrl
bit3=1:按下交替键Alt
bit4=1:Scroll Lock状态已变换
bit5=1:Num Lock状态已变换
bit6=1:Caps Lock状态已变换
bit7=1:Insert状态已变
根据以上的资料,我们可以来读取键盘的状态(简介,详细的自己写)
DEF SEG = &H40 '定义段址到40H
DO
keyshift = PEEK(&H17)'在偏移地址中取键盘状态
keyshift = keyshift AND &H3
SELECT CASE keyshift
CASE 1
DispTxt$ = "你按下了右SHIFT键"
CASE 2
DispTxt$ = "你按下了左SHIFT键"
END SELECT
LOCATE 10, 10: PRINT DispTxt$, keyshift
LOOP UNTIL INKEY$ = CHR$(27)
DEF SEG '恢复段址

当然我们也可以自己编程来打开大小写转换键,小键盘上的数字转换键等等...
程序如下
DEF SEG = &H40 '定义段址到40H
'打开大写键:注意看键盘上的Caps LockK灯会亮
POKE &H17, &H40 '&h40 是16进制,换成2进制就是0100 0000,也就是第6位为1
LOCATE 10,5:PRINT "按任意键继续,关闭大写键,打开数字键"
WHILE INKEY$ = "": WEND
'打开Num Lock键,.....灯亮
POKE &H17, &H20 '&h20 换成2进制就是0010 0000,也就是第5位为1
DEF SEG
大家看看资料,再体会实际中编程,这样非常有意思!