免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1046 | 回复: 0
打印 上一主题 下一主题

键盘I/O基本应用1 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-01 10:43 |只看该作者 |倒序浏览

        这个星期时间安排得比较乱,参加这样那样的活动比平时多了一些,结果就是很多学习时间挪用了,接下来的工作就是将失去的补回来,
        不然心里感觉不爽,因为花费在linux内核这块的时间少了,这样可不是我想要的,如今发现,在进行内核学习的过程中,无论何时都不能间断对内核代码的阅读,如果一间断,那种感觉就会失去很多,当再次接触的时候,又需要一小段时间去寻找那种感觉,所以,在今后的学习中,应该注意的一点就是:内核代码或者是内核知识无论在何时都不能停顿,即使是一天一个小时也要去争取。这是这些天的一点反省,留着,把记忆留住。言归正传,前几天买了一本《80x86汇编语言程序设计》,在对其中的内容进行了一次学习,因为在进行linux内核块设备和字符设备驱动的学习中,遇到了很多硬件方面的知识,搞得一头雾水,后来发现,是自己在汇编硬件知识方面几乎就是空白的,所以需要充一下电。键盘I/O又是比较重要的,所以就做了一下笔记。                                       
BIOS和DOS中断
        在一些情况下,选择DOS中断或者是选择BIOS中断可以执行同样的功能。
        DOS和BIOS功能都通过软件中断调用。在中断调用前需要把功能号装入AH寄存器,把子功能号装入AL寄存器,除此之外,通常还需要在CPU寄存器中提供专门的调用参数。
        调用DOS或BIOS功能时,有以下几个基本步骤:
        1、将调用数装入指定的寄存器中;
        2、如需功能号,把它装入AH;
        3、如需字功能号,将它装入到AL;
        4、按中断号调用DOS或BIOS中断;
        5、检查返回参数是否正确。
       
                                        键盘
I/O
        键盘的三种基本类型的键:字符数字键、扩展功能键、和其他键组合使用的控制键。
        数字键盘给计算机提供一个ASCII码,而扩展功能则是产生一个动作。
        键盘和主机通过五芯电缆相连:电源线、地线、复位线以及键盘数据线和键盘时钟线。按键的识别使用行列扫描法,即根据对行线和列线的扫描结果来确定闭合键的位置,并通过键盘数据线将闭合键所对应的扫描码送往主机。
        DOS键盘功能调用
        单个字符输入
        键盘上的每个键都对应一个扫描码,从01到83,或者从01H到53H,所以根据扫描码就能唯一确定哪个键改变了状态。
        BIOS键盘中断
        类型16的中断提供了基本的键盘操作,它的中断处理程序包括3个不同的功能,分别格局AH的内容来选择:
        AH=0,从键盘读取一个字符,返回参数:AL=字符码,AH=扫描码
        AH=1,读键盘缓冲区的字符,返回参数:如果ZF=0,AL=字符码,AH=扫描码,如果ZF=1,缓冲区空。
        AH=2,取键盘状态字节,AL=键盘状态字节
        这里有个叫做KB_FLAG(键盘状态字节),各个位表示的状态即为键盘上所对应的键被操作的情况。
        DOS键盘中断
        与键盘输入有关的DOS
21H功能掉哦嗯,它包括将单字符读入AL和把一个字符串读入存储器等功能。
        AH=1,从键盘输入一个字符并回显在屏幕上,返回参数:AL=字符
        AH=6,读键盘字符,调用参数DL=0FFH,如果有字符可取,AL=字符,ZF=0,否则,AL=0,ZF=1
        AH=7,从键盘输入一个字符,不回显,AL=字符
        (这里的意思是:当AH=7,并使用中断操作INT
21H时,系统调用21H中断中的AH=7H所对应的功能,即从键盘键人一个字符,但是并不会显示在控制台,不像AH=1多对应的那样将字符显示到控制台,但是,此时AL是对应的输入的字符。)
        AH=8,从键盘输入一个字符,不回显,检测Ctrl_Break,AL=字符
        AH=A,输入字符到缓冲区,DS:DX=缓冲区首址
        AH=B,读键盘状态
,AL=0FFH有键人,AL=00无键人
        AH=C,清除键盘缓冲区,并调用一种键盘功能,AL=键盘功能号(1,6,7,8,A)
        如果要求程序能接收功能键或者是数字组合键必须进行两次DOS调用,第一次会送00,第二次会送扫描码。
        例如下面的一个汇编程序:
  1
       MOV     AH,7    //AH的值为07H
  2
       INT     21H        //调用21H中断中的07H功能
  3
       CMP     AL,0     //检查是否是功能键
  4
       JE      GET_EC     //是则进行功能键对应的处理
  5
       JMP     ERROR
  6
GET_EC: MOV     AH,7
  7
       INT     21H
  8
       CMP     AL,3BH
  9
       JE      OPTION1
10
       CMP     AL,3CH
11
       JE      OPTION2
12
       CMP     AL,3DH
13
       JE      OPTION3
14
       JMP     ERROR
        字符串输入
        21H中断的功能A能从键盘读入一串字符并把它存入用户定义的缓冲区中。缓冲区的第一个字节保存最大字符数。这个最大的字符数是由用户程序给出的。如果实际键人的字符数比此数大,微机就会发出声音,而且光标不再向右移动。由于缓冲区仅仅使用一个字节来表示,所以缓冲区的逻辑上限制为255字节。第二个字节是实际输入字符的个数,这个数据是由动能A填入的。之后,字符串就按照字节存入缓冲区,最后结束字符串的回车0DH还要占用一个字节,因此,这个缓冲区的字节空间应该为最大字符数加2。
        MAXLEN        DB        32
        ACTLEN        DB        ?
        STRING
        DB        32 DUP(?)
输入字符串程序
15
       mov     ax,@data
16
       mov     ds,ax
17
       lea     dx,user_string
18
       mov     ah,0ah
19
       int     21h
20
       sub     ch,ch
21
       mov     cl,user_string+1
22
       add     dx,2
23
exit:   
24
       mov     ax,4c00h
25
       int     21h
26
27
read_keys       endp
       
        清除键盘缓冲区
        INT
21H的功能0CH能清除键盘缓冲区,然后执行在AL中指定的功能,使用0CH功能可以使程序在输入一个字符之前,将以前键入的字符清除掉。
        检验键盘状态
        DOS
21H的功能0BH能检验一个键是否被按动,如果按下一个键,则在AL寄存器中放入0FFH,如果没有按下键,则在AL中放00,
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/73521/showart_1356341.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP