STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS DATA SEGMENT TIME DB 00H,06H LEDTAL DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,73H,38H COUNT DW 0 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATA MOV DS,AX
;填IR0中斷向量 PUSH DS MOV AX,0000H MOV DS,AX MOV AX,OFFSET IRQ0 ADD AX,2000H MOV SI,0020H MOV [SI],AX MOV AX,0000H MOV SI,0022H MOV [SI],AX CLI POP DS IN AL,21H AND AL,0FEH;清除對IRQ0的中斷 OUT 21H,AL
;填IR2中斷向量 PUSH DS MOV AX,0000H MOV DS,AX MOV AX,OFFSET IRQ2 ADD AX,2000H MOV SI,0028H MOV [SI],AX MOV AX,0000H MOV SI,002AH MOV [SI],AX CLI POP DS IN AL,21H AND AL,0FBH;清除對IRQ2的中斷 OUT 21H,AL
;填IRQ5中斷向量 PUSH DS MOV AX,0000H MOV DS,AX MOV AX,OFFSET IRQ5 ADD AX,2000H MOV SI,0034H MOV [SI],AX MOV AX,0000H MOV SI,0036H MOV [SI],AX CLI POP DS IN AL,21H AND AL,0DFH;清除對IRQ5的中斷 OUT 21H,AL
;填IRQ6中斷向量 PUSH DS MOV AX,0000H MOV DS,AX MOV AX,OFFSET IRQ6 ADD AX,2000H MOV SI,0038H MOV [SI],AX MOV AX,0000H MOV SI,003AH MOV [SI],AX CLI POP DS IN AL,21H AND AL,0BFH;清除對IRQ6的中斷 OUT 21H,AL
;填IRQ7中斷向量 PUSH DS MOV AX,0000H MOV DS,AX MOV AX,OFFSET IRQ7 ADD AX,2000H MOV SI,003CH MOV [SI],AX MOV AX,0000H MOV SI,003EH MOV [SI],AX CLI POP DS IN AL,21H AND AL,7FH;清除對IRQ7的中斷 OUT 21H,AL
;NORMAL表示正常情況下的倒計時 NORMAL:MOV AL,80H ;8255A初始化,A,B口方式0輸出,C口輸出 OUT 63H,AL
MOV AL,0B6H ;8253A初始化,計數器2方式3 OUT 43H,AL MOV AX,59500 OUT 42H,AL MOV AL,AH OUT 42H,AL
MOV COUNT,0 STI
FANS1:MOV AL,0B7H ;FANS1表示主干道綠燈,次干道紅燈。LED顯示60-5秒 OUT 61H,AL CALL DISP CMP COUNT,20 JL FANS1 MOV COUNT,0 MOV DI,OFFSET TIME MOV AL,[DI+1] CMP AL,00H JZ A5 MOV AL,[DI] CMP AL,00H JZ A6 DEC AL MOV [DI],AL JMP FANS1 A5: MOV AL,[DI] CMP AL,06H JZ A0 DEC AL MOV [DI],AL JMP FANS1 A6: MOV AL,9 MOV [DI],AL MOV AL,[DI+1] DEC AL MOV [DI+1],AL JMP FANS1 A0: MOV AL,05H MOV [DI],AL JMP FANS21 ;FANS21和FANS22表示次干道紅燈,主干道隔一秒黃燈亮一次。LED顯示5-1秒,再由1秒跳為45秒 FANS21:MOV AL,9DH ;FANS21表示主干道黃燈,次干道紅燈 OUT 61H,AL CALL DISP CMP COUNT,20 JL FANS21 MOV COUNT,0 MOV DI,OFFSET TIME MOV AL,[DI] CMP AL,01H JZ A7 DEC AL MOV [DI],AL JMP FANS22 A7: MOV AL,4 MOV [DI+1],AL MOV AL,5 MOV [DI],AL JMP FANS3
FANS22:MOV AL,0BFH ;FANS22表示次干道紅燈,主干道不亮燈 OUT 61H,AL CALL DISP CMP COUNT,20 JL FANS22 MOV COUNT,0 MOV DI,OFFSET TIME MOV AL,[DI] CMP AL,01H JZ A7 DEC AL MOV [DI],AL JMP FANS21
FANS3:MOV AL,7BH ;FANS3表示主干道紅燈,次干道綠燈。LED顯示45-5秒 OUT 61H,AL CALL DISP CMP COUNT,20 JL FANS3 MOV COUNT,0 MOV DI,OFFSET TIME MOV AL,[DI+1] CMP AL,00H JZ A8 MOV AL,[DI] CMP AL,00H JZ A9 DEC AL MOV [DI],AL JMP FANS3 A8: MOV AL,[DI] CMP AL,06H JZ A1 DEC AL MOV [DI],AL JMP FANS3 A9: MOV AL,9 MOV [DI],AL MOV AL,[DI+1] DEC AL MOV [DI+1],AL JMP FANS3 A1: MOV AL,05H MOV [DI],AL JMP FANS41
;FANS41和FANS42表示主干道紅燈,次干道隔一秒黃燈亮一次。LED顯示5-1秒,再由1秒跳為60秒 FANS41:MOV AL,6EH ;FANS41表示主干道紅燈,次干道黃燈 OUT 61H,AL CALL DISP CMP COUNT,20 JL FANS41 MOV COUNT,0 MOV DI,OFFSET TIME MOV AL,[DI] CMP AL,01H JZ A10 DEC AL MOV [DI],AL JMP FANS42 A10: MOV AL,6 MOV [DI+1],AL MOV AL,0 MOV [DI],AL JMP FANS1
FANS42:MOV AL,7FH ;FANS41表示主干道紅燈,次干道不亮燈 OUT 61H,AL CALL DISP CMP COUNT,20 JL FANS42 MOV COUNT,0 MOV DI,OFFSET TIME MOV AL,[DI] CMP AL,01H JZ A10 DEC AL MOV [DI],AL JMP FANS41 ;以上執行完105秒為一個循環,再跳回FANS1重新開始循環
;以下為遇到特殊情況的中斷
;IRQ0的中斷服務程序 IRQ0: MOV AL,20H ;遇到特殊情況,主干道一直保持通行(綠燈),次干道保持禁止通行(紅燈)狀態;LED顯示'SP'表示'STOP'由按鍵KK1-控制 OUT 20H,AL L7: STI MOV DI,OFFSET TIME MOV AL,5 MOV [DI+1],AL MOV AL,10 MOV [DI],AL MOV AL,0B7H OUT 61H,AL CALL DISP JMP L7 IRET
;IRQ2的中斷服務程序 IRQ2: MOV AL,20H ;在午夜車流量較少時,黃燈每隔0.5秒亮一次;LED顯示'LS'表示'LOW SPEED'由按鍵KK2-控制 OUT 20H,AL STI MOV DI,OFFSET TIME MOV AL,11 MOV [DI+1],AL MOV AL,5 MOV [DI],AL L3: MOV COUNT,0 L0: MOV AL,0CCH OUT 61H,AL CALL DISP CMP COUNT,10 JL L0 MOV COUNT,0 L1: MOV AL,0FFH OUT 61H,AL CALL DISP CMP COUNT,10 JL L1 JMP L3 IRET
;IRQ5的中斷服務程序 IRQ5: MOV AL,20H ;完成復位從45秒開始進入NORMAL狀態由開關K0控制 OUT 20H,AL MOV DI,OFFSET TIME MOV AL,4 MOV [DI+1],AL MOV AL,5 MOV [DI],AL MOV AL,88H ;8255A初始化,A,B口方式0輸出,C低四位口輸出,高四位輸入 OUT 63H,AL MOV AL,0B6H ;8253A初始化,計數器2方式3 OUT 43H,AL MOV AX,59500 OUT 42H,AL MOV AL,AH OUT 42H,AL MOV COUNT,0 STI JMP FANS3 IRET
;IRQ6的中斷服務程序 IRQ6: MOV AL,20H ;完成復位從60秒開始進入NORMAL狀態由開關K1控制 OUT 20H,AL MOV DI,OFFSET TIME MOV AL,6 MOV [DI+1],AL MOV AL,0 MOV [DI],AL JMP NORMAL IRET
;IRQ7的中斷服務程序 IRQ7: INC COUNT ;由8253的OUT2控制,每隔50ms發一次中斷,讓COUNT值加1 MOV AL,20H OUT 20H,AL IRET
;顯示子程序 DISP PROC NEAR MOV DI,OFFSET TIME MOV CL,0FEH ST1: MOV AL,CL TEST AL,04H ;判斷顯示到第幾位,是否顯示到最高位 JZ ED OUT 62H,AL ;C口低四位做輸入用于選擇哪個LED亮 ROL AL,01H ;讓下一位LED燈管顯示 MOV CL,AL MOV AL,[DI] MOV BX,OFFSET LEDTAL XLAT OUT 60H,AL ;A口做輸出用于LED顯示 CALL DELAY INC DI JMP ST1 ED: RET ;每個LED都顯示完畢 DISP ENDP
;延時子程序 DELAY PROC NEAR PUSH CX MOV CX,2000 ;0.5ms,每0.5ms就切換一次LED燈管的顯示,給人視覺各個LED是同時亮 WAIT: LOOP WAIT POP CX RET DELAY ENDP CODE ENDS END START
|