CODE
SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE
ORG 32F0H
PA
PB
PC
PCTL
EQU 0FFD8H
EQU 0FFD9H
EQU 0FFDAH
EQU 0FFDBH
;8255 A 端口地址
;B
;C
;8255 控制端口地址
Port0
Port1
EQU 0FFE0H
EQU 0FFE1H
;8259O 偶地址端口
;奇地址端口
ccp EQU 0FFE3H
cp2 EQU 0FFE2H
;8253 控制端口
;8253 计数器 2 的端口
COUNT DB 00H
Start:
CLI
CALL for8255
CALL TRFF1
MOV AX,OFFSET INT8259
MOV BX,0034H
MOV [BX],AX
MOV BX,0036H
MOV AX,0000H
MOV [BX],AX
CALL FOR8259
CALL FOR8253
STI
JMP CON
CON:
;设置新的中断向量
;8259 写入初始化命令字与操作命令字
;==============================
INT8259: CLI
MOV CX,08H
MOV AL,90H
MOV DX,PCTL
OUT DX,AL
;各端口均输出, 均工作在方式 0
P31:
P32:
CMP COUNT,00H
JZ P32
MOV DX,PC
MOV AL,9EH
OUT DX,AL
DEC DX
MOV AL,70H
OUT DX,AL
CALL DELAY2
MOV DX,PC
MOV AL,0BEH
OUT DX,AL
DEC DX
MOV AL,0F0H
OUT DX,AL
CALL DELAY2
LOOP P31
CALL TRFF1
CALL DELAY2
JMP P33
MOV DX,PC
MOV AL,0F3H
OUT DX,AL
DEC DX
MOV AL,0C0H
OUT DX,AL
CALL DELAY2
MOV DX,PC
MOV AL,0F7H
OUT DX,AL
DEC DX
MOV AL,0D0H
OUT DX,AL
CALL DELAY2
LOOP P32
MOV DX,PC
MOV AL,0AEH
OUT DX,AL
DEC DX
MOV AL,0B0H
;1、3 路口的红灯亮,2、4 路口的黄灯亮
; 1、3 路口的红灯亮,2、4 路口的黄灯灭
;1、3 路口的黄灯亮,2、4 路口的红灯亮
;1、3 路口的黄灯灭,2、4 路口的红灯亮
OUT DX,AL
;CALL DELAY2
;1,3 路口红灯亮,2 ,4 路口绿灯亮
P33: CMP COUNT,0
JZ P34
MOV COUNT,00H
JMP P35
P34: MOV COUNT,01H
P35: CALL FOR8253
CALL DELAY2
MOV AL,20H
MOV DX,Port0
OUT DX,AL
STI
IRET
;==============================
FOR8259:MOV AL,1BH
MOV DX,Port0
OUT DX,AL
;写入 ICW1
;8259 初始化命令字
00011011
MOV AL,08H
MOV DX,Port1
OUT DX,AL
MOV AL,09H
OUT DX,AL
MOV AL,0DFH
OUT DX,AL
RET
;写入 ICW2
00001000
;写入 ICW4
;IRQ5 未被屏蔽 写入中断屏蔽字 11011111
;==============================
for8255:MOV AL,90H
;各端口均输出, 均工作在方式 0
MOV DX,PCTL
OUT DX,AL
MOV DX,PC
MOV AL,0B6H
OUT DX,AL
DEC DX
MOV AL,0D0H
OUT DX,AL
;MOD:0,
;注 PB3~0 无关
;四个红灯全点亮
CALL DELAY1
RET
;==============================
FOR8253:MOV DX,0FFE3H ;控制寄存器的端口
MOV AL,90H
OUT DX,AL
MOV DX,0FFE2H
MOV AL,00H
OUT DX,AL
MOV AL,07H
OUT DX,AL
RET
;计数器 2 的端口地址
;各端口均输出, 均工作在方式 0
;MOD:0,
;1、3 路口的绿灯亮,2、4 路口的红灯亮
;==============================
TRFF1:MOV DX,PCTL
MOV AL,90H
OUT DX,AL
MOV AL,75H
MOV DX,PC
OUT DX,AL
DEC DX
MOV AL,0D0H
OUT DX,AL
RET
;==============================
DELAY1: PUSH AX
PUSH CX
MOV CX,0030H
DELY2: CALL DELAY2
LOOP DELY2
POP CX
POP AX
RET
DELAY2: PUSH CX
MOV CX,9000H
LOOP $
POP CX
RET
CODE
ENDS
END Start