《2022年2022年汇编实验扩充键盘处理功能的程序 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年汇编实验扩充键盘处理功能的程序 .pdf(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1 实验六扩充键盘处理功能的程序一、 实验的目的与要求(一)实验目的:掌握中断的概念以及中断服务程序的编写(二)实验要求:完成键盘处理基本功能的基础上,增加left_shift 和 right_shift 键的功能。要求实现左右SHIFT任何一个键处于按下状态时输入字符为键盘的上档字符或大写字母,否则输出数字或小写字母。二、实验正文实验分析:本次实验要求在示例3.6 的基础上,添加功能,关于left_shift 和 right_shift可以通过它们各自的扫描码进行判断,此外还应该设置标志变量便于程序的判断,较示例的程序除了要添加判断是否为shift 键外,还应该再设置一张shifttab 转
2、换表,这样当shift 被按下时,应由这样转换表进行转换,而其他情况下由,scantab 转换表转换。在读入信息时候需要在不同的端口读入信息并判断,通过检测状态和数据作出正确的操作。四、流程图如下名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 7 页 - - - - - - - - - 2 四、实验结果名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共
3、7 页 - - - - - - - - - 3 附录:程序源代码如下:;* 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
4、,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 ; c
5、li ;开中断mov al,09 ;中断类型号mov ah,35h ;DOS调用,取中断向量int 21h mov oldcs9,es ;ES:BX= 中断向量名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 7 页 - - - - - - - - - 4 mov oldip9,bx ; push ds mov dx,offset kbint mov ax,seg kbint mov ds,ax ;DS:DX=中断向量mov al,09 ;中断类型号mov ah,25h ;
6、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 mo
7、v ds,ax mov al,09h mov ah,25h int 21h ; ret start endp ;- 检测并等待键盘中断kbget proc near push bx 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 7 页 - - - - - - - - - 5 cli ;关中断mov bx,bufpt1 cmp bx,bufpt2 jnz kbget2 cmp kbflag,0 jnz kbget3 sti ;开中断pop bx jmp kbget kbg
8、et2: 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)还是放开j
9、nz kbint2 ; cmp al,2ah ;判断是否为左Shift 键jnz shift5 cmp kbflag1,1 jz shift1 mov kbflag1,1 ;标志位置1 jmp shift1 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 7 页 - - - - - - - - - 6 shift5: cmp al,36h ;判断是否为右Shift 键jnz shift2 cmp kbflag1,1 jz shift1 mov kbflag1,1 jmp
10、shift1 shift2: cmp kbflag1,1 jnz shift3 lea bx,shiftab ;shifttab 换码xlat ;(AL)-(BX)+(AL) jmp shift4 shift3: lea bx,scantab ;santab 换码xlat ;(AL)-(BX)+(AL) shift4: cmp al,0 ;判断是否为其他控制符jnz kbint4 mov kbflag,80h ;置退出标志jmp kbint2 kbint4: mov bx,bufpt2 mov buffer+bx,al inc bx cmp bx,16 jc kbint3 mov bx,0 k
11、bint3: cmp bx,bufpt1; empty? jz kbint2 mov bufpt2,bx kbint2: cmp al,0aah ;判断左 shift 键是否松开jnz shift6 mov kbflag1,0 shift6: cmp al,0b6h ;判断右 shift 键是否松开jnz shift1 mov kbflag1,0 shift1: cli ;关中断mov al,20h ;结束键盘中断out 20h,al 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第
12、6 页,共 7 页 - - - - - - - - - 7 pop ax pop bx sti ;开中断iret kbint endp ;-BIOS 调用,显示字符dispchar proc near push bx mov bx,0 mov ah,0eh int 10h pop bx ret dispchar endp ;- code ends ;* end start 五、实验总结本次实验涉及到了中断,但实验是在示例3.6 的基础上修改的,没有自己编写独立的中断服务程序, 而在修改过程中自己也收获很多,比如设置自己的中断程序的方法先要取出中断向量, 然后保存起来, 在设置自己的中断向量地址,程序结束时还好记得恢复原来的中断向量,这是很必要的, 如果不恢复会造成很严重的后果。此外还应引起注意的在何时应该开中断,在何时应该关中断,这对中断处理程序来说是相当重要的。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 7 页 - - - - - - - - -