8086与8255接口改地址后LED常亮问题求助
8086+8255端口LED闪烁问题的代码修改方案
电路说明
- 无译码器电路示意图
- 带译码器电路示意图
问题背景
搭建了8086与8255接口的Proteus电路实现端口LED闪烁,旧电路端口地址为00H、02H、04H、06H(Q1、Q2直接连A0、A1)时代码运行正常;修改端口地址为30H、31H、32H、33H后,LED始终常亮,确认译码器逻辑及片选信号正常,需排查代码问题。
旧地址版本代码
.MODEL SMALL .DATA PORTA EQU 00H PORTB EQU 02H PORT_CON EQU 06H .CODE MOV AX, '@DATA' MOV DS, AX MOV DX, PORT_CON MOV AL, 80H OUT DX, AL MOV DX, PORTA BLINK: MOV AL, 00H OUT DX, AL CALL DELAY MOV AL, 0FFH OUT DX, AL CALL DELAY JMP BLINK DELAY: MOV CX, 0FFFFH LOOP1: LOOP LOOP1 RET END
新地址版本代码
.MODEL SMALL .STACK 100H .DATA PA EQU 30H PB EQU 31H PC EQU 32H PCON EQU 33H .CODE MOV AX, '@DATA' MOV DS, AX MOV DX, PCON MOV AL, 80H OUT DX, AL MOV DX, PA BLINK: MOV AL, 00H OUT DX, AL CALL DELAY MOV AL, 0FFH OUT DX, AL CALL DELAY JMP BLINK DELAY: MOV CX, 0FFFFH LOOP1: LOOP LOOP1 RET END
代码问题分析与修改要点
核心问题
8086中,用DX寄存器传递端口地址时,高8位DH未清零。新代码中MOV DX, PCON仅给DL赋值33H,DH保留随机初始值,实际访问的端口地址为XX33H(XX为DH随机值),而非预期的0033H,导致8255无法接收正确的控制字和输出数据。旧代码能运行是因为模拟环境中DH恰好为0,属于巧合,并非可靠写法。
修改方案
方案1:直接寻址(推荐,适用于8位端口地址)
直接使用OUT AL, 端口号指令访问8位端口,无需DX寄存器,避免高8位问题:
.MODEL SMALL .STACK 100H .DATA PA EQU 30H PB EQU 31H PC EQU 32H PCON EQU 33H .CODE MOV AX, '@DATA' MOV DS, AX ; 直接设置8255控制字 MOV AL, 80H OUT PCON, AL BLINK: ; 输出低电平点亮LED MOV AL, 00H OUT PA, AL CALL DELAY ; 输出高电平熄灭LED MOV AL, 0FFH OUT PA, AL CALL DELAY JMP BLINK DELAY: MOV CX, 0FFFFH LOOP1: LOOP LOOP1 RET END
方案2:间接寻址(需清零DX)
若坚持用DX传递地址,需先清零DX确保高8位为0:
.MODEL SMALL .STACK 100H .DATA PA EQU 30H PB EQU 31H PC EQU 32H PCON EQU 33H .CODE MOV AX, '@DATA' MOV DS, AX ; 清零DX后加载控制端口地址 XOR DX, DX MOV DL, PCON MOV AL, 80H OUT DX, AL ; 清零DX后加载Port A地址 XOR DX, DX MOV DL, PA BLINK: MOV AL, 00H OUT DX, AL CALL DELAY MOV AL, 0FFH OUT DX, AL CALL DELAY JMP BLINK DELAY: MOV CX, 0FFFFH LOOP1: LOOP LOOP1 RET END
内容的提问来源于stack exchange,提问作者Karan Ahuja
相关产品推荐
相关产品推荐

