利用實驗箱所帶小鍵盤,加上一個開關作為功能選項鍵,實現A-H八個大寫母,以 及 a-h 八個小寫字母的輸入掃描程序,利用另一個開關模擬回車鍵,讓所輸入的字 母顯示在七段數碼管顯示器上。
;********************;
;* 8255薄膜按鍵實驗 *;
;********************;
a8255 equ 288H ;8255 A口
b8255 equ 289H
c8255 equ 28aH ;8255 C口
k8255 equ 28bH ;8255控制口
data segment
table1 dw 0770h,0B70h,0D70h,0E70h,07B0h,0BB0h,0DB0h,0EB0h
dw 07D0h,0BD0h,0DD0h,0ED0h,07E0h,0BE0h,0DE0h,0EE0h ;鍵盤掃描碼表
LED DB 67H,74H,5cH,7cH,58H,5eH,7bH,71H,7DH,76H,77H,7FH
DB 39h,3FH,79h,71h,0ffh ;LED段碼表,0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
char db '01234567?@ABCDEF' ;字符表
NUM DB 8 DUP(0)
key_in db 0h
data ends
stacks segment stack ;堆棧空間
db 100 dup (?)
stacks ends
code segment
assume cs:code,ds:data,ss:stacks,es:data
start:
cli
mov ax,data
mov ds,ax
mov es,ax ;把數據放在數據段寄存器
mov ax,stacks
mov ss,ax ;把堆棧放在堆棧段
MOV DX,k8255 ;初始化8255控制字
mov al,81h ;設置c端口低四位輸入,a,b輸出,0工作方式
out dx,al
MOV BX,0
main_key:
call key
cmp byte ptr key_in,'1'
jz dis1
cmp byte ptr key_in,'2'
jz dis2
dis1: call key
cmp byte ptr key_in, '0'
jz bbb
PUSH BX
MOV BX,OFFSET LED
MOV AL,byte ptr key_in
SUB al,30h
CMP al,09h
JNG DIS2
SUB al,07h
sub al,8
XLAT
POP BX
MOV NUM+BX,AL
INC BX
CMP BX,8
JB dis1
jmp ccc
DIS2: call key
cmp byte ptr key_in, '0'
jz bbb
PUSH BX
MOV BX,OFFSET LED
MOV AL,byte ptr key_in
SUB al,30h
CMP al,09h
JNG DIS2
SUB al,07h
XLAT
POP BX
MOV NUM+BX,AL
INC BX
CMP BX,8
JB dis2
CCC: MOV BX,0FE08H ;BH=0FE BL=08 ;預備點亮第一個數碼管,并且控制循環次數
MOV DI ,OFFSET NUM ;取num偏移地址
BBB: MOV DX,b8255
MOV AL,bh
OUT DX,AL ;點亮數碼管
ROL BH,1 ;準備點亮下一個
MOV DX,a8255
MOV AL,[di]
OUT DX,AL ;依次將得到的字符輸出
inc di
push cx
mov cx,100
ddd: loop ddd ;延時
pop cx
DEC BL
CMP BL,0
JZ CCC ;是否已經全部輸出,如果是則重新輸出
JMP BBB
; mov ax,4c00h
;int 21h
key proc near
key_loop:
mov dx,c8255
mov al,0fh
out dx,al ;清除輸入端口的值
in al,dx ;讀行掃描值
and al,0fh
cmp al,0fh ;判斷是否按下
jz key_loop ;未發現有鍵按下則轉
call delay ;delay for amoment
mov ah,al ;將行狀態保存
MOV DX,k8255
mov al,88h
out dx,al ;設置工作狀態高四位輸入
mov dx,c8255
mov al,ah
or al,0f0h
out dx,al ;對列進行清除
in al,dx ;讀列掃描值
and al,0f0h
cmp al,0f0h
jz key_loop ;未發現有鍵按下則轉
mov si,offset table1 ;鍵盤掃描碼表首址
mov di,offset char ;字符表首址
mov cx,16 ;待查表的表大小
key_tonext:
cmp ax,[si] ;cmp (col,row) with every word
jz key_findkey ;in the table
dec cx
jz key_loop ;未找到對應掃描碼
add si,2
inc di
jmp key_tonext
key_findkey:
mov dl,[di]
mov ah,02
int 21h ;顯示查找到的鍵盤碼
mov byte ptr key_in,dl ;字符進行另一個命名
key_waitup:
MOV DX,k8255
mov al,81h
out dx,al
mov dx,c8255
mov al,0fh
out dx,al
in al,dx ;讀行掃描值
and al,0fh
cmp al,0fh
jnz key_waitup ;按鍵未抬起轉
call delay ;消抖
ret
;exit: mov byte ptr key_in,'E'
ret
key endp
delay proc near
push cx
mov cx,0ffffh
delay1:
loop delay1
pop cx
ret
delay endp
code ends
end start
這個程序誰能看懂?求求大的很幫我注釋一下每一步的作用。萬分感謝 |