题目:初始时请将开关全拨向后(为“0”),此时实验箱扩展板上8位8段LED显示器全显示“H”。当开关K8~K1状态为“00010000”时,最左边两位LED显示器上同时从a段到dp段轮流点亮,并重复;当开关K8~K1状态为“10010000”时,8位8段LED显示器从左到右显示“56565656”。当只有开关K2拨向前时,8位8段LED显示器的右边4位同时显示“L”(左边四位不显示),程序结束。
硬件连线:扩展实验板上8255的片选信号接CS2,B口接开关,C口接扩展实验板上八段LED的段选,A口接扩展实验板上八段LED的位选。
实验器材:
1.PD-32实验箱
2.DeChangTS调试环境
代码实现:
.486
;定义端口地址
PORTA EQU 320H
PORTB EQU 324H
PORTC EQU 328H
CTRL EQU 32CH
CODE SEGMENT USE16
ASSUME CS:CODE
ORG 1000H
JMP START
DISMEM DB 0,1,2,3,4,5,6,7,8,9
DB 10,11,12,13,14,15,16,17,18
SEGPT DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH
DB 6DH,7DH,6DH,7DH,6DH,7DH,6DH,7DH ;SI+9
START:
MOV DX,CTRL ;写入控制字
MOV AL,10000010B ;B口开关输入,A口输出位选,C口输出段选
OUT DX,AL ;初始化程序
DEFAULT: ;设置数码管默认显示数值 H
MOV DX,PORTC
MOV AL,76H ;0111 0110B 显示H
OUT DX,AL
MOV DX,PORTA
MOV AL,0FFH ;1111 11111B
OUT DX,AL
RD: MOV DX,PORTB
IN AL,DX ;读取开关状态
CMP AL,00010000B ;开关K4打开则跳转
JZ STATE1
CMP AL,10010000B ;开关K4和K7打开则跳转
JZ STATE2
CMP AL,00000010B ;开关K1打开则跳转
JZ STATE3
JMP DEFAULT
STATE1: ;8位数码管高二位同时由段a~dp循环显示
MOV DX,PORTC
MOV AL,01H
OUT DX,AL
MOV BL,AL
MOV DX,PORTA
MOV AL,0C0H ;1100 0000 数码管位选同时打开高2位
OUT DX,AL
T1: ;类似流水灯循环
CALL DELAY
MOV DX,PORTB
IN AL,DX
CMP AL,10H ;判断开关是否还位于当前状态
JNZ RD
MOV DX,PORTC
ROL BL,1
MOV AL,BL
OUT DX,AL
MOV DX,PORTA
MOV AL,0C0H
OUT DX,AL
JMP T1
STATE2: ;8位数码管从左到右显示56565656
L1:
MOV AH,80H ;1000 0000 = ds1
LEA SI,DISMEM
LEA BX,SEGPT
L2:
MOV AL,[SI+9]
XLAT
MOV DX,PORTC ;seg
OUT DX,AL
MOV DX,PORTA ;ds
MOV AL,AH
OUT DX,AL
MOV CX,400 ;delay
LP:
LOOP LP
MOV DX,PORTB
IN AL,DX
CMP AL,10010000B ;判断开关是否还位于当前状态
JNZ RD
INC SI ;SI+1
SHR AH,1 ;ds+1
JNZ L2
JMP L1
STATE3: ;低4位数码管显示L,程序停止
MOV DX,PORTC
MOV AL,38H;00111000
OUT DX,AL
MOV DX,PORTA
MOV AL,0FH;00001111
OUT DX,AL
JMP WT
WT: JMP WT
DELAY PROC
PUSH ECX
MOV ECX,2FFFFH
DELAY_A:NOP
LOOPD DELAY_A
POP ECX
RET
DELAY ENDP
CODE ENDS
END START