本文共 2250 字,大约阅读时间需要 7 分钟。
设置8255A的C口键盘输入,A口为数码管段码输出。
翻转法的原理其实很简单:首先行线全部输出为0,然后查找哪一列输入为0;然后翻转,列线全部输出为0,查找哪一行输入为0;找到行号和列号后,简单计算就能得到按下字符的序号。
stack segment stack db 200 dup(0)stack endsdata 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~Fdata endscode 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 21hcode ends end main
转载地址:http://jmiqf.baihongyu.com/