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

📄 17.asm

📁 键盘输入功能
💻 ASM
字号:

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

LEDBuf equ   60h     ; 显示缓冲

       org   2080h
       ljmp  Start

LEDMAP:              ; 八段管显示码
       db    3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h
       db    7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h

Delay: push  ax            ; 延时子程序
       ldb   al, #0
DelayLoop:
       djnzw ax, DelayLoop
       pop   ax
       ret

DisplayLED:
       ld    dx, #LEDBuf
       ldb   cl, #6         ; 共6个八段管
       ldb   ah, #00100000b ; 从左边开始显示
DLoop:
       stb   0, OUTBIT      ; 关所有八段管
       ldb   al, [dx]
       stb   al, OUTSEG
       stb   ah, OUTBIT      ; 显示一位八段管

       push  ax
       ldb   ah, #1
       call  Delay
       pop   ax

       shrb  ah, #1
       inc   dx
       djnz  cl, DLoop

       stb   0, OUTBIT           ; trun off all LED
       ret

TestKey:
       stb   0, OUTBIT       ; 输出线置为0
       ldb   al, IN          ; 读入键状态
       notb  al
       andb  al, #0fh        ; 高四位不用
       ret

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

GetKey:
       ldb   ch, #00100000b
       ldb   cl, #6
KLoop:
       notb  ch           ; 找出键所在列
       stb   ch, OUTBIT
       notb  ch
       shrb  ch, #1

       ldb   al, IN
       notb  al
       andb  al, #0fh
       jne   Goon_        ; 该列有键入
       djnz  cl, KLoop

       ldb   cl, #0ffh    ; 没有键按下, 返回 0ffh
       sjmp  Exit1
Goon_:
       decb  cl
       shlb  cl, #2       ; 键值 = 列 X 4 + 行

       ldb   ch, #4
LoopC:
       jbs   al, 0, Exit1
       shrb  al, #1
       incb  cl
       djnz  ch, LoopC
Exit1:
       stb   0, OUTBIT

       extb  cx

       ldb   al, KeyTable[cx]  ; 取出键码
       ldb   bl, al

WaitRelease:
       stb   0, OUTBIT         ; 等键释放
       ldb   ah, #10
       call  Delay
       call  TestKey
       jne   WaitRelease
       ldb   al, bl
       ret

Start:
       ld    sp, #0e0h
       ldb   LEDBuf, #0ffh    ; 显示 8.8.8.8.
       ldb   LEDBuf+1, #0ffh
       ldb   LEDBuf+2, #0ffh
       ldb   LEDBuf+3, #0ffh
       ldb   LEDBuf+4, #0
       ldb   LEDBuf+5, #0
MLoop:
       call  DisplayLED       ; 显示
       call  TestKey          ; 有键入?
       je    MLoop            ; 无键入, 继续显示
       call  GetKey           ; 读入键码
       andb  al, #0fh         ; 显示键码
       ldb   ah, #0
       ldb   LEDBuf+5, LEDMap[ax]
       ljmp  MLoop

       end

⌨️ 快捷键说明

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