📄 c.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 + -