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

📄 h19.asm

📁 (1)完成键盘
💻 ASM
字号:

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

HasRcv equ   20h.0   ; 接收标志位
LEDBuf equ   40h     ; 显示缓冲
RCVBuf equ   50H     ; 接收缓冲

        ORG     0000H
        LJMP    START

; 串行口中断程序
        ORG     0023H
        JNB     TI,S0_R
        CLR     TI
        NOP
        SJMP    S0_RET
S0_R:                          ; 接收数据
        CLR     RI
        MOV     RCVBUF,SBUF    ; 保存数据
        SETB    HasRcv         ; 提示收到数据
        NOP
S0_RET:
        RETI

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

Delay:               ; 延时子程序
       mov   r7, #0
DelayLoop:
       djnz  r7, DelayLoop
       djnz  r6, DelayLoop
       ret

DisplayLED:
       mov   r0, #LEDBuf
       mov   r1, #6          ; 共6个八段管
       mov   r2, #00100000b  ; 从左边开始显示
Loop:
       mov   dptr, #OUTBIT
       mov   a, #0
       movx  @dptr, a        ; 关所有八段管

       mov   a, @r0
       mov   dptr, #OUTSEG
       movx  @dptr,a
       mov   dptr, #OUTBIT
       mov   a, r2
       movx  @dptr, a        ; 显示一位八段管

       mov   r6, #1
       call  Delay

       mov   a, r2           ; 显示下一位
       rr    a
       mov   r2, a

       inc   r0

       djnz  r1, Loop

       ret

TestKey:
       mov   dptr, #OUTBIT
       mov   a, #0
       movx  @dptr, a        ; 输出线置为0
       mov   dptr, #IN
       movx  a, @dptr        ; 读入键状态
       cpl   a
       anl   a, #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:
       mov   dptr, #OUTBIT
       mov   P2, dph
       mov   r0, #Low(IN)
       mov   r1, #00100000b
       mov   r2, #6
KLoop:
       mov   a, r1           ; 找出键所在列
       cpl   a
       movx  @dptr, a
       cpl   a
       rr    a
       mov   r1, a           ; 下一列

       movx  a, @r0
       cpl   a
       anl   a, #0fh
       jnz   Goon1           ; 该列有键入

       djnz  r2, KLoop

       mov   r2, #0ffh       ; 没有键按下, 返回 0ffh
       sjmp  Exit
Goon1:
       mov   r1, a           ; 键值 = 列 X 4 + 行

       mov   a, r2
       dec   a
       rl    a
       rl    a
       mov   r2, a           ; r2 = (r2-1)*4

       mov   a, r1           ; r1中为读入的行值
       mov   r1, #4
LoopC:
       rrc   a               ; 移位找出所在行
       jc    Exit
       inc   r2              ; r2 = r2+ 行值
       djnz  r1, LoopC
Exit:
       mov   a, r2           ; 取出键码
       mov   dptr, #KeyTable
       movc  a, @a+dptr
       mov   r2, a

WaitRelease:
       mov   dptr, #OUTBIT  ; 等键释放
       clr   a
       movx  @dptr, a

       mov   r6, #10
       call  Delay
       call  TestKey
       jnz   WaitRelease

       mov   a, r2
       ret

START:
       MOV   SP,  #60H
       MOV   IE,  #0     ; DISABLE ALL INTERRUPT
       MOV   TMOD,#020H  ; 定时器1工作于方式2 (8位重装)
       MOV   TH1, #0F3H  ; 波特率

⌨️ 快捷键说明

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