?? 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 + -