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