zoukankan      html  css  js  c++  java
  • 基本输入输出系统BIOS---键盘输入

    基本输入输出系统BIOS概述

    硬盘操作系统DOS建立在BIOS的基础上,通过BIOS操纵硬件,例如DOS调用BIOS显示I/O程序完成输入显示,调用打印I/O完成打印输出

    通常应用程序应该调用DOS提供的系统功能完成输入输出或者其他操作,这样做不仅容易实现,而且对硬件依赖性最少,但是有时候DOS不提供某种服务,因此就不能利用DOS实现

    也就是说,BIOS比DOS更加接近于硬件

    键盘输入:

    键盘中断处理程序

    当用户按键时,键盘接口上会得到一个代表被按键的键盘的扫描码,同时产生一个中断请求,如果中断请求时允许的(中断屏蔽字的位1为0 )并且CPU处于开中断状态,那么CPU通常就会相应中断请求,由于键盘中断类型安排为9,所以CPU响应键盘中断,就是转入9号中断处理程序,我们把9号中断处理程序称为键盘中断处理程序

    键盘中断处理程序首先从键盘接口取得代表按键的扫描码,然后根据扫描码判定用户所按下的键盘并作出相应的处理 最后通知中断控制器中断结束并实现中断返回

    我们把键盘上简单地分成5种类型,字符键盘(字母,数字还有符号)功能键(如F1和pgup)控制键(CTRL,ALT和左右SHIFT)双态键盘(NUMlock,Caps lock)特殊请求键盘(print Screen)键盘中断处理程序对五种键盘的处理方法如下

    如果用户按下的是双态键盘,那么就设置标志位,在AT以后上档次的系统要求改变LED指示器的状态

     如果用户按下的是控制键,那么就设置有关标志位

    如果用户按下的是功能键,那么就根据键盘扫描吗和时候按下某些控制键如(ALT)确定系统扫描码把系统扫描码存入缓冲区,

    如果用户按下的是字符,那么就根据扫描码和ASCII一起存入键盘的缓冲区

    如果用户按下的是特殊请求键,那么就调用对应的中断进行处理

    缓冲区

    键盘缓冲区是一个  先进先出的环形队列,队列占用的内存区域如下

    buff_hade  dw  ?

    buff_tail dw  ?

    kb_buffer  dw  16 dup(?)

    buff_hade和BUff_tail是缓冲区的头指针和尾指针,这两个指针相等表示缓冲区为空,由于缓冲区本身长度为16个字,而存放一个键盘的扫描码和ASCII需要占用一个字,所以键盘缓冲区实际可以存放15个键的扫描码和ASCII,键盘的中断程序吧所按下的字符键或功能键的扫描码和ASCII依次存入缓冲区,如果缓冲区已经满了,那么发出嘟的一声

    键盘的I/O 程序

    键盘的I/O程序以16H号中断处理程序的形式出现,它属于软中断处理程序这一类,他的主要功能是进行键盘输入,在一般情况下面,系统程序和应用程序的键盘输入都是有他完成的,简单地键盘I/O程序从键盘缓冲区中取出所按下的ASCII码和扫描码返回给调用者

    键盘I/O的调用方法,调用键盘I/O功能,吧功能编号置入AH寄存器,然后发出中断指令INT  16H

    主要功能标号

    AH = 0,从键盘中读走一个字符,AL = ASCII,AH = 字符扫描码

    AH = 1,判断有无按键可读,ZF = 1,表示无按键可读,ZF = 0,表示有按键可读

    AH = 2,表示变换按键当前状态

    从键盘中读取一个字符

    MOV AH , 0
    INT 16H

    例题1:程序功能,;程序功能:写一个程序完成如下功能,读取键盘,并把所按的键显示出来,在检测到按下SHIFT的时候,就结束运行

     1 ;程序功能:写一个程序完成如下功能,读取键盘,并把所按的键显示出来,在检测到按下SHIFT的时候,就结束运行
     2 ;
     3 L_SHIFT = 00000010B    
     4 R_SHIFT = 00000001B
     5 CSEG            SEGMENT
     6                     ASSUME     CS:CSEG
     7 START:MOV     AH,2 ;取变换键状态字节
     8                 INT 16H
     9                 TEST AL,L_SHIFT+R_SHIFT ;判断是否按下SHIFT
    10                 JNZ OVER;
    11                 MOV AH,1;判断是否有按键按下
    12                 INT 16H;
    13                 JZ START;
    14                 MOV AH,0;有的话读取按键
    15                 INT 16H;
    16                 MOV DL,AL;显示所读按键
    17                 MOV AH,6;
    18                 INT 21H;
    19                 JMP START;
    20 OVER:MOV AH,1H
    21             INT 21H
    22             MOV AH,4CH
    23             INT 21H
    24 CSEG ENDS
    25             END START
    View Code

    首先,取变换键状态字节,进行判断是否按下了SHIFT,

    MOV  AH,2取变换键状态字节
    INT 16
    TEST AL,L_SHIFT+R_SHIFT JNZ OVER

    在调用0号功能之前,检测是否有按键可读

    MOV AH,1;判断时候有按键按下
    INT 16H
    JZ START

    如果有按键按下,读取键盘

    MOV AH,0
    INT 16H

    显示所读按键,调用显示功能

    MOV DL,AL
    MOV AH,6
    INT 21H
    JMP START 

    版权所有,转载请注明链接地址:http://www.cnblogs.com/fengdashen/p/3720733.html

  • 相关阅读:
    Go语言核心36讲(Go语言实战与应用九)学习笔记
    Go语言核心36讲(Go语言实战与应用六)学习笔记
    Go语言核心36讲(Go语言实战与应用二十一)学习笔记
    Go语言核心36讲(Go语言实战与应用十二)学习笔记
    Go语言核心36讲(Go语言实战与应用七)学习笔记
    Go语言核心36讲(Go语言实战与应用二十)学习笔记
    Go语言核心36讲(Go语言实战与应用二十四)学习笔记
    .NET 云原生架构师训练营(对象过程建模)学习笔记
    Go语言核心36讲(Go语言实战与应用二十二)学习笔记
    .NET 云原生架构师训练营(ASP .NET Core 整体概念推演)学习笔记
  • 原文地址:https://www.cnblogs.com/fengdashen/p/3720733.html
Copyright © 2011-2022 走看看