📄 key.asm
字号:
pa55 equ 0dc00h-200h+218h
pb55 equ 0dc00h-200h+219h
p55ctl equ 0dc00h-200h+21bh
data segment
d1 db 'please press the keyboard:$'
d2 db 'you press :$'
table dw 0fefeh,'c' ;书P150页有此定义
dw 0fefdh,'d' ;数字代表小键盘的地址??
dw 0fefbh,'e'
dw 0fef7h,'f'
dw 0feefh,'b'
dw 0fedfh,'a'
dw 0febfh,'9'
dw 0fe7fh,'8'
dw 0fdfeh,'4'
dw 0fdfdh,'5'
dw 0fdfbh,'6'
dw 0fdf7h,'7'
dw 0fdefh,'3'
dw 0fddfh,'2'
dw 0fdbfh,'1'
dw 0fd7fh,'0'
dw 0fbefh,'r'
dw 0fbdfh,'p'
dw 0fbbfh,'m'
dw 0fb7fh,'g'
data ends
code segment
assume ds:data,cs:code
start: mov ax,data
mov ds,ax
;九号功能调用,显示字符串please press the keyboard:
lea dx,d1
mov ah,9
int 21h
;loop1:
; mov ah,01h
; int 21h
; cmp al,30h
; jz aa
; jmp loop0
;aa:
; jmp next
loop1:
;置8255控制字,A输出,B输入
mov al,10000010b
mov dx,p55ctl
out dx,al
mov al,0 ;A口都输出低电平
mov dx,pa55 ;PA55
out dx,al
mov dx,pb55 ;PB55
in al,dx ;从B口读入状态
cmp al,0ffh ;列线都是高电平么
jz loop1 ;是则继续等待
call delay ;不是则抖动
push ax ;保存列值
push ax
;置8255控制字,A输入,B输出
mov al,10010000b
mov dx,p55ctl
out dx,al
mov dx,pb55 ;PB55,AX出栈,往B口输出保存的列值
pop ax
out dx,al
;??保存列值
mov dx,pa55 ;PA55,从A口读入行值
in al,dx
pop dx
mov ah,dl ;al行值,ah列值,??是否为dl??
lea si,table
mov cx,20
loop2:
cmp ax,[si] ;什么和什么比较??
jz ts
add si,4
loop loop2
jmp loop1
ts: ;显示you press :
lea dx,d2
mov ah,9
int 21h
;显示字符
mov ah,2
mov dl,[si+2] ;因为字符是字型的
int 21h
;置8255控制字,A输出,B输入
mov al,10000010b
mov dx,p55ctl
out dx,al
loop3: ;A口输出低电平
mov dx,pa55
mov al,0
out dx,al
;B口读入数据
mov dx,pb55
in al,dx
cmp al,0ffh ;键是否都释放了?
jnz loop3
next: mov ah,4ch
int 21h
delay proc near ;延时20s抖动
push ax
push bx
push cx
push dx
mov cx,4000
loop4:
loop loop4
pop dx
pop cx
pop bx
pop ax
ret
delay endp
code ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -