1. 首先附上工程原理图,Proteus的版本是8.9,有小伙伴需要下载完整工程的,在本文末尾下方给出了全套工程de百度网盘链接~如果要正常运行此工程,需要Proteus8.9及8.9以上版本。
2. 实现的功能是,选择用一位数码管进行倒计时的显示,当主持人按下“启动”按键后,LED灯变为绿色,此时等待选手进行抢答,抢答人按下按键后,对应的指示灯会亮起,例如说三号抢答人按下抢答按键,那么计时的数码管会停止计时,并且对应的三号指示灯会亮起,如下图所示。
3. 在程序方面,首先定义8255控制字和数码管的断码显示,有很多伙伴不知道该怎么定义8255的控制字,具体方法见我的上一篇博客《微机原理-8259下降沿中断-计数实验》,下面附上工程总代码。
;====================================================================
DATA SEGMENT
;U1
IOCON EQU 8006H ;设置com
IOA EQU 8000H ;设置A端口
IOB EQU 8002H ;设置B端口
IOC EQU 8004H ;设置C端口
;U2
IOCON2 EQU 9006H ;设置com
IOA2 EQU 9000H ;设置A端口
IOB2 EQU 9002H ;设置B端口
IOC2 EQU 9004H ;设置C端口
X0 DB 0FEH
X1 DB 0FDH
X2 DB 0FBH
X3 DB 0F7H
X4 DB 0EFH
X5 DB 0DFH
X6 DB 0BFH
X7 DB 07FH
DISPLAY DB 6FH, 7FH, 07H, 7DH, 6DH, 66H, 4FH, 5BH, 06H
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV BX,OFFSET DISPLAY ;把DISPLAY的有效地址送到BX
MOV AL,80H ;设置8255(1)的工作方式:方式0
MOV DX,IOCON
OUT DX,AL
MOV AL,80H ;设置8255(2)的工作方式:方式0
MOV DX,IOCON2
OUT DX,AL
MOV DX,IOC ;按键保持高电平状态
MOV AL,0FFH
OUT DX,AL
MOV DX,IOC2 ;按键保持高电平状态
MOV AL,0FFH
OUT DX,AL
MOV DX,IOA2
MOV AL,0FFH
OUT DX,AL
MOV AL,0FFH ;设置LED灯初始保持关闭状态
MOV DX,IOB
OUT DX,AL
MOV CX,9 ;设置重复次数
BEGIN:
MOV DX,IOC2 ;获取IOC2的状态
IN AL,DX ;把IOC2的状态传送到累加器AX(AL)
CMP AL,X0 ;主持人按下启动
JE TIMER
JMP BEGIN
TIMER:
MOV AL,0FEH
MOV DX,IOA2
OUT DX,AL
MOV DX,IOC ;获取IOC的状态
IN AL,DX ;把IOC的状态传送到累加器AX(AL)
CMP AL,X0 ;比较两个数的大小 LED0
JE LED0
CMP AL,X1 ;比较两个数的大小 LED1
JE LED1
CMP AL,X2 ;比较两个数的大小 LED2
JE LED2
CMP AL,X3 ;比较两个数的大小 LED3
JE LED3
CMP AL,X4 ;比较两个数的大小 LED4
JE LED4
CMP AL,X5 ;比较两个数的大小 LED5
JE LED5
CMP AL,X6 ;比较两个数的大小 LED6
JE LED6
CMP AL,X7 ;比较两个数的大小 LED7
JE LED7
MOV DX,IOA
MOV AL,[BX] ;取一个数据送到AL
OUT DX,AL ;IO输出对应断码
INC BX ;修改地址指针
DEC CX ;循环次数减1
JZ LED ;CX=0跳转LED
CALL DELAY1 ;延时一段时间
JMP TIMER
LED0: MOV AL,X0
MOV DX,IOB
OUT DX,AL
MOV AL,0FDH
MOV DX,IOA2
OUT DX,AL
JMP STOP
LED1: MOV AL,X1
MOV DX,IOB
OUT DX,AL
MOV AL,0FDH
MOV DX,IOA2
OUT DX,AL
JMP STOP
LED2: MOV AL,X2
MOV DX,IOB
OUT DX,AL
MOV AL,0FDH
MOV DX,IOA2
OUT DX,AL
JMP STOP
LED3: MOV AL,X3
MOV DX,IOB
OUT DX,AL
MOV AL,0FDH
MOV DX,IOA2
OUT DX,AL
JMP STOP
LED4: MOV AL,X4
MOV DX,IOB
OUT DX,AL
MOV AL,0FDH
MOV DX,IOA2
OUT DX,AL
JMP STOP
LED5: MOV AL,X5
MOV DX,IOB
OUT DX,AL
MOV AL,0FDH
MOV DX,IOA2
OUT DX,AL
JMP STOP
LED6: MOV AL,X6
MOV DX,IOB
OUT DX,AL
MOV AL,0FDH
MOV DX,IOA2
OUT DX,AL
JMP STOP
LED7: MOV AL,X7
MOV DX,IOB
OUT DX,AL
MOV AL,0FDH
MOV DX,IOA2
OUT DX,AL
JMP STOP
STOP: MOV DX,IOA
MOV AL,[BX] ;取一个数据送到AL
OUT DX,AL ;IO输出对应断码
MOV DX,IOC2
IN AL,DX
CMP AL,X1
JE START
JMP STOP
LED: MOV AL,0F0H ;如果没人抢答,四个LED闪烁
MOV DX,IOB
OUT DX,AL
CALL DELAY2
MOV AL,0FFH
MOV DX,IOB
OUT DX,AL
CALL DELAY2
MOV AL,0F0H
MOV DX,IOB
OUT DX,AL
CALL DELAY2
MOV AL,0FFH
MOV DX,IOB
OUT DX,AL
CALL DELAY2
MOV AL,0F0H
MOV DX,IOB
OUT DX,AL
CALL DELAY2
MOV AL,0FFH
MOV DX,IOB
OUT DX,AL
CALL DELAY2
MOV BX,OFFSET DISPLAY ;把DISPLAY的有效地址送到BX
MOV CX,9 ;设置重复次数
JMP TIMER
DELAY1:
PUSH AX
PUSH CX
MOV CX,0004H
DELY2:
CALL DELAY2
LOOP DELY2
POP CX
POP AX
RET
DELAY2:
PUSH CX
MOV CX,0f000H
;--------------------------------------;
MOV DX,IOC ;获取IOC的状态
IN AL,DX ;把IOC的状态传送到累加器AX(AL)
CMP AL,X0 ;比较两个数的大小 LED0
JE LED0
CMP AL,X1 ;比较两个数的大小 LED1
JE LED1
CMP AL,X2 ;比较两个数的大小 LED2
JE LED2
CMP AL,X3 ;比较两个数的大小 LED3
JE LED3
CMP AL,X4 ;比较两个数的大小 LED4
JE LED4
CMP AL,X5 ;比较两个数的大小 LED5
JE LED5
CMP AL,X6 ;比较两个数的大小 LED6
JE LED6
CMP AL,X7 ;比较两个数的大小 LED7
JE LED7
;--------------------------------------;
DELA1:
LOOP DELA1
POP CX
RET
ENDLESS:
JMP ENDLESS
CODE ENDS
END START
链接:https://pan.baidu.com/s/1Y1wt6FHzAO06aHvpFfdVbQ
提取码:4gvm