汇编实验 扩充键盘处理功能的程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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