3、 程序
;十字路口交通控制器 DATA SEGMENT SETTIME DB ? ;用户设置的通行时间 NOWTIME DB ? ;当前计时时间 TIME1 EQU 10 TIMEOT1 DB TIME1 ;0.5秒定时单元 TIME2 EQU 2 TIMEOT2 DB TIME2 ;1秒定时单元 FLAG DB 1 ;闪烁标志 ONOFF DB 1 ;亮灭标志 LEFT DB 1 ;南北向和东西向标志 TAB DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;0~9的显示码 DATA ENDS STACK SEGMENT STACK DW 64 DUP(?) ;定义堆栈段 STACK ENDS
CODE SEGMENT ;代码段定义 ASSUME CS:CODE,DS:DATA ;段指定
START: MOV AX,DATA MOV DS,AX PUSH DS ;当前用户DS段入栈保存 MOV AX,0000H MOV DS,AX ;修改DS=0000H,指向中断矢量表所在段 MOV AX,OFFSET IRQ0 ;取出中断处理子程序的入口偏移地址(以0为基准) ADD AX,2000H ;修正,实际地址=装入地址的偏移量+相对于0起始的偏移量 MOV SI,0020H ;IR0中断矢量号为08H,处于矢量表的20H~23H MOV [SI],AX ;将偏移地址装入矢量表 MOV AX,0000H MOV SI,0022H MOV [SI],AX ;将段地址(0000H)装入矢量表 POP DS ;恢复用户数据段DS MOV AL,0FCH ;D1,D0位复位为0 OUT 21H,AL ;写入OCW1(IMR);开放8259A的IR1和IR0中断 MOV AL,34H ;设定8253通道0的工作方式,00110100B OUT 43H,AL ;CH0采用先写低8位,后写高8位,方式2,二进制计数
MOV OUT MOV OUT STI MOV OUT 口低4位输出 IN AND MOV MOV
A1: MOV TEST JZ MOV TEST JNZ MOV OUT MOV OUT JMP A2: MOV AND MOV XLAT OUT MOV OUT CALL MOV MOV ROR AND MOV XLAT OUT MOV OUT CALL
AX,59500
;计数初值为59500,输出20HZ信号,定时0.05秒 40H,AL ;写入CH0
AL,AH 40H,AL ;开中断
AL,88H ;写入8255A的方式控制字,设定工作方式为10001000B 63H,AL
;即A口方式0输出,C口高4位输入,B口方式0输出,CAL,62H ;循环读出C口的四个开关状态(PC4~PC7) AL,0F0H ;高四位为00~90秒
SETTIME,AL ;读取用户设定的通行时间
NOWTIME,AL AL,FLAG AL,01H A2 ;不闪烁,则转显示
AL,ONOFF ;闪烁标志为1,闪烁,则测试是亮,还是灭 AL,01H A2 ;为1,说明亮,则转A2
AL,0FH 62H,AL AL,00H 61H,AL ;灭,则关闭显示 A3
AL,NOWTIME ;取出当前剩余时间的低位
AL,0FH
BX,OFFSET TAB ;查表转换为显示码
61H,AL AL,05H ;PC0~PC3为0101B,允许X2、X4数码管选通
62H,AL DALEY
AL,NOWTIME CL,4 AL,CL AL,0FH ;取出当前剩余时间的高位 BX,OFFSET TAB 61H,AL AL,0AH 62H,AL ;PC0~PC3为1010B,允许X1、X3数码管选通
DALEY
A3: MOV AL,LEFT TEST AL,01H JZ A5 ;测试是南北向通行,还是东西向通行 MOV AL,FLAG ;东西向通行 TEST AL,01H ;测试是否应让黄灯亮 JZ A4 ;不是东西向的黄灯亮,则转东西向绿灯亮(南北向红灯亮)
MOV AL,ONOFF ;东西向黄灯亮(南北向红灯亮) TEST AL,01H JNZ A4 ;测试亮灭 MOV AL,0FFH ;关指示灯 OUT 60H,AL JMP EXIT A4: MOV AL,77H ;东西向绿灯亮(南北向红灯亮) OUT 60H,AL JMP EXIT A5: MOV AL,FLAG ;南北向通行 TEST AL,01H ;测试是否应让黄灯亮 JZ A6 ;不是南北向的黄灯亮,则转南北向绿灯亮(东西向红灯亮) MOV AL,ONOFF ;南北向黄灯亮(东西向红灯亮) TEST AL,01H JNZ A6 ;测试亮灭 MOV AL,0FFH ;关指示灯
OUT 60H,AL JMP EXIT A6: MOV AL,0EEH ;南北向绿灯亮(东西向红灯亮) OUT 60H,AL EXIT: JMP A1
;8259A的IR0中断处理子程序(8253的CH0每来59500个脉冲后(定时0.05秒),则执行下面的中断处理程序一次) IRQ0: PUSH AX MOV AL,TIMEOT1 DEC AL JZ IRTIME1 MOV TIMEOT1,AL JMP IREXIT ;不到0.5秒,则退出
IRTIME1:MOV TIMEOT1,TIME1 ;0.5秒定时时间到,重装初值 MOV AL,ONOFF XOR AL,01H MOV ONOFF,AL ;取反亮灭标志 MOV AL,TIMEOT2 DEC AL ;1秒定时单元减1 JZ IRTIME2
MOV TIMEOT2,AL ;1秒不到,保存,退出 JMP IREXIT
IRTIME2:MOV TIMEOT2,TIME2 MOV AL,NOWTIME SUB AL,1 DAS CMP AL,0 JNZ IRTIME3 MOV AL,SETTIME MOV NOWTIME,AL MOV AL,LEFT XOR AL,01H MOV LEFT,AL MOV FLAG,00H JMP IREXIT
IRTIME3:MOV NOWTIME,AL CMP AL,04H JAE IRTIME4 MOV FLAG,01H JMP IREXIT
IRTIME4:MOV FLAG,00H
IREXIT: MOV AL,20H OUT 20H,AL POP AX IRET ;延时子程序
DALEY: PUSH CX MOV CX,0010H DALEY1:LOOP DALEY1 POP CX RET CODE ENDS END START
;重装通行时间 ;南北向与东西向通行转换 ;闪烁标志复位(不闪) ;剩余时间小于4秒,则闪烁 ;>3秒,则不闪烁 ;常规EOI中断结束指令 ;写入8259A的OCW2 ;中断返回 ;置内循环次数 ;共循环0010H次,以完成延时