在Proteus中仿真4×4矩阵键盘的中断

目的:实现4×4矩阵键盘进行中断并返回信息(0~F)
使用芯片:8086、8259等
流程概述:按键按下后生成中断并扫描按键返回信息然后结束中断。
原理图:
在Proteus中仿真4×4矩阵键盘的中断_第1张图片
汇编程序:

;====================================================================
; Author: Lin
;====================================================================
stack 	segment stack 'stack'
        dw 32 dup(0)
stack 	ends
data 	segment
KEYTAB 	DB 7EH,7DH,0BDH,0DDH,7BH,0BBH,0DBH,77H,0B7H,0D7H,0E7H,0EBH,0EDH,0EEH,0DEH,0BEH  ;键盘编码
NUM  	DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH,0F7H,0FCH,0B9H,0DEH,0F9H,71H  ;七段数码管编码
data 	ends
code  	segment
start 	proc far
 	assume ss: stack,cs: code,ds: data
 	push ds
 	sub ax,ax
 	push ax
 	mov ax,data
 	mov ds,ax
 	MOV AL,89H  		;初始化8255
 	OUT 06H,AL
 	CLI   			;初始化8259
 	MOV AL,13H  		;边沿触发、单独使用,设置IC4
 	OUT 0F0H,AL
 	MOV AL,0F0H  		;中断类型码F0~F8
 	OUT 0F2H,AL
 	MOV AL,0FH  		;全嵌套、缓冲、自动结束
 	OUT 0F2H,AL
 	SUB AX,AX  		;中断服务程序装入
 	MOV ES,AX
 	MOV AX,OFFSET INTA 
 	MOV ES:3C0H,AX
 	MOV AX,SEG INTA
 	MOV ES:3C2H,AX
 	MOV AL,38H  		;起始显示"L"
 	OUT 00H,AL
 	STI
LOP0: 	MOV AL,0  		;PB置零等待下一次中断
 	OUT 02H,AL
 	JMP LOP0
INTA: 	MOV AL,0FFH  		;屏蔽所有中断
 	OUT 0F2H,AL
LOP1: 	MOV AL,0  		;检测全键盘
 	OUT 02H,AL
 	IN AL,04H
 	AND AL,0F0H
 	CMP AL,0F0H
 	JE LOP1
 	MOV BX,0
 	MOV AH,77H
LOP2: 	MOV AL,AH  		;行检测
 	OUT 02H,AL
 	IN AL,04H
 	AND AL,0F0H
 	CMP AL,0F0H
 	JNE LOP3  		;有键闭合跳出
 	ROR AH,1
 	JMP LOP2  		;无键闭合检测下一行
LOP3: 	AND AH,0FH
 	OR AL,AH  		;闭合键列行值
LOP4: 	CMP AL,KEYTAB[BX] 	;键盘编码转换为十六进制数
 	JE LOP5
 	INC BX
 	JMP LOP4
LOP5: 	MOV AL,NUM[BX]
 	OUT 00H,AL
 	MOV AL,0FEH  		;恢复IR0的中断
 	OUT 0F2H,AL
 	iret
start 	endp
code  	ends
 	end start
 	

参考文献:
[1] 郑学坚,朱定华.微型计算机原理及应用.北京:清华大学出版社,2013.

后话:该程序创作背景是微机的一次大作业,如有错误欢迎指正。

在Proteus中仿真4×4矩阵键盘的中断_第2张图片

你可能感兴趣的:(笔记,作业,经验分享)