?? gg301.asm
字號:
;gg301.asm
;for 【1.反轉(zhuǎn)法】鍵盤工作<8255芯片、3X6鍵盤>
;2005-05
;wenq/wxz/p_Sa/lcy
data SEGMENT
table DW 0101h,0102h,0104h,0108h,0110h,0120h
DW 0201h,0202h,0204h,0208h,0210h,0220h
DW 0401h,0402h,0404h,0408h,0410h,0420h ;高2位列值(橫),低2位行值(豎)
buf DB '6789AB012345CDEFGP'
tip0 DB 'let key down(p for over):',0dh,0ah,'$'
tip1 DB 0dh,0ah,'The End.$'
PA EQU 280h
PB EQU 281h
PC EQU 282h
PCTL EQU 283h
data ENDS
stack0 SEGMENT para stack
DW 20h DUP(0)
stack0 ENDS
coseg SEGMENT
ASSUME CS:coseg,DS:data,SS:stack0
start: MOV AX, data
MOV DS, AX
;================MOV-DS-AX==============
LEA DX, tip0
CALL printstr ;提示信息'let key down(p for over):'
key1:MOV DX, PCTL
MOV AL, 10000010b ;a口輸出,b口輸入
OUT DX, AL
MOV AL, 0 ;a口輸出全0
MOV DX, PA
OUT DX, AL
INC DX
ls0:IN AL, DX
OR AL, 0f8h ;屏蔽列值高位(AND AL, 07h)
CMP AL, 0FFh ;比較b口是否輸出全1,以判斷是否按鍵
JE ls0
CALL delay ;延時,消除抖動
CALL delay
MOV AL, 0 ;a口輸出全0
MOV DX, PA
OUT DX, AL
INC DX
IN AL, DX ;輸入列值到al中,消除抖動后讀第二次
OR AL, 0f8h ;屏蔽列值高位
MOV AH, 0
PUSH AX ;列值進(jìn)棧
PUSH AX
MOV AL, 10010000b ;a口輸入,b口輸出——反轉(zhuǎn)!!
MOV DX, PCTL
OUT DX, AL
POP AX ;彈出列值到ax
MOV DX, PB
OUT DX, AL
MOV DX, PA
IN AL, DX ;輸入行值到al中
POP BX ;彈出列值到bx
MOV AH, BL ;列值放入ah中
OR AL, 11000000b ;屏蔽行值高位
NOT AX ;求反對應(yīng)鍵值表
MOV CX, 12h ;查表,表長18
LEA BX, table
LEA SI, buf
ls1:CMP AX, [BX]
JE ls2 ;若有查到,跳到顯示部分,否則繼續(xù)查表
ADD BX, 2
ADD SI, 1
LOOP ls1
JMP key1 ;說明無此鍵,重新開始讀鍵盤
ls2:MOV DL, [SI] ;顯示對應(yīng)字符——!!
MOV AH, 02h
INT 21h
MOV DX, PCTL
MOV AL, 10000010b ;a口輸出,b口輸入
OUT DX, AL
MOV AL, 0 ;a口輸出全0
MOV DX, PA
OUT DX, AL
INC DX
ls3:IN AL, DX
CALL delay ;延時,消除抖動,防止影響下一次按鍵
AND AL, 07h
CMP AL, 07h ;比較b口是否輸出全1,以判斷是否按鍵
JNE ls3
MOV DL, [SI]
CMP DL, 'P' ;是否要結(jié)束'p'
JNE key1
LEA DX, tip1
CALL printstr ;提示信息'The End.'
;================INT-21H================
MOV AH, 4ch
INT 21h
delay PROC ;延時子程序,消除抖動
PUSH CX
MOV CX, 0ffffh
ys:NOP
LOOP ys
POP CX
RET
delay ENDP
printstr PROC ;打印字符串子程序
PUSH AX
MOV AH, 09h
INT 21h
POP AX
RET
printstr ENDP
coseg ENDS
END start
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -