課程設計經典題目:利用 8255A 並行接口控制 16 位 LED,低 8 位 (D7-D0) 從左向右流水,高 8 位 (D15-D8) 從右向左流水,每次僅亮一燈,循環顯示。本文提供完整汇编源碼、硬件連接說明、關鍵指令解析及調試技巧。
640H (A口)、642H (B口)、644H (C口)、646H (控制字)80H:方式 0,A/B/C口均為輸出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 輸出鍵存器。CX 值或改用定時器中斷 (8253/8254) 實現精準定時。80H 為方式 0 基本 I/O 全輸出,若需輸入需修改位 0/1/3。ASSUME CS:CODE 僅告知編譯器,運行時需確保 CS:IP 指向入口。