这是最近几天做的,利用proteus仿真软件,做的八人抢答器~
附图片,代码。和整个工程
最后说一下,我用的proteus 8.6版本
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
8086源程序如下:
- ;====================================================================
- ; Main.asm file generated by New Project wizard
- ;
- ; Created: 周三 十一月 7 2018
- ; Processor: 8086
- ; Compiler: MASM32
- ; Before starting simulation set Internal Memory Size
- ; in the 8086 model properties to 0x10000
- ;====================================================================
- 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
复制代码
所有资料51hei提供下载:
八人抢答器.rar
(81.07 KB, 下载次数: 122)
|