www.pudn.com > 8255trafficlight.rar > 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