目的:实现4×4矩阵键盘进行中断并返回信息(0~F)
使用芯片:8086、8259等
流程概述:按键按下后生成中断并扫描按键返回信息然后结束中断。
原理图:
汇编程序:
;====================================================================
; 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.
后话:该程序创作背景是微机的一次大作业,如有错误欢迎指正。