微机接口实验二:键盘显示控制实验(翻转法实现)
程序员文章站
2022-03-15 13:30:36
...
一、实验目的
- 掌握8255A控制键盘及显示电路的基本功能及编程方法。
- 掌握一般键盘和显示电路的工作原理。
二、实验原理和内容
三、编程提示
设置8255A的C口键盘输入,A口为数码管段码输出。
四、电路接线图
五、程序设计流程图
六、一些说明
翻转法的原理其实很简单:首先行线全部输出为0,然后查找哪一列输入为0;然后翻转,列线全部输出为0,查找哪一行输入为0;找到行号和列号后,简单计算就能得到按下字符的序号。
七、程序源代码
stack segment stack
db 200 dup(0)
stack ends
data segment
APORT equ 288h
CPORT equ 28ah
CTRL equ 28bh
codes db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h, 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h ;0~9, A~F
data ends
code segment
assume cs:code,ds:data,ss:stack
delay MACRO ;延时宏
local loop_delay
local flag
push cx
push bx
xor bx, bx
flag:mov cx, 0ffffh
loop_delay:loop loop_delay
inc bx
cmp bx, 10
jnz flag
pop bx
pop cx
ENDM
main:mov ax,data ;0出1入
mov ds,ax
mov ax, stack
mov ss, ax
mov al, 10001000b ;A口方式0输出,C口高四位输入,列输入,C口低四位输出,行输出
mov dx, CTRL
out dx, al
mov al, 0
mov dx, CPORT
out dx, al ;行输出为0
xor bx, bx
no_key:mov dx, CPORT
in al, dx ;检查输入列信号(C口高四位)
and al, 0f0h
cmp al, 0f0h ;高四位全为1,即列信号全为1,无键按下
jz no_key
delay ;延时消除抖动
mov dx, CPORT
in al, dx ;逐列检查,看哪一列输入为0
shr al, 1
shr al, 1
shr al, 1
shr al, 1 ;C口高四位列输入信号移至低四位
xor bl, bl ;依次查找四列哪一列为0
mov cx, 4
loop1:shr al, 1 ;将最低位传至cf
jnc loop2 ;cf为0表示bl列输入为0
inc bl
loop loop1
loop2:mov al, 10000001b ;A口方式0输出,C口高四位输出,列输出,C口低四位输入,行输入
mov dx, CTRL
out dx, al
xor al, al
mov dx, CPORT
out dx, al ;列输出全部为0,查找哪一行输入为0
mov dx, CPORT
in al, dx
and al, 0fh
cmp al, 0fh ;低四位全为1,即行输入全为1,表示有键按错
jz error
mov bh, 0 ;否则有行输入为0,循环找到行号
mov cx, 4
loop3:shr al, 1 ;低位传送至cf
jnc loop4 ;有一行为0,找到行输入序号为bh
inc bh
loop loop3
loop4:shl bh, 1 ;计算4*bh+bl,表示键号
shl bh, 1
add bh, bl ;dh为键号(0-15)
mov al, 01h
mov dx, CPORT
out dx, al
mov bl, bh
xor bh, bh
mov di, bx
mov al, codes[di] ;输出显示
mov dx, APORT
out dx, al
delay
error:mov ah,4ch
int 21h
code ends
end main