📄 8255与8253实现按键显示.txt
字号:
code segment
assume cs:code,ds:code
start:
push cs
pop ds
mov ax,data
mov ds,ax
lea si,ledtab
mov al,81h
mov dx,203h
out dx,al;初始化控制字
mov dx,202h
mov al,0fh
out dx,al;判断有无按键,使所有列线为低电平
in al,dx;读取行值
and al,0fh
cmp al,0fh
jz exit;无按键闭合结束程序,即跳出
call delay;延时12ms消抖
mov dx,202h
mov al,0fh
out dx,al;判断有无按键,使所有列线为低电平
in al,dx;读取行值
and al,0fh
cmp al,0fh
jz exit;无按键闭合结束程序
mov bl,0efh;初始化列码
mov bh,0;初始化列计数器
again: mov dx,202h
mov al,bl
out dx,al;输出列码
in al,dx;读取行值
and al,0fh
cmp al,0fh
jz next;该列无键闭合,准备下一列扫描
cmp al,0eh;判断该列是否第一个键闭合
jnz two
mov al,0
jmp free
two:cmp al,0dh;判断该列是否是第二个键闭合
jnz three
mov al,1
jmp free
three:cmp al,0bh;判断该列是否是第三个键闭合
jnz four
mov al,4
jmp free
four: cmp al,07h;判断该列是否是第四个键闭合
jnz next
mov al,7
free: push ax
wait1: mov dx,202h;判断按键是否结束
mov al,0fh
out dx,al;判断有无按键,使所有列线为低电平
in al,dx;读取行值
and al,0fh
cmp al,0fh
jnz wait1
pop ax
add al,bh; ;此时al中存放要显示的值扫描键值+列计数值
mov ah,0
add si,ax;将显示值设置为相应的段码
mov al,[si]
mov dx,200h
out dx,al;送到端口显示
mov al,08h
mov dx,202h
out dx,al;设置位码
next: inc bh;列计数值加1
rol bl,1 ;列码循环左移一位
cmp bl,0feh;判断该轮键扫描是否结束
jnz again
exit:mov ah,4ch
int 21h
delay proc near
push bx
push cx
mov bx,2000
del1:mov cx,5000
del2:loop del2
dec bx
jnz del1
pop cx
pop bx
ret
delay endp
;定义数据段
data segment
ledtab db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh
data ends
code ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -