|
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 大家看看资料,再体会实际中编程,这样非常有意思! |
|