




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验六 扩充键盘处理功能的程序一、 实验的目的与要求(一)实验目的:掌握中断的概念以及中断服务程序的编写(二)实验要求:完成键盘处理基本功能的基础上,增加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 0bufpt2 dw 0kbflag db 0kbflag1 db 0prompt db -kbd_io program begin-,0dh,0ah,$scantab db 0,0,-=,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)evenoldcs9 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 foreverendint: mov dx,oldip9 mov ax,oldcs9 mov ds,ax mov al,09h mov ah,25h int 21h ; retstart endp;-检测并等待键盘中断kbget proc near push bx cli ;关中断 mov bx,bufpt1 cmp bx,bufpt2 jnz kbget2 cmp kbflag,0 jnz kbget3 sti ;开中断 pop bx jmp kbgetkbget2: mov al,buffer+bx inc bx cmp bx,16 jc kbget3 mov bx,0kbget3: mov bufpt1,bx pop bx retkbget 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 shift1shift5: cmp al,36h ;判断是否为右Shift键 jnz shift2 cmp kbflag1,1 jz shift1 mov kbflag1,1 jmp shift1shift2: cmp kbflag1,1 jnz shift3 lea bx,shiftab ;shifttab换码 xlat ;(AL)-(BX)+(AL) jmp shift4shift3: lea bx,scantab ;santab换码 xlat ;(AL)-(BX)+(AL)shift4: cmp al,0 ;判断是否为其他控制符 jnz kbint4 mov kbflag,80h ;置退出标志 jmp kbint2kbint4: mov bx,bufpt2 mov buffer+bx,al inc bx cmp bx,16 jc kbint3 mov bx,0kbint3: cmp bx,bufpt1; empty? jz kbint2 mov bufpt2,bxkbint2: cmp al,0aah ;判断左shift键是否松开 jnz shift6 mov kbflag1,0shift6: cmp al,0b6h ;判断右shift键是否松开 jnz shift1 mov kbflag1,0shift1: cli ;关中断 mov al,20h ;结束键盘中断 out 20h,al pop ax pop bx sti ;开中断 iretkbint endp;-BIOS调用,显示字符dispchar proc near push bx mov bx,0 mov ah,0eh int 10h pop bx retdispchar endp;-code ends;* end start五、实验总结 本次实验涉及到了中断,但实验是在示例3.6的基础上修改的,没有自己编写独立的中断服
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论