📄 traffic.asm
字号:
DATA SEGMENT
STATE DB ?
T24S DW ?
T5S DW ?
T2S DW ?
T05S DW ?
MESS DB 'PRESS ANY KEY TO EXIT!!!',0DH,0AH,'$'
DATA ENDS
STACK SEGMENT
STA DB 100 DUP(?)
TOP EQU LENGTH STA
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
MAIN PROC FAR
START: MOV AX,STACK ;8086初始化
MOV SS,AX
MOV AX,DATA
MOV DS,AX
MOV AL,1CH ;得原中断向量
MOV AH,35H
INT 21H
PUSH ES
PUSH BX ;保存原中断向量
PUSH DS
MOV DX,OFFSET KING ;设置中断向量
MOV AX,SEG KING ;中断服务程序名KING
MOV DS,AX
MOV AL,1CH
MOV AH,25H
INT 21H
POP DS
IN AL,21H ;设置中断屏蔽位
AND AL,0FEH
OUT 21H,AL
MOV DX,20BH ;8255初始化
MOV AL,10010000B ;A口0方式输入
OUT DX,AL ;B口0方式输出
MOV DX,209H ;清LED
MOV AL,11111111B
OUT DX,AL
MOV STATE,AL
MOV AH,09H ;输出提示信息
LEA DX,MESS
INT 21H
STI ;开中断
MOV DX,208H ;输入车辆状况
IN AL,DX
AND AL,00001100B
CMP AL,00001100B ;判断南北是否有车
JZ EW ;若相等则南北无车,若不等则南北有车
SN: MOV DX,209H
MOV AL,10011001B ;南北绿灯,东西红灯
MOV STATE,AL ;保存交通灯状态
OUT DX,AL
CALL PROA_0 ;南北绿灯24S或南北无车5S东西有车子程序PROA_0
CALL PROA_1 ;南北绿灯闪4S东西红灯子程序 PROA_1
CALL PROA_2 ;南北黄灯2S东西红灯子程序 PROA_2
WAITK: MOV AL,0
MOV AH,06H ;等待有键按下
MOV DL,0FFH
INT 21H
AND AL,AL ;判断是否有键按下
JNZ QUIT ;有输入则跳转至QUIT,无输入则顺序执行
EW: MOV DX,209H
MOV AL,01100110B ;东西绿灯,南北红灯
MOV STATE,AL ;保存交通灯状态
OUT DX,AL
CALL PROB_0 ;东西绿灯24S或东西无车5S南北有车子程序PROB_0
CALL PROB_1 ;东西绿灯闪4S南北红灯子程序 PROB_1
CALL PROB_2 ;东西黄灯2S南北红灯子程序 PROB_2
JMP SN ;跳至"南北绿灯东西红灯"循环执行
QUIT: CLI ;关中断
POP DX
POP ES
PUSH DS
MOV AX,ES
MOV DS,AX
MOV AL,1CH
MOV AH,25H
INT 21H
POP DS ;恢复1CH中断向量
IN AL,21H ;关闭8259的定时中断
OR AL,01H
OUT 21H,AL
MOV DX,209H ;LED清零
MOV AL,11111111B
MOV DX,AL
MOV AX,4C00H ;返回DOS
INT 21H
MAIN ENDP
PROA_0 PROC NEAR ;南北绿灯24S或南北方向无车5S东西方向有车子程序
MOV T24S,437
SKY; MOV T5S,91
S5ONA: MOV DX,208H ;检测南北方向是否有车
IN AL,DX
AND AL,00001100B
CMP AL,00001100B
JZ S5OFA ;无车则跳转判断5S是否已到
S24OFA:CMP T24S,0 ;判断24S是否已到,若到了则退出子程序
JNZ SKY ;24S未到则跳转开始5S计时
RET
S5OFA: CMP T5S,0
JZ JUDGE_0 ;5S未到则跳转判断24S是否结束
SKY_0: CMP T24S,0
JNZ S5ONA
JMP OUT_0
JUDGE_0:MOV DX,208H ;5S到了则判断东西方向是否有车
IN AL,DX
AND AL,00000011B
CMP AL,00000011B
JZ SKY_0 ;东西方向无车则判断24S是否结束
OUT_0: RET ;东西方向有车则退出子程序
PROA_0 ENDP
PROA_1 PROC NEAR ;南北绿灯闪烁4次东西红灯子程序
MOV CX,4 ;置闪烁4次
MOV DX,209H
GOONA: MOV AL,11011101B ;南北绿灯灭东西红灯
MOV STATE,AL
OUT DX,AL
MOV T05S,9 ;延时0.5S
S050A: CMP T05S,0
JNZ 05S0A
MOV AL,10011001B ;南北绿灯东西红灯
MOV STATE,AL
OUT DX,AL
MOV T05S,9 ;延时0.5S
S051A: CMP T05S,0
JNZ 05S1A
DEC CX ;判断闪烁次数是否已到
CMP CX,0
JNZ GOONA ;未到则继续闪烁
RET ;已到则退出子程序
PROA_1 ENDP
PROA_2 PROC NEAR ;南北黄灯2S东西红灯子程序
MOV DX,209H ;南北黄灯东西红灯
MOV AL,00010001B
MOV STATE,AL
OUT DX,AL
MOV T2S,36 ;延时2S
S2OFA: MOV AX,T2S
CMP AX,0
JNZ S2OFA
RET ;退出子程序
PROA_2 ENDP
PROB_0 PROC NEAR ;东西绿灯24S或东西方向无车5S南北方向有车子程序
MOV T24S,437
FOV: MOV T5S,91
S5ONB: MOV DX,208H ;检测东西方向是否有车
IN AL,DX
AND AL,00000011B
CMP AL,00000011B
JZ S5OFB ;无车则跳转判断5S是否已到
S24OFB:CMP T24S,0 ;判断24S是否已到,若到了则退出子程序
JNZ FOV ;24S未到则跳转开始5S计时
RET
S5OFB: CMP T5S,0
JZ JUDGE_1 ;5S未到则跳转判断24S是否结束
FOV_0: CMP T24S,0
JNZ S5ONB
JMP OUT_1
JUDGE_1:MOV DX,208H ;5S到了则判断南北方向是否有车
IN AL,DX
AND AL,00001100B
CMP AL,00001100B
JZ FOV_0 ;南北方向无车则判断24S是否结束
OUT_1: RET ;南北方向有车则退出子程序
PROB_0 ENDP
PROB_1 PROC NEAR ;东西绿灯闪烁4次南北红灯子程序
MOV CX,4 ;置闪烁4次
MOV DX,201H
GOONB: MVO AL,01110111B ;东西绿灯灭南北红灯
MOV STATE,AL
OUT DX,AL
MVO T05S,9 ;延时0.5S
S050B: CMP T05S,0
JNZ S050B
MOV AL,01100110B ;东西绿灯南北红灯
MOV STATE,AL
OUT DX,AL
MVO T05S,9 ;延时0.5S
S051B: CMP T05S,0
JNZ S051B
DEC CX ;判断闪烁次数是否已到
CMP CX,0
JNZ GOONB ;未到则继续闪烁
RET ;已到则退出子程序
PROB_1 ENDP
PROB_2 PROC NEAR ;东西黄灯2S南北红灯子程序
MOV DX,209H ;东西黄灯南北红灯
MOV AL,01000100B
MOV STATE,AL
OUT DX,AL
MOV T2S,36 ;延时2S
S2OFB: MOV AX,T2S
CMP AX,0
JNZ S2OFB
RET ;退出子程序
PROB_2 ENDP
KING PROC NEAR ;中断服务子程序
PUSH AX ;现场保护
PUSH DX
MOV AX,DATA
MOV DS,AX
STI
MOV DX,208H ;读8255A口状态
IN AL,DX
TEST AL,00010000B ;判断J=0?
JZ ACC ;J=0则跳转至ACC执行紧急情况操作
MOV AL,STATE ;交通灯显示恢复
MOV DX,209H
OUT DX,AL
CMP T24S,0 ;(T24S)=0?
JZ COM5S ;(T24S)=0则跳转判断(T5S)=0?
DEC T24S
COM5S: CMP T5S,0
JZ COM2S
DEC T5S
COM2S: CMP T2S,0
JZ COM05S
DEC T2S
COM05S:CMP T05S,0
JZ KINGB
DEC T05S
JMP KINGB
ACC: MOV AL,01010101B ;紧急情况南北东西全部红灯
MOV DX,209H
OUT DX,AL
KINGB: CLI
POP DX ;现场恢复
POP AX
IRET ;中断返回
KING ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -