?? gg302.asm
字號:
;gg302.asm
;for 【2.掃描法】鍵盤工作<8255芯片、3X6鍵盤>
;2005-05
;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):'
begin1:MOV DX, PCTL
MOV AL, 10000010b
OUT DX, AL
MOV AL, 0
MOV DX, PA
OUT DX, AL
nn:MOV DX, PB
IN AL, DX
AND AL, 07h
CMP AL, 07h
JZ nn
CALL delay ;延時,消除抖動
begin2:MOV BX, 0306h ;bl送行數,bh送列數
MOV CL, 01h ;cl起始行號
MOV AL, 11111110b ;起始掃描碼
lop1:MOV DX, PA
OUT DX, AL
ROL AL, 1 ;左移al,以待掃描下一行
MOV AH, AL ;保存下一行掃描碼到ah
INC DX
IN AL, DX
AND AL, 07h
CMP AL, 07h ;掃描本行列線,是否輸入全1,以判斷本行是否有鍵按下
JNZ lop2 ;本行有鍵按下,跳轉出掃描循環
ROL CL, 1
MOV AL, AH ;下一行掃描碼放入al中
DEC BL ;掃描完一行,行數減1
JNZ lop1
JMP begin2
lop2:NOT AL
AND AL, 00000111b
MOV AH, AL ;列值放入al中
MOV AL, CL ;行值放入al中
LEA BX, table
LEA SI, buf
MOV CX, 12h
ls1:CMP AX, [BX]
JE ls2 ;顯示
ADD BX, 2
ADD SI, 1
LOOP ls1
JMP begin1
ls2:MOV DL, [SI]
MOV AH, 2
INT 21h
MOV AL, 10000010b
MOV DX, PCTL
OUT DX, AL
MOV AL, 0
MOV DX, PA
OUT DX, AL
INC DX
ls3:IN AL, DX
AND AL, 07h
CMP AL, 07h
JNE ls3
MOV DL, [SI]
CMP DL, 'P'
JNE begin1
LEA DX, tip1
CALL printstr ;提示信息'The End.'
;================INT-21H================
MOV AH, 4ch
INT 21h
delay PROC ;延時子程序,消除抖動
PUSH CX
MOV SI, 3
y0:MOV CX, 0h
ys:NOP
LOOP ys
DEC SI
JNZ y0
POP CX
RET
delay ENDP
printstr PROC ;打印字符串子程序
PUSH AX
MOV AH, 09h
INT 21h
POP AX
RET
printstr ENDP
coseg ENDS
END start
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -