?? 8255與8253實現按鍵顯示.txt
字號:
code segment
assume cs:code,ds:code
start:
push cs
pop ds
mov ax,data
mov ds,ax
lea si,ledtab
mov al,81h
mov dx,203h
out dx,al;初始化控制字
mov dx,202h
mov al,0fh
out dx,al;判斷有無按鍵,使所有列線為低電平
in al,dx;讀取行值
and al,0fh
cmp al,0fh
jz exit;無按鍵閉合結束程序,即跳出
call delay;延時12ms消抖
mov dx,202h
mov al,0fh
out dx,al;判斷有無按鍵,使所有列線為低電平
in al,dx;讀取行值
and al,0fh
cmp al,0fh
jz exit;無按鍵閉合結束程序
mov bl,0efh;初始化列碼
mov bh,0;初始化列計數器
again: mov dx,202h
mov al,bl
out dx,al;輸出列碼
in al,dx;讀取行值
and al,0fh
cmp al,0fh
jz next;該列無鍵閉合,準備下一列掃描
cmp al,0eh;判斷該列是否第一個鍵閉合
jnz two
mov al,0
jmp free
two:cmp al,0dh;判斷該列是否是第二個鍵閉合
jnz three
mov al,1
jmp free
three:cmp al,0bh;判斷該列是否是第三個鍵閉合
jnz four
mov al,4
jmp free
four: cmp al,07h;判斷該列是否是第四個鍵閉合
jnz next
mov al,7
free: push ax
wait1: mov dx,202h;判斷按鍵是否結束
mov al,0fh
out dx,al;判斷有無按鍵,使所有列線為低電平
in al,dx;讀取行值
and al,0fh
cmp al,0fh
jnz wait1
pop ax
add al,bh; ;此時al中存放要顯示的值掃描鍵值+列計數值
mov ah,0
add si,ax;將顯示值設置為相應的段碼
mov al,[si]
mov dx,200h
out dx,al;送到端口顯示
mov al,08h
mov dx,202h
out dx,al;設置位碼
next: inc bh;列計數值加1
rol bl,1 ;列碼循環左移一位
cmp bl,0feh;判斷該輪鍵掃描是否結束
jnz again
exit:mov ah,4ch
int 21h
delay proc near
push bx
push cx
mov bx,2000
del1:mov cx,5000
del2:loop del2
dec bx
jnz del1
pop cx
pop bx
ret
delay endp
;定義數據段
data segment
ledtab db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh
data ends
code ends
end start
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -