📄 硬件上机.txt
字号:
NEXT: CALL DISP ; 显示、移位并延时
CALL KEY_INPUT
CMP EXIT_FLAG,TRUE
JNZ NEXT
MOV AH,4CH
INT 21H
KEY_INPUT: MOV AH,0BH
INT 21H
CMP AL,0
JZ KEY_RET ;无键盘输入,退出子程序
MOV AH,1 ;读出ASCII码
INT 21H
OR AL,20H ;改小写
CMP AL,'e'
JNZ KEY_LP1
MOV EXIT_FLAG,TRUE
KEY_LP1: AND AL,0FH
MOV DISPBUF,AL
KEY_RET: RET
;将DISPBUF显示到DISP_BIT位上,显示位右移,延时0.4秒
DISP: LEA BX,SEG7CODE
MOV AL,DISPBUF
AND AL,0FH
XLAT
MOV DX,PORT_B
OUT DX,AL
MOV AL,DISP_BIT
MOV DX,PORT_C
OUT DX,AL
ROR DISP_BIT,1
JNC DISP_RET
MOV DISP_BIT,00100000B
DISP_RET: CALL DELAY
RET
DELAY: PUSH BX
PUSH CX
MOV BX,5000
NEXT2: MOV CX,0FFFFH
NEXT1: DEC CX
JNZ NEXT1
DEC BX
JNZ NEXT2
POP CX
POP BX
RET
CODE ENDS
END START
6.编制一个程序,使其能完成:当从操作面板4×4键盘上连续键入不同的数字(只能是A~F)键,可按键入的先后顺序在CRT屏幕上依次显示出相应的字母,要求按键之前,在屏幕上先显示有关提示信息。当键入“0”键时,结束程序。设8255A的B口作键盘的行信号,C口作键盘的列信号。
PORT_ROW EQU 209H
PORT_COL EQU 20AH
PORT_CW EQU 20BH
DATA SEGMENT
ASCII DB ‘0123456789ABCDEF’
STRING DB ‘PRESS A – F’, 0DH,0AH,‘$’
ROW_NUMBER DB ?
KEY_BUF DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DX,PORT_CW
MOV AL,89H ; A,B口作输出,C口作输入
OUT DX,AL
LEA DX,STRING ;显示提示信息
MOV AH,9
INT 21H
NEXT: CALL KEY_INPUT ;检查非编码键盘
CMP KEY_BUF,0 ;检查退出条件(0号键)
JZ EXIT ;是,退出
CMP KEY_BUF,0FFH ;检查是否有键号输入
JZ NEXT ;无,重新等待
CALL DISP ;有输入,显示到CRT上(注:没做容错处理)
JMP NEXT
EXIT: MOV AH,4CH ;返回到DOS
INT 21H
; 将KEY_BUF中的键号显示到CRT上
DISP: LEA BX,ASCII ;取表指针
MOV AL,KEY_BUF
XLAT ;查表得ASCII码
MOV DL,AL
MOV AH,2 ;显示到CRT上
INT 21H
RET
; 非编码键盘输入子程序
; OUTPUT: AL= 键号,0FFH 无键输入
KEY_INPUT:
MOV KEY_BUF,#0FFH ;置无键输入标志
MOV ROW_NUMBER,0 ; 打开所有行
KEY_WAIT: CALL OUT_ROW_IN_COL
CMP AL,0FH
JZ KEY_EXIT ; 没键输入,退出
CALL DELAY20MS ; 防抖动
MOV ROW_NUMBER,0F7H ;输出第一行
MOV BL,0
KEY_LP2: CALL OUT_ROW_IN_COL
CMP AL,0FH
JNZ KEY_FIND ; 检查按键是否在本行
ADD BL,4 ; 不在,键号+4
ROR ROW_NUMBER,1 ; 修改行号
JC KEY_LP2
JMP KEY_EXIT ; 4行都没有,本次无效
KEY_FIND: SHR AL,1 ; 列号查找
JNC KEY_LP3
INC BL ;键号+1
JMP KEY_FIND
KEY_LP3: MOV ROW_NUMBER,0 ; 判是否松手
CALL OUT_ROW_IN_COL
CMP AL,0FH
JNZ KEY_LP3 ;未松手,继续等待
CALL DELAY20MS ; 松手时防颤抖
KEY_RET: MOV KEY_BUF,BL ; 保存键号
KEY_EXIT: RET
;输出行号值,读回列号值(AL)
; INPUT: ROW_NUMBER
; OUTPUT: AL
OUT_ROW_IN_COL:
MOV DX,PORT_ROW ;输出行号
MOV AL,ROW_NUMBER
OUT DX,AL
MOV DX,PORT_COL ;读回列号
IN AL,DX
AND AL,0FH
RET
DELAY20MS:
PUSH BX
PUSH CX
MOV BX,150
DELAY_LP2: MOV CX,0FFFFH
DELAY_LP1: DEC CX
JNZ DELAY_LP1
DEC BX
JNZ DELAY_LP2
POP CX
POP BX
RET
CODE ENDS
END START
7.编写一个程序,它能对操作面板上4×4键盘的按键次数进行计数,并将该计数结果以压缩BCD码形式显示在发光二极管L8~L1上,要求按键之前,在CRT屏幕上显示有关提示符,计满20次后回零,并在CRT上显示“END”,结束程序。设8255A的A口接L1~L8,B口作键盘的行信号,C口作键盘的列信号。
PORT_A EQU 208H
PORT_B EQU 209H
PORT_C EQU 20AH
PORT_CW EQU 20BH
DATA SEGMENT
MESS DB 'PLEASE PRESS ANY KEY',0DH,0AH,'$'
MESS2 DB 'END',0DH,0AH,'$'
COUNTER DB 0
EXIT_FLAG DB 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DX,PORT_CW
MOV AL,89H
OUT DX,AL
LEA DX,MESS
MOV AH,09H
INT 21H
NEXT: CALL KEY_INPUT
CALL DISP
CMP COUNTER,20 ; 检查是否计数20次
JNZ NEXT
MOV COUNTER,0 ;关显示
CALL DISP
LEA DX,MESS2 ;屏幕显示提示信息
MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
;检查非编码键盘有无输入,无输入返回,有输入则COUNTER加1
KEY_INPUT:
MOV DX,PORT_B
MOV AL,0 ;打开所有行号
OUT DX,AL
MOV DX,PORT_C
IN AL,DX
AND AL,0FH
CMP AL,0FH ;检查有无键输入
JZ KEY_INPUT_RET
INC COUNTER ;计数
CALL DELAY ;防颤抖
KEY_INPUT_WAIT: MOV DX,PORT_C
IN AL,DX
AND AL,0FH
CMP AL,0FH ;判按键是否松手
JNZ KEY_INPUT_WAIT ;没松手继续等待
CALL DELAY ;防颤抖
KEY_INPUT_RET: RET
;延时约20ms
DELAY:
PUSH BX
PUSH CX
MOV BX,200
NEXT2: MOV CX,0FFFFH
NEXT1: LOOP NEXT1
DEC BX
JNZ NEXT2
POP CX
POP BX
RET
; 将COUNTER中的数据转换为组合BCD码并显示到发光二极管上
DISP: MOV AL,DISP_BUF
MOV BL,10
MOV AH,0
DIV BL
MOV CL,4
SHL AL,CL ;商移到高位
ADD AL,AH ;加余数得组合BCD码
MOV DX,PORT_A
OUT DX,AL
RET
CODE ENDS
END START
8.编制程序,完成如下功能:将开关K5~K8的状态所对应的十六进制数在LED1~LED6上按从左到右的顺序循环显示;当开关K1为“1”时,结束程序。设8255A的B口作八段LED显示器的段选口,A口作位选口,C口接开关。
PORT_A EQU 208H
PORT_B EQU 209H
PORT_C EQU 20AH
PORT_CW EQU 20BH
TRUE EQU 0FFH
FALSE EQU 0
DATA SEGMENT
SEG7CODE DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,98H
DB 88H,83H,0C6H,0A1H,86H,8EH
DISP_BIT DB 00100000B
DISPBUF DB ?
EXIT_FLAG DB 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DX,PORT_CW
MOV AL,89H
OUT DX,AL
NEXT: CALL KEYINPUT
CALL DISP
CMP EXIT_FLAG,TRUE
JNZ NEXT
MOV AH,4CH
INT 21H
KEYINPUT:
MOV DX,PORT_C
IN AL,DX
TEST AL,00000001B ; 检查退出开关K1
JZ KEYINPUT_LP1
MOV EXIT_FLAG,TRUE
KEYINPUT_LP1: MOV CL,4
SHR AL,CL ;将K8-K5移到低4位
MOV DISPBUF,AL
RET
; INPUT: DISPBUF
DISP:
LEA BX,SEG7CODE
MOV AL,DISPBUF
AND AL,0FH
XLAT ;查表得七段显示码
MOV DX,PORT_B
OUT DX,AL
MOV AL,DISP_BIT
MOV DX,PORT_A
OUT DX,AL
ROR DISP_BIT,1 ; 移到下一个LED显示位
JNC DISP_RET
MOV DISP_BIT,00100000B ;6次后显示位复位
DISP_RET: CALL DELAY
RET
;延时约0.4S
DELAY:
PUSH BX
PUSH CX
MOV BX,5000
NEXT2: MOV CX,0FFFFH
NEXT1: DEC CX
JNZ NEXT1
DEC BX
JNZ NEXT2
POP CX
POP BX
RET
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -