📄 pckey.asm
字号:
pa55 equ 218h ;A口地址
pb55 equ 219h ;B口地址
p55ctl equ 21bh ;控制口地址
;
data segment
table dw 0101h,0102h,0104h,0108h,0110h,0120h,0140h,0180h
dw 0201h,0202h,0204h,0208h,0210h,0220h,0240h,0280h
dw 0401h,0402h,0404h,0408h,0410h,0420h,0440h,0480h
char db 'CDEFBA9845673210 RPMG'
mes db 'PLAY ANY KEY IN THE SMALL KEYBOARD! ',0ah,0dh
db 'IT WILL BE ON THE SCREEN! END WITH R',0ah,0dh,'$'
data ends
;
code segment
main proc far
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
mov dx,offset mes
mov ah,09
int 21h
ky: call key ;调键盘子程序,在(dl)中,并显示
cmp dl,'R'
jnz ky
mov ax,4c00h ;'R' 返回dos
int 21h
ret
main endp
;
key proc near
kst: mov al,82h ;设8255命令字
mov dx,p55ctl ;A口输出,B口输入
out dx,al
wait1: mov al,00
mov dx,pa55
out dx,al ;A口输出00
mov dx,pb55
in al,dx ;读入列值
cmp al,0ffh
jz wait1 ;无键等待
push ax ;存列值
push ax
mov cx,1000h ;延时
dly: loop dly
mov dx,p55ctl
mov al,90h ;设8255命令字
out dx,al ;A口输入,B口输出
mov dx,pb55
pop ax
out dx,al ;B口输出列值
mov dx,pa55
in al,dx ;A口读入行值(AL)
pop bx ;取列值
mov ah,bl ;(AH) 为列值
not ax ;键值取反
mov si,offset table ;指向键值表
mov di,offset char ;指向字符表
mov cx,24
tt: cmp ax,[si] ;cmp (列值,行值)
jz nn ;找到,转移
dec cx
jz kst ;CX=0,转移
add si,2 ;修改指针
inc di
jmp tt ;继续
nn: mov dl,[di] ;从字符表取字符
mov ah,02 ;显示
int 21h
push dx
mov al,82h ;设8255命令字
mov dx,p55ctl ;A口输出,B口输入
out dx,al
wait2: mov al,00
mov dx,pa55
out dx,al ;A口输出00
mov dx,pb55
in al,dx ;读入列值
cmp al,0ffh
jnz wait2 ;等待键释放
pop dx
ret
key endp
code ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -