📄 scan.asm
字号:
DATAS SEGMENT
BUF DB ?
DATAS ENDS
STACKS SEGMENT
DW 256 DUP(?)
TOP LABEL WORD
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
MAIN:
MOV AX,DATAS
MOV DS,AX
MOV AX,STACKS
MOV SS,AX
MOV SP,OFFSET TOP
MOV DX,0EE03H
MOV AL,10000010B ;初始8255,a出b入
OUT DX,AL
MOV BH,4 ;置行数
MOV CL,4 ;置列数
MOV BL,0FFH ;置键值初值为-1
DO1:
MOV DX,0EE00H
MOV AL,0
OUT DX,AL ;置行线为0
MOV DX,0EE01H
IN AL,DX ;读列线
CMP AL,0FFH
JZ NONE ;无键值
MOV DX,0EE00H
MOV AL,11111110B
OUT DX,AL ;置行值为1110
MOV CH,AL
DO2:
MOV AL,CH
MOV DX,0EE00H
OUT DX,AL
MOV DX,0EE01H
IN AL,DX ;读列值
CMP AL,0FFH
JNZ YOU ;不为零则有按键
ADD BL,CL ;键值加4
ROL CH,1 ;否则改变行号
DEC BH
JNZ DO2 ;再一次
JMP NONE
YOU:
CALL FAR PTR DISPLAY ;调用display,消抖
DO3:
MOV AH,AL
MOV DX,0EE01H
IN AL,DX ;读列值
CMP AL,0FFH
JNZ DO3 ;不为零则说明未放手
CALL FAR PTR DISPLAY ;调用display,消抖
KEY:
INC BL
ROR AH,1
JC KEY ;计算键值
MOV BUF,BL
CMP BL,0H
JB NONE
CMP BL,9H
JBE N1
CMP BL,0AH
JZ N2
CMP BL,0BE
JZ N2
CMP BL,0CH
JZ N3
CMP BL,0DH
JZ N2
CMP BL,0EH
JZ N4 ;将键值存入buf中
CMP BL,0FH ;JMP DONE
JZ N5
CMP BL,OFH
JA NONE
N1:ADD BUF,3OH
JMP DONE
N2:ADD BUF,20H
JMP DONE
N3:ADD BUF,23H
JMP DONE
N4:ADD BUF,4FH
JMP DONE
N5:ADD BUF,2EH
JMP DONE
NONE:
MOV BL,0FFH
MOV BUF,BL
DONE:
MOV AH,02H
MOV DL,0DH
INT 21H ;回车
;ADD BUF,30H
MOV AL,BUF
MOV AH,02H
MOV DL,AL
INT 21H ;显示buf中的内容
MOV AH,4CH
INT 21H
CODES ENDS
CODE1 SEGMENT
ASSUME CS:CODE1
DISPLAY PROC FAR
PUSH BX
PUSH CX
DELAY:
MOV BX,1000
AGAIND:
MOV CX,65000
DLP:
LOOP DLP
DEC BX
CMP BX,0
JNZ AGAIND ;延时段
POP BX
POP CX
RET
DISPLAY ENDP
CODE1 ENDS
END MAIN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -