📄 keyboard.asm
字号:
data segment
port equ 280H
b0 db 7fh,6fh,77h,7ch,39h,5ch,79h,71h
b1 db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h
b2 db 0,0,0,0,'R','P','M','G'
Scan_code db 0feh,0fdh,0fbh,0f7h,0efh,0dfh,0bfh,07fh
msg db 0dh,0ah,'input from keyboard:$'
data ends
code segment
assume cs:code,ds:data,es:data
main proc far
mov ax,data
mov ds,ax
lea dx,msg ;显示提示信息
mov AH,9 ;DOS 9号系统功能调用,输出字符串
int 21H
mov dx,port+3 ;初始化8255,使工作于方式0,A输入
mov al,10010000b
out dx,al
key_in: mov al,0 ;置PC0-PC2为低
mov dx,port+2
out dx,al
mov dx,port ;读PA口数据
in al,dx
cmp al,0ffh ;A口=0FFH?
je key_in ;相等说明无键按下,跳转到key_in
call qudou ;调用去抖动子程序
mov al,0feh
mov dx,port+2 ;PC口
out dx,al ;PC0置低电平
mov dx,port ;读PA口数据
in al,dx
lea bx,b0 ;扫描PC0行对应的列线
cmp al,0ffh ;A口=0FFH?
jne disp ;不相等说明有键按下,跳转到disp显示子程序
mov al,0fdh
mov dx,port+2 ;PC口
out dx,al ;PC1置低电平
mov dx,port ;读PA口数据
in al,dx
lea bx,b1 ;扫描PC1行对应的列线
cmp al,0ffh ;A口=0FFH?
jne disp ;不相等说明有键按下,跳转到disp显示子程序
mov al,0fbh
mov dx,port+2 ;PC口
out dx,al ;PC1置低电平
mov dx,port ;读PA口数据
in al,dx
lea bx,b2 ;扫描PC2行对应的列线
cmp al,0ffh ;A口=0FFH?
je key_in ;相等说明无键按下,跳转到key_in
cmp al,0dfh ;判断按键是否为'P'
je exit ;若是,则退出程序
disp: mov si,0
mov cx,8
push bx ;bx入栈保护
again: lea bx,Scan_code
cmp al,[bx][si]
je found ;相等标明找到相应的扫描码
inc si
loop again ;未找到则循环
jmp key_in ;循环结束仍未找到则跳转到key_in
found: pop bx ;bx出栈
mov al,20h ;选择一只数码管
mov dx,2b0h
out dx,al
mov dx,2b1h ;将七段显示值写入2b1h
mov al,[bx][si]
out dx,al
jmp key_in ;跳转到key_in
exit: mov ah,4ch
int 21h
main endp
qudou proc near ;去抖动子程序,延时10MS
mov ah,0ffh
d2: mov al,0ffh
d1: dec al
jnz d1
dec ah
jnz d2
ret
qudou endp
code ends
end main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -