📄 硬件上机.txt
字号:
1. 编制一个程序,使其能对标准键盘上的按键次数进行计数,并将计数结果显示在LED1上。要求按键之前,在CRT屏幕上显示有关提示信息。当开关K8为“1”时,结束程序。设8255 A的A口作八段LED显示器的段选口,B口作位选口,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
MESG DB 'PLEASE PRESS ANY KEY',0DH,0AH,'$' ; 回车,换行,结束符
SEG7CODE DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,98H ; 显示码 0 - 9,
DB 88H,83H,0C6H,0A1H,86H,8EH ; A - F
DISP_BUF 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 ; A,B口输出,C口输入
OUT DX,AL
LEA DX,MESG ; 显示提示信息
MOV AH,9
INT 21H
NEXT: CALL KEYINPUT
CALL DISP
CALL TEST_EXIT
CMP EXIT_FLAG,TRUE
JNZ NEXT
MOV AH,4CH
INT 21H
;无键输入立即返回,有键输入则DISP_BUF加1
KEYINPUT:
MOV AH,0BH ; 检查键盘有无输入
INT 21H
CMP AL,0FFH ; AL=0FFH 有键输入
JNZ KEYINPUT_RET
MOV AH,1 ; 读取键盘缓冲区内数据(清空键盘缓冲区)
INT 21H
2.编写一个程序:把从标准键盘上输入的一组大写字母(10个)转换成与之对应的小写字母,并从CRT屏幕的最左端开始输出,当按下操作面板4×4键盘的‘E’键时,八个发光二极管中L1、L3、L5、L7点亮,L2、L4、L6、L8熄灭,程序结束运行。设8255A的 C口作键盘的行信号,A口作键盘的列信号,B口接发光二极管。
PORT_A EQU 208H
PORT_B EQU 209H
PORT_C EQU 20AH
PORT_CW EQU 20BH
DATA SEGMENT
MESG DB 'PLEASE PRESS ANY KEY',0DH,0AH,'$'
KEY_BUF DB 11,?, 10 DUP(20H),’$’ ; 20H为空格的ASCII码,并预先放置显示结束符
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,MESG
MOV AH,9
INT 21H ; 显示提示信息
LEA DX,KEY_BUF
MOV AH,0AH
INT 21H ; 等待键盘连续输入10个大写字母
MOV AH,2
MOV DL,0DH
INT 21H ; 回车
MOV AH,2
MOV DL,0AH
INT 21H ; 换行
CALL CHG ; 大小写转换
LEA DX,KEY_BUF
ADD DX,2 ; 调整显示缓冲区地址指针到第一个字母位置
MOV AH,09H ; 显示转换结果
INT 21H
CALL TEST_EXIT ; 若不满足退出条件,子程序不返回
CALL DISP ; 按要求显示发光二极管
MOV AH,4CH
INT 21H
; 按要求显示发光二极管,1=亮,0=灭
DISP:
MOV DX,PORT_A
MOV AL,01010101B
OUT DX,AL
RET
; 将输入的十个大写字母转换为小写
CHG:
LEA SI,KEY_BUF
ADD SI,2 ; 调整地址指针指到第一个字母位置
MOV CX,10 ; 转换十个ASCII码
CHG_NEXT: MOV AL,[SI]
OR AL,20H ; 大写转小写( AND AL,11011111B 即可将小写转大写)
MOV [SI],AL
INC SI
LOOP CHG_NEXT
RET
; 等待从非编码键盘上输入E键,是E键时返回
TEST_EXIT:
MOV DX,PORT_A
MOV AL,11111110B ; 输出行号,即 C-F行
OUT DX,AL
MOV DX,PORT_C
IN AL,DX
TEST AL,00000100B ; 检查列号,即E键
JNZ TEST_EXIT ; 不是E键,继续等待
RET
CODE ENDS
END START
3. 编制一个程序:统计K1~K8中扳向前的开关数N和扳向后的开关数M,并将N显示在八段LED显示器LED6~LED4上,M显示在LED3~LED1上,两组交替显示(交替时间的延时由软件实现)。当八个开关都扳向前时,结束程序。设8255A的 C口作八段LED显示器的段选口,B口作位选口,A口接开关。
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 ; 0 - 9
DB 88H,83H,0C6H,0A1H,86H,8EH ; A - F
DISP_BIT DB 0
N DB ?
M 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
MOV AL,N ; 显示N
MOV DISP_BIT, 00111000B ; LED6-LED4 亮
CALL DISP
CALL DELAY
MOV AL,M ;显示M
MOV DISP_BIT, 00000111B ; LED3-LED1 亮
CALL DISP
CALL DELAY
CMP EXIT_FLAG,TRUE
JNZ NEXT
MOV AH,4CH
INT 21H
;计数开关中为1和为0的个数,当全为1时退出旗标有效
;出口参数:N= 为1的个数, M= 为0的个数, EXIT_FLAG
KEYINPUT: MOV DX,PORT_C
IN AL,DX
MOV N,0
MOV CX,8
KEYINPUT_NEXT: SHL AL,1 ;计数AL中有多少个1
ADC N,0
LOOP KEYINPUT_NEXT
MOV AL,8
SUB AL,N
MOV M,AL ; M = 8 - N
CMP AL,0
JNZ KEYINPUT_EXIT ; M=0,即8个开关全为1
MOV EXIT_FLAG,TRUE
KEYINPUT_EXIT: RET
; 将AL中的数显示到DISP_BIT位置上
; INPUT: AL=BCD, DISP_BIT
DISP: LEA BX,SEG7CODE
AND AL,0FH
XLAT
MOV DX,PORT_B
OUT DX,AL
MOV AL,DISP_BIT
MOV DX,PORT_A
OUT DX,AL
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
4.编制一个程序:根据操作面板上开关的状态决定是否将标准键盘上键入的字母(A~J中任意一个)的ASCII码显示在八个发光二极管L1~L8以及CRT屏幕上。当K1~K7全扳向后时,不显示;当开关K1~K7中的任意一个扳向前时,则显示;当K8扳向前时,结束程序。设8255A的 B口接发光二极管,A口接八个开关。
PORT_A EQU 208H
PORT_B EQU 209H
PORT_C EQU 20AH
PORT_CW EQU 20BH
TRUE EQU 0FFH
FALSE EQU 0
DATA SEGMENT
DISP_BUF DB 0
DISP_FLAG 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
NEXT: CALL KEY_INPUT
CALL KEY_TEST
CALL DISP
CMP EXIT_FLAG,TRUE
JNZ NEXT
MOV AH,4CH
INT 21H
;开关状态检查并设置相应的旗标
;出口参数:若K7-K1全为0,DISP_FLAG=FALSE,否则DISP_FLAG = TRUE
; 若 K8=1,则EXIT_FLAG=TRUE
KEY_TEST:
MOV AL,0
MOV DX,PORT_A
OUT DX,AL
MOV DISP_FLAG,FALSE
MOV DX,PORT_C
IN AL,DX
TEST AL,7FH ;检查K7-K1
JZ KEY_TEST_LP1
MOV DISP_FLAG,TRUE ;至少有一个为1,置显示旗标为真
KEY_TEST_LP1: TEST AL,80H ; 检查K8
JZ KEY_TEST_EXIT
MOV EXIT_FLAG,TRUE
KEY_TEST_EXIT: RET
KEY_INPUT:
MOV AH,7 ;等待键盘输入,但CRT上不显示
INT 21H
CMP AL,’A’
JB KEY_INPUT_RET ; < A
CMP AL,’J’
JA KEY_INPUT_RET ; > J
MOV DISP_BUF,AL
KEY_INPUT_RET: RET
DISP:
CMP DISP_FLAG,TRUE
JNZ DISP_RET ; 显示旗标为假则不显示
MOV AH,2 ; 输出到CRT
MOV DL,DISP_BUF
INT 21H
MOV AL,DISP_BUF ; 输出到发光二极管
MOV DX,PORT_A
OUT DX,AL
DISP_RET: RET
CODE ENDS
END START
4.编制一个程序:根据操作面板上开关的状态决定是否将标准键盘上键入的字母(A~J中任意一个)的ASCII码显示在八个发光二极管L1~L8以及CRT屏幕上。当K1~K7全扳向后时,不显示;当开关K1~K7中的任意一个扳向前时,则显示;当K8扳向前时,结束程序。设8255A的 B口接发光二极管,A口接八个开关。
PORT_A EQU 208H
PORT_B EQU 209H
PORT_C EQU 20AH
PORT_CW EQU 20BH
TRUE EQU 0FFH
FALSE EQU 0
DATA SEGMENT
DISP_BUF DB 0
DISP_FLAG 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
NEXT: CALL KEY_INPUT
CALL KEY_TEST
CALL DISP
CMP EXIT_FLAG,TRUE
JNZ NEXT
MOV AH,4CH
INT 21H
;开关状态检查并设置相应的旗标
;出口参数:若K7-K1全为0,DISP_FLAG=FALSE,否则DISP_FLAG = TRUE
; 若 K8=1,则EXIT_FLAG=TRUE
KEY_TEST:
MOV AL,0
MOV DX,PORT_A
OUT DX,AL
MOV DISP_FLAG,FALSE
MOV DX,PORT_C
IN AL,DX
TEST AL,7FH ;检查K7-K1
JZ KEY_TEST_LP1
MOV DISP_FLAG,TRUE ;至少有一个为1,置显示旗标为真
KEY_TEST_LP1: TEST AL,80H ; 检查K8
JZ KEY_TEST_EXIT
MOV EXIT_FLAG,TRUE
KEY_TEST_EXIT: RET
KEY_INPUT:
MOV AH,7 ;等待键盘输入,但CRT上不显示
INT 21H
CMP AL,’A’
JB KEY_INPUT_RET ; < A
CMP AL,’J’
JA KEY_INPUT_RET ; > J
MOV DISP_BUF,AL
KEY_INPUT_RET: RET
DISP:
CMP DISP_FLAG,TRUE
JNZ DISP_RET ; 显示旗标为假则不显示
MOV AH,2 ; 输出到CRT
MOV DL,DISP_BUF
INT 21H
MOV AL,DISP_BUF ; 输出到发光二极管
MOV DX,PORT_A
OUT DX,AL
DISP_RET: RET
CODE ENDS
END START
5.编制一个程序,使其能完成:从标准键盘上键入任一数字键时可在LED1~LED6上循环显示出来。要求按键之前,LED1~LED6上同时显示“0”,当键入“E”或“e”键时,结束程序。设8255 A的B口作八段LED显示器的段选口,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,80H
OUT DX,AL
MOV DISPBUF,0
MOV DISP_BIT,00111111B ; LED6-LED1 显示初始数据0
CALL DISP
MOV DISP_BIT,00100000B ;为以后LED6显示做准备
MOV AH,1 ;等待第一次键盘输入
INT 21H
AND AL,0FH
MOV DISPBUF,AL
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -