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