📄 scan1.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 ;将键值存入buf中
JMP DONE
NONE:
MOV BL,0FFH
MOV BUF,BL
DONE:
MOV AH,02H
MOV DL,0DH
INT 21H ;回车
ADD BUF,30H
CMP BUF,39H
JB OVER
CMP BUF,3AH
JZ K1
CMP BUF,3BH
JZ K2
CMP BUF,3CH
JZ K3
CMP BUF,3DH
JZ K4
CMP BUF,3EH
JZ K5
CMP BUF,3FH
JZ K6
K1: MOV BUF,2BH
JMP OVER
K2: MOV BUF,2DH
JMP OVER
K3: MOV BUF,2AH
JMP OVER
K4: MOV BUF,2FH
JMP OVER
K5: MOV BUF,3DH
JMP OVER
K6: MOV BUF,43H
JMP OVER
OVER:
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 + -