汇编实验 扩充键盘处理功能的程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验六扩充键盘处理功能的程序

一、实验的目的与要求

(一)实验目的:掌握中断的概念以及中断服务程序的编写

(二)实验要求:完成键盘处理基本功能的基础上,增加left_shift 和right_shift键的功能。要求实现左右SHIFT任何一个键处于按下状态时输入字符为键盘的上档字符或大写字母,否则输出数字或小写字母。

二、实验正文

实验分析:本次实验要求在示例3.6的基础上,添加功能,关于left_shift和right_shift 可以通过它们各自的扫描码进行判断,此外还应该设置标志变量便于程序的判断,较示例的程序除了要添加判断是否为shift键外,还应该再设置一张shifttab转换表,这样当shift被按下时,应由这样转换表进行转换,而其他情况下由,scantab转换表转换。在读入信息时候需要在不同的端口读入信息并判断,通过检测状态和数据作出正确的操作。

四、流程图如下

四、实验结果

附录:程序源代码如下:

;******************************************************* stack segment

db 256 dup(0)

stack ends

;******************************************************

data segment

buffer db 16h dup(0)

bufpt1 dw 0

bufpt2 dw 0

kbflag db 0

kbflag1 db 0

prompt db '---kbd_io program begin---',0dh,0ah,'$'

scantab db 0,0,'1234567890-=',8,0

db 'qwertyuiop[]',0dh,0

db 'asdfghjkl',3bh,27h,0,0,0

db 'zxcvbnm,./',0,0,0

db ' ',0,0,0,0,0,0,0,0,0,0,0,0,0

db '789-456+1230.'

shiftab db 0,0,'!@#$%^&*()_+',0,0

db 'QWERTYUIOP{}',0DH,0

db 'ASDFGHJKL:"',0,0,0

db 'ZXCVBNM<>?',0,0,0

db ' ',26 dup(0)

even

oldcs9 dw ?

oldip9 dw ?

data ends

;****************************************************

code segment

;----------------------------------------------------

start proc far

assume cs:code,ds:data

push ds

mov ax,0

push ax

mov ax,data

mov ds,ax

;

cli ;开中断

mov al,09 ;中断类型号

mov ah,35h ;DOS调用,取中断向量

int 21h

mov oldcs9,es ;ES:BX=中断向量

mov oldip9,bx

;

push ds

mov dx,offset kbint

mov ax,seg kbint

mov ds,ax ;DS:DX=中断向量

mov al,09 ;中断类型号

mov ah,25h ;DOS调用,设置中断向量

int 21h

pop ds

;

in al,21h

and al,0fdh ;设置中断屏蔽字,只允许键盘中断

out 21h,al

;

mov dx,offset prompt

mov ah,9

int 21h

sti ;开中断

forever:

call kbget

test kbflag,80h

jnz endint

push ax

call dispchar

pop ax

cmp al,0dh

jnz forever

mov al,0ah

call dispchar

jmp forever

endint:

mov dx,oldip9

mov ax,oldcs9

mov ds,ax

mov al,09h

mov ah,25h

int 21h

;

ret

start endp

;----------------------------------------------------------检测并等待键盘中断

kbget proc near

push bx

cli ;关中断

mov bx,bufpt1

cmp bx,bufpt2

jnz kbget2

cmp kbflag,0

jnz kbget3

sti ;开中断

pop bx

jmp kbget

kbget2:

mov al,[buffer+bx]

inc bx

cmp bx,16

jc kbget3

mov bx,0

kbget3:

mov bufpt1,bx

pop bx

ret

kbget endp

;-----------------------------------------------------------------------键盘中断程序

kbint proc far

push bx

push ax

;

in al,60h ;从PA口读扫描码

push ax

in al,61h ;从PB口读信息

or al,80h

out 61h,al ;置键盘应答位

and al,7fh

out 61h,al ;复位键盘应答位

;

pop ax

test al,80h ;检测AL第8位是否为1,判断键位是按下(1)还是放开

jnz kbint2

;

cmp al,2ah ;判断是否为左Shift键

jnz shift5

cmp kbflag1,1

jz shift1

mov kbflag1,1 ;标志位置1

jmp shift1

相关文档
最新文档