(一) 操作练习
对于8255A的3个并行端口,选用端口C的低4位和高4位分别接4*4键盘的行列信号线,选用端口A驱动数码管,数码管采用静态共阳极接法。实现当有一个按键按下时,LED和数码管均能显示其按键值。
IO3 EQU 0600H
CODE SEGMENT 'CODE'
ASSUME CS:CODE,DS:CODE
START: MOV AX,CODE
MOV DS,AX
L: MOV AL, 10000001B ;设置8255A工作方式0(二三为00表示工作方式0),端口A、B输出(所以第四位0代表A输出第六位0代表B输出),端口C高4位输出(第五位0代表C高位输出)、低4位输入(第八位1代表低位输入)
MOV DX,IO3+6
OUT DX,AL
MOV DX,IO3+4
MOV AL,00 ;高4位送0
OUT DX,AL
NOKEY: IN AL,DX
AND AL,0FH
CMP AL,0FH
JZ NOKEY
CALL DELAY10
IN AL,DX
MOV BL,0
MOV CX,4
LP1: SHR AL,1
JNC LP2
INC BL
LOOP LP1
LP2: MOV AL, 10001000B ;设置8255A工作方式0(二三为00表示工作方式0),端口A、B输出(所以第四位0代表A输出第六位0代表B输出),端口C高4位输入(第五位1代表C高位输入)、低4位输出(第八位0代表低位输出)
MOV DX,IO3+6
OUT DX,AL
MOV DX,IO3+4
MOV AL,00 ;低4位送0
OUT DX,AL
IN AL,DX
AND AL,0F0H
CMP AL,0F0H
JZ L
MOV BH,0
MOV CX,4
LP3: SHL AL,1
JNC LP4
INC BH
LOOP LP3
LP4: MOV AX,4
MUL BH
ADD AL,BL
MOV DX,IO3+2
OUT DX,AL
MOV BX,OFFSET SEGDATA
XLAT
MOV DX,IO3
OUT DX,AL
MOV CX,0
J1: LOOP J1
JMP L
RET
DELAY10 PROC
MOV CX,882
LOOP $
RET
DELAY10 ENDP
SEGDATA DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,
0A1H,86H,8EH,0BFH
CODE ENDS
END START
仿真结果(截图放在下面):
- 请回答:下面这段代码实现了什么功能?
NOKEY: IN AL,DX
AND AL,0FH
CMP AL,0FH
JZ NOKEY
CALL DELAY10
IN AL,DX
MOV BL,0
MOV CX,4
LP1: SHR AL,1
JNC LP2
INC BL
LOOP LP1
确定按键列是否输入并判断输入键位置得出代表的数据
- 请回答:下面这段代码实现了什么功能?
IN AL,DX
AND AL,0F0H
CMP AL,0F0H
JZ L
MOV BH,0
MOV CX,4
LP3: SHL AL,1
JNC LP4
INC BH
LOOP LP3
确定按键行是否输入并判断输入键位置得出代表的数据
-
请回答:MUL和XLAT是什么指令,它们分别实现了什么功能?
MUL是乘法指令,实现操作数与AL相乘;
XLAT是查表指令,把待查表格的一个字节内容送到AL中。 -
标出下面按键的行号和列号。(提示:COL4是第几行,ROW1是第几列)
COL4:第0行 ROW1:第0列
COL3:第1行 ROW2:第1列
COL2:第2行 ROW3:第2列
COL1:第3行 ROW4:第3列