MY8255_A EQU 0A860H;8255A口地址
MY8255_B EQU 0A861H;8255B口地址
MY8255_C EQU 0A862H;8255C口地址
MY8255_MODE EQU 0A863H;8255控制口地址
CODE SEGMENT
ASSUME CS:CODE
START: MOV DX,MY8255_MODE
MOV AL,82H
OUT DX,AL ;將控制字82H寫入8255控制口,A口方式0輸出,B口方式0輸入, C口未用到。
A1: MOV DX,MY8255_B
IN AL,DX ;讀8255 B口內容
MOV DX,MY8255_A
OUT DX,AL ; 將前面讀到的B口內容送到A口,即A口內容=B口內容
CALL BREAK ;調用子程序BREAK
JMP A1 ;跳轉到A1
BREAK PROC NEAR ;BREAK子程序
MOV AH,1
INT 16H
JZ RETURN ;讀按鍵字符,ZF=1,則返回;ZF=0,則AL=字符
MOV AX,4C00H
INT 21H ;返回DOS
RETURN:RET
BREAK ENDP
CODE ENDS
END START
;流水燈顯示
MY8255_A EQU 0b860H;8255A口地址
MY8255_B EQU 0b861H;8255B口地址
MY8255_C EQU 0b862H;8255C口地址
MY8255_MODE EQU 0b863H;8255控制口地址
DATA SEGMENT
LA DB ?;留出1個字節
LB DB ?;留出1個字節
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DX,MY8255_MODE
MOV AL,80H
OUT DX,AL ;控制字80H送入8255控制口,A口、B口都是方式0輸出,C口未用到。
MOV DX,MY8255_A
MOV AL,7FH
OUT DX,AL ;將7FH送入A口
MOV LA,AL ;將7FH送入LA存儲單元
MOV DX,MY8255_B
MOV AL,0FEH
OUT DX,AL ;將FEH送入B口
MOV LB,AL ;將FEH送入LB存儲單元
CALL DALLY
A1: MOV AL,LA
ROR AL,1 ;LA內容循環右移1次
MOV LA,AL
MOV DX,MY8255_A
OUT DX,AL ;將循環右移後的LA內容送A口,其目的是讓A口連接的LED燈依次向右循環點亮
MOV AL,LB
ROL AL,1 ;LB內容循環左移1次
MOV LB,AL
MOV DX,MY8255_B
OUT DX,AL ;將循環左移後的LB內容送B口,其目的是讓B口連接的LED燈依次向左循環點亮
CALL DALLY ;延時,讓壹個LED燈發光穩定之後再點亮另壹個
CALL BREAK ;調用BREAK子程序,看是否有鍵按下
JMP A1 ;跳轉到A1
DALLY: MOV CX,3FFH ;延時子程序
D1: MOV AX,0FFFFH
D2: DEC AX
JNZ D2
LOOP D1
RET
BREAK PROC NEAR ;是否有鍵按下
MOV AH,06H
MOV DL,0FFH
INT 21H
JE RETURN ;若無,則轉RETURN
MOV AX,4C00H
INT 21H ;返回DOS
RETURN:RET
BREAK ENDP
CODE ENDS
END START