⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jianpanshaomiao.asm

📁 用汇编编写的键盘扫描实验。适用于8086开发环境。
💻 ASM
字号:

OUTBIT   equ 08002h  ; 位控制口
OUTSEG   equ 08004h  ; 段控制口
IN_KEY   equ 08001h  ; 键盘读入口

data   segment
LEDBuf db  6 dup(?)    ; 显示缓冲
Num    db  1 dup(?)    ; 显示的数据
DelayT db  1 dup(?)
LEDMAP:                ; 八段管显示码
       db    3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h
       db    7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h

KeyTable:              ; 键码定义
       db    16h, 15h, 14h, 0ffh
       db    13h, 12h, 11h, 10h
       db    0dh, 0ch, 0bh, 0ah
       db    0eh, 03h, 06h, 09h
       db    0fh, 02h, 05h, 08h
       db    00h, 01h, 04h, 07h
data   ends

code   segment
       assume cs:code, ds:data

Delay  proc  near
       push  ax            ; 延时子程序
       push  cx

       mov   al, 0
       mov   cx,ax
       loop  $

       pop   cx
       pop   ax
       ret
Delay  endp

DisplayLED proc near
       mov   bx, offset LEDBuf
       mov   cl, 6         ; 共6个八段管
       mov   ah, 00100000b ; 从左边开始显示
DLoop:
       mov   dx, OUTBIT
       mov   al, 0
       out   dx,al         ; 关所有八段管
       mov   al, [bx]
       mov   dx, OUTSEG
       out   dx,al

       mov   dx, OUTBIT
       mov   al, ah
       out   dx, al       ; 显示一位八段管

       push  ax
       mov   ah, 1
       call  Delay
       pop   ax

       shr   ah, 1
       inc   bx
       dec   cl
       jnz   DLoop

       mov   dx, OUTBIT
       mov   al, 0
       out   dx,al        ; 关所有八段管
       ret
DisplayLED endp


TestKey proc near
       mov   dx, OUTBIT
       mov   al, 0
       out   dx, al       ; 输出线置为0
       mov   dx, IN_KEY
       in    al, dx       ; 读入键状态

       not   al
       and  al, 0fh       ; 高四位不用
       ret
TestKey endp

GetKey proc near
       mov   ch, 00100000b
       mov   cl, 6
KLoop:
       mov   dx, OUTBIT
       mov   al, ch           ; 找出键所在列
       not   al
       out   dx, al
       shr   ch, 1

       mov   dx, IN_KEY
       in    al, dx
       not   al
       and   al, 0fh
       jne   Goon_        ; 该列有键入
       dec   cl
       jnz   KLoop

       mov   cl, 0ffh    ; 没有键按下, 返回 0ffh
       jmp   Exit1
Goon_:
       dec   cl
       shl   cl, 2       ; 键值 = 列 X 4 + 行

       mov   ch, 4
LoopC:
       test  al, 1
       jnz   Exit1
       shr   al, 1
       inc   cl
       dec   ch
       jnz   LoopC
Exit1:
       mov   dx, OUTBIT
       mov   al, 0
       out   dx, al

       mov   ch, 0
       mov   bx, offset KeyTable
       add   bx, cx
       mov   al, [bx]          ; 取出键码
       mov   bl, al

WaitRelease:
       mov   dx, OUTBIT
       mov   al, 0
       out   dx, al            ; 等键释放

       mov   ah, 10
       call  Delay
       call  TestKey
       jne   WaitRelease
       mov   al, bl
       ret
GetKey endp

Start  proc near
       mov   ax, data
       mov   ds, ax

       mov   LEDBuf, 0ffh    ; 显示 8.8.8.8.
       mov   LEDBuf+1, 0ffh
       mov   LEDBuf+2, 0ffh
       mov   LEDBuf+3, 0ffh
       mov   LEDBuf+4, 0
       mov   LEDBuf+5, 0
MLoop:
       call  DisplayLED       ; 显示
       call  TestKey          ; 有键入?
       je    MLoop            ; 无键入, 继续显示
       call  GetKey           ; 读入键码
       and   al, 0fh          ; 显示键码
       mov   ah, 0
       mov   bx, offset LEDMAP
       add   bx, ax
       mov   al, [bx]
       mov   LEDBuf+5, al
       jmp   MLoop

Start  endp
code   ends
       end start


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -