首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

8086 汇编語言實戰:雙向流水燈控制程序設計與調試詳解

     編輯:程式設計疑難解答

8086 汇编實現雙向流水燈:D7-D0 左移、D15-D8 右移交替閃爍完整方案

課程設計經典題目:利用 8255A 並行接口控制 16 位 LED,低 8 位 (D7-D0) 從左向右流水,高 8 位 (D15-D8) 從右向左流水,每次僅亮一燈,循環顯示。本文提供完整汇编源碼、硬件連接說明、關鍵指令解析及調試技巧。

硬件接口分配

  • 8255A 基址:640H (A口)、642H (B口)、644H (C口)、646H (控制字)
  • A口 (PA7-PA0) 接 D15-D8,B口 (PB7-PB0) 接 D7-D0
  • 控制字 80H:方式 0,A/B/C口均為輸出

完整汇编源碼 (MASM/TASM 兼容)

SSTACK SEGMENT STACK
    DW 32 DUP(?)
SSTACK ENDS

CODE SEGMENT
    ASSUME CS:CODE
START:
    ; 初始化 8255A
    MOV DX, 0646H       ; 控制字端口
    MOV AL, 80H         ; 方式0,全輸出
    OUT DX, AL
    
    ; 初始燈態:D7亮(最左),D8亮(最右) -> 10000000B / 00000001B
    MOV BX, 8001H       ; BH=80H(D7), BL=01H(D8)
    
MAIN_LOOP:
    ; 輸出低8位 (D7-D0) - B口 640H
    MOV DX, 0640H
    MOV AL, BH
    OUT DX, AL
    ROR BH, 1           ; 循環右移:80H→40H→20H→10H→08H→04H→02H→01H→80H...
                        ; 視覺效果:左→右流水 (D7→D6→...→D0→D7)
    
    ; 輸出高8位 (D15-D8) - A口 642H
    MOV DX, 0642H
    MOV AL, BL
    OUT DX, AL
    ROL BL, 1           ; 循環左移:01H→02H→04H→08H→10H→20H→40H→80H→01H...
                        ; 視覺效果:右→左流水 (D8→D9→...→D15→D8)
    
    CALL DELAY
    CALL DELAY          ; 雙重延時,降低頻率便於觀察
    JMP MAIN_LOOP

DELAY PROC NEAR
    PUSH CX
    MOV CX, 0F000H      ; 外層計數
DELAY_OUTER:
    PUSH AX
    POP AX              ; 空操作消耗周期 (約 4 時鐘)
    LOOP DELAY_OUTER
    POP CX
    RET
DELAY ENDP

CODE ENDS
END START

關鍵指令深度解析

  • ROR BH, 1:循環右移,最低位移入最高位、CF標誌。80H(10000000) → 40H(01000000) → ... → 01H(00000001) → 80H,對應 LED 從左向右移動。
  • ROL BL, 1:循環左移,最高位移入最低位、CF標誌。01H(00000001) → 02H(00000010) → ... → 80H(10000000) → 01H,對應 LED 從右向左移動。
  • OUT DX, AL:將 AL 值送至 DX 指定的 I/O 端口,驅動 8255A 輸出鍵存器。

調試與擴展建議

  1. 單步調試:使用 MASM/TASM + DEBUG 或 Emu8086,設置斷點觀察 BX 寄存器變化、端口輸出波形。
  2. 頻率校準:根據 CPU 主頻調整 CX 值或改用定時器中斷 (8253/8254) 實現精準定時。
  3. 擴展功能:添加按鍵中斷控制速度/暫停/方向反轉;使用移位寄存器 (74HC595) 擴展至 32/64 位 LED。

常見錯誤避坑

  • 端口地址錯誤:確認 8255A 片選電路,實際地址可能非 640H-646H。
  • 控制字配置錯:80H 為方式 0 基本 I/O 全輸出,若需輸入需修改位 0/1/3。
  • 段寄存器未初始化:ASSUME CS:CODE 僅告知編譯器,運行時需確保 CS:IP 指向入口。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved