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

📄 c.asm

📁 显示与键盘实验数码管动态显示的原理
💻 ASM
字号:
OUTBIT   equ 8002h  ; 位/列控制口
OUTSEG   equ 8004h  ; 段控制口
IN_KEY   equ 8001h  ; 键盘行读入口
data   segment
LEDBuf db  6 dup(?)  ; 显示缓冲区
Num    db  1 dup(?)  ; 显示的数字
DelayT db  1 dup(?) ;显示LEDBuf区数字的重复次数
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 (0列) 
       db  13h, 12h, 11h, 10h  (1列) 
       db  0dh, 0ch, 0bh, 0ah  (2列) 
       db  0eh, 03h, 06h, 09h  (3列) 
       db  0fh, 02h, 05h, 08h  (4列)
       db  00h, 01h, 04h, 07h  (5列)
data  ends  0行  1行  2行  3行
注意:键码指针= KeyTable + (列′4+行)      只取低位键码,如01h的键码是1h,而 16h的键码是6h。      
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           ;取反状态,则有键入的 行状态为1
       and  al, 0fh    ;仅在低4位上测试有无键入
       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
       jnz   Goon_        ; 该列有键入
       dec   cl
       jnz   KLoop
       mov   cl, 0ffh    ; 没有键按下, 返回 0ffh
       jmp   Exit1 
Goon_: dec   cl       ;起始扫描列号位cl=5
       shl   cl, 2    ;cl=列 X 4 
       mov   ch, 4    ;扫描行次数为ch=4
LoopC:test  al, 1
       jnz   Exit1   ;若为0行,则键值cl = 列 X 4 
       shr   al, 1
       inc   cl      ;否则键值cl=列 X 4 +行
       dec   ch
       jnz   LoopC
Exit1: mov   dx, OUTBIT  ;关闭所有位段码显示
       mov   al, 0
       out   dx, al
       mov   ch, 0
       mov   bx, offset KeyTable
       add   bx, cx  ;键码指针= KeyTable + cl
       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+4, al ;在最低2位数码管上显示
       mov   LEDBuf+5, al
       jmp   MLoop
Start  endp
code   ends
       end start 

⌨️ 快捷键说明

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