8086+8255A写数码管Proteus仿真及8086Proteus仿真问题

8086+8255A写数码管Proteus仿真

仿真截图

8086+8255A写数码管Proteus仿真及8086Proteus仿真问题_第1张图片

代码

CODE SEGMENT

DATA SEGMENT
NUM DB 30H,39H
LIST DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
PORTA EQU 288H
PORTB EQU 28AH
PORTC EQU 28CH
PORTCTL EQU 28EH
DATA ENDS

MAIN PROC FAR
ASSUME CS:CODE,DS:DATA;段分配
START:
MOV AX, DATA;段初始化
MOV DS, AX

MOV DX, PORTCTL;写入控制字
MOV AL, 80H
OUT DX, AL
NEXT1:
;MOV DX, PORTCTL;PC0置0;询问老师二者异同
;MOV AL, 00H
;OUT DX, AL
;MOV AL, 03H;PC1置1
;OUT DX, AL
MOV DX, PORTC
MOV AL, 02H
OUT DX, AL

MOV AL, NUM
SUB AL, 30H
MOV BX, OFFSET LIST
XLAT
MOV DX, PORTA
OUT DX, AL
CALL DELAY

;MOV DX, PORTCTL;PC0置1
;MOV AL, 01H
;OUT DX, AL
;MOV AL, 02H;PC1置0
;OUT DX, AL
MOV DX, PORTC
MOV AL, 01H
OUT DX, AL

MOV AL, NUM+1
SUB AL, 30H
MOV BX, OFFSET LIST
XLAT
MOV DX, PORTA
OUT DX, AL
CALL DELAY
JMP NEXT1

MOV AH, 4CH;返回DOS,仿真无用,反正死循环
INT 21H
MAIN ENDP

DELAY PROC NEAR;延时
PUSH SI
PUSH CX
MOV SI, 1
DELAYNEXT1:
MOV CX, 0E000H
DELAYNEXT2:
LOOP DELAYNEXT2
DEC SI
JNZ DELAYNEXT1
POP CX
POP SI
RET
DELAY ENDP

CODE ENDS
END MAIN

遇到的问题

这个简单的仿真我用了很长时间,原因就是遇到了各种各样的仿真问题。

  1. 8086asm编译器问题
    8086汇编需要使用Proteus中MASM32编译器。
    8086+8255A写数码管Proteus仿真及8086Proteus仿真问题_第2张图片
    但是我在选择编译器时遇到了问题。当在建立工程的时候没有选择编译器时,在工程内默认编译器无法更改。更改确定之后仍然不变。只能重新建一个工程,建立时选择MASM32编译器。
    8086+8255A写数码管Proteus仿真及8086Proteus仿真问题_第3张图片
    这个编译器在我这会报一些莫名其妙的错:
    make: *** [Debug.exe] Error 1
    但是在有些工程中又能成功编译。
  2. 芯片兼容问题
    之前在三个74LS245中不小心混进去一个74HCT245,导致数据总线双向缓冲不同步,数据无法输入输出。
  3. Protues中8086数据段定义问题
    在我这,8086的数据段一旦定义在代码段以外,8086将不从第一句代码开始执行,而是跳过前几条。可以通过单步执行debug的方式验证。
    仅仅点击了一下暂停键,就会直接跳到第10行代码开始执行。如下图。
    8086+8255A写数码管Proteus仿真及8086Proteus仿真问题_第4张图片
    不从第一句开始执行的结果自然不正确。解决的方法是将数据段放入代码段中(8086各个段之间允许包含关系)。这样就会恢复正常。
  4. 8255A置位复位控制使用方法
    从仿真电路图中可以看出,我需要将8255A的PC0与PC1写入0或1,以使得两个数码管交替亮起,高频情况下,就可以视觉上达到两个都亮的效果。
    写入PC0与PC1时,有两种方法。一种直接向PORTC输入,一种通过8255A的置位复位控制字完成。可以从代码的注释中看出,我最初使用的是置位复位的方式,这种方式可以成功的将PC0、PC1置0或1。但这种方法会导致下一句写入PORA的代码无效,就是A端口不会有任何输出,数码管自然不会亮起。改用直接向PORTC写入,该问题得以解决。
    这个问题的原因我不太确定,可能8255A置位复位控制字有其他效果我没学习到,亦或者Proteus中8255A仿真模型的bug。

其他说明

这个程序是为了实际DOS系统8086写的,本意是DOS INT 21H输入数字显示。所以会使用查表指令。仿真中无法输入,所以中间许多步骤都是冗余的。

你可能感兴趣的:(proteus,嵌入式硬件)