汇编网首页登录博客注册
masmaster的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
文章收藏

[2010-07-23 12:50] 键盘是如何工作的

BIOS调用int 16h来处理来自键盘的输入。BIOS int 16h不允许重定向。但是在读键时更容易一回,每个扩展键都会产生一个8位的扫描码,对于IBM极其兼容机而言, 每个键的扫描码都是唯一的, 所有的按键都产生扫描码。标准化的ASCII码几乎在所有的计算机上都是相同的。

按键之后会发生一系列事件,这些事件从键盘控制芯片开始直到字符被放入键盘输入缓冲区的数组中结束。键盘缓冲区在任何时刻最多可容纳15次击键,每次击键都会产生两字节的数据(ASCII+SCANCODE)。当用户按下一个键时会产生下面一系列事件:
1,键盘控制器芯片向PC的键盘输入端口发送一个8位扫描码
2,输入端口引发一个中断,中断是预定义的信号。用于通知CPU的一个输入输出设备需要引起注意。CPU通过执行int 9h服务例程响应键盘中断。
3,int 9h 中断服务例程从输入输出获取键盘的扫描码并查找按键对应的ASCII码。如果按键有对应的ASCII码,int 9h例程就把ASCII码和扫描码一起插入到键盘缓冲区。如果按键的扫描码没有对应的ASCII码,键盘缓冲区的ASCII码就设为0。见图:
;----------------------------------------------------
【键     盘】
      |scancode
      V
【输入 端口】
      |scancode
      V
【int 9h中断例程】
      |scancode
      |ascii
      V            ascii
【键盘输入缓冲区】-------->【int 21h中断例程】
      |scancode
      |ascii
      V
【int 16h中断例程】  
------------------------------------------------------
一旦按键的扫描码和ascii码被放到了缓冲区,他们一直就保存在那里,直到被当前运行的程序取出为止。 有两种方法取出按键:
1,调用BIOS int 16h的功能,从键盘缓冲区中取得按键的扫描码和ascii码
2,调用DOS int 21h的功能,从输入缓冲区中取得按键的ascii码,如果按下的是扩展键,就必须第二次调用int 21h返回扫描码。
评论次数(0)  |  浏览次数(1028)  |  类型(汇编语言笔记) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码