📄 mainx.asm
字号:
DATA SEGMENT
KEEP_CS DW ? ;保存ic号中断向量原来的段基址
KEEP_IP DW ? ;保存ic号中断向量原来的偏移量
COUNT DB 20 ;中断次数计数单元,计20次为一秒
SWIT DB 040H ;保存8位开关状态
STR1 DB '0','0','$' ;保存主干道车的数量
STR2 DB '0','0','$' ;保存支干道车的数量
MTIM1 DB 30H ;主干道秒倒数计数单元十位
MTIM2 DB 30H ;主干道秒倒数计数单元个位
STIM1 DB 30H ;支干道秒倒数计数单元十位
STIM2 DB 30H ;支干道秒倒数计数单元个位
MCOL DB 02H ;主干道红绿灯颜色,默认为绿色
MCOL1 DB 8 ;主干道红灯颜色,默认为灰色(即此时灯是灭的,下同)
MCOL2 DB 8 ;主干道黄灯颜色,默认为灰色
MCOL3 DB 2 ;主干道绿灯颜色,默认为绿色
SCOL DB 04H ;支干道红绿灯颜色,默认为红色
SCOL1 DB 4 ;支干道红灯颜色,默认为红色
SCOL2 DB 8 ;支干道黄灯颜色,默认灰色
SCOL3 DB 8 ;支干道绿灯颜色,默认灰色
SW1 DB 4 ;开关1对应的颜色,默认红色(红色代表断开,绿色闭合,下同)
SW2 DB 4 ;开关2对应的颜色,默认红色
SW3 DB 4 ;开关3对应的颜色,默认红色
SW4 DB 4 ;开关4对应的颜色,默认红色
SW5 DB 4 ;开关5对应的颜色,默认红色
SW6 DB 4 ;开关6对应的颜色,默认红色
SW7 DB 4 ;开关7对应的颜色,默认红色
SW8 DB 4 ;开关8对应的颜色,默认红色
RED EQU 04H ;红色的颜色代码
GRE EQU 02H ;绿色的颜色代码
YEL EQU 0EH ;黄色的颜色代码
DATA ENDS
STACK1 SEGMENT PARA STACK 'STACK'
DB 256 DUP(0)
STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK1
START: MOV AX,DATA
MOV DS,AX ;数据段段基址
MOV AX,0012H ;设置屏幕工作方式:12号640*480图形16色
INT 10H
mov dx,20bh
mov al, 89h
out dx,al
CHSWIT MACRO X
LOCAL CHSX,CHSEX
MOV AL,SWIT
NOT AL
MOV DL,01H
ROL DL,X-1
TEST AL,DL
JZ CHSX
MOV SW&X,4
JMP CHSEX
CHSX: MOV SW&X,2
CHSEX: ENDM ;宏定义,将swit中第x位的开关状态转变为sw2~sw8中的颜色值
CLI ;关中断
MOV AL,1CH
MOV AH,35H
INT 21H
MOV KEEP_CS,ES
MOV KEEP_IP,BX ;保护1ch原来的中断向量
MOV AL,1CH
MOV AH,25H
MOV DX,SEG CLOCK
MOV DS,DX
MOV DX,OFFSET CLOCK
INT 21H ;将clock作为1ch新的中断服务程序
MOV AX,DATA
MOV DS,AX ;恢复ds值
MOV AL,36H
OUT 43H,AL
MOV AX,59660
OUT 40H,AL
MOV AL,AH
OUT 40H,AL
MOV AL,0FCH
OUT 21H,AL ;板载8254初始化,方式3,50ms中断一次
CALL DISP1 ;显示背景画面,十字路口
STI ;开中断
MAIN: MOV AX,DATA
MOV DS,AX
CMP COUNT,00H
JZ CHANG ;count归零表示1秒计时到,调用clock1修改显示的时钟
mov dx,20ah
in al,dx
MOV SWIT,AL
CALL CC ;根据swit(开关状态)修改各状态变量的值
CALL CHANG2 ;根据mcol,scol等变量,修改其他变量.
CALL DISP ;调用显示子程序
MOV AH,0BH
INT 21H
CMP AL,0FFH
JZ EXIT
JMP MAIN ;扫描键盘,若有键按下则退出
CHANG: CALL CLOCK1
JMP MAIN
EXIT: CLI ;关中断
MOV AL,1CH
MOV AH,25H
MOV BX,KEEP_CS
MOV DX,KEEP_IP
MOV DS,BX
INT 21H ;恢复原来的中断向量
STI
MOV AH,4CH
INT 21H ;退出
CLOCK PROC FAR ;中断服务程序,将count减一,若归零则重新赋值20
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AX,DATA
MOV DS,AX
CMP COUNT,00H
JZ CT00
DEC COUNT
CBACK: MOV AL,20H
OUT 20H,AL
POP DX
POP CX
POP BX
POP AX
IRET
CT00: MOV COUNT,20
JMP CBACK
CLOCK ENDP
CLOCK1 PROC NEAR ;每过一秒修改一次倒计时单元
CMP MTIM2,30H
JZ MT20
DEC MTIM2
MBACK: CMP STIM2,30H
JZ ST20
DEC STIM2
SBACK: MOV COUNT,20
RET
MT20: CMP MTIM1,30H
JZ MT10
DEC MTIM1
MOV MTIM2,39H
MT10: JMP MBACK
ST20: CMP STIM1,30H
JZ ST10
DEC STIM1
MOV STIM2,39H
ST10: JMP SBACK
CLOCK1 ENDP
DISP PROC NEAR
MOV BH,00H
MOV DH,4
MOV DL,37
MOV AH,02H
INT 10H ;光标定位(下同)
MOV BL,SW4
MOV AX,091EH
MOV CX,1
INT 10H ;显示4个主线开关状态
MOV DH,4
MOV DL,39
MOV AH,02H
INT 10H
MOV BL,SW3
MOV AX,091EH
MOV CX,1
INT 10H
MOV DH,4
MOV DL,41
MOV AH,02
INT 10H
MOV BL,SW2
MOV AX,091EH
MOV CX,1
INT 10H
MOV DH,4
MOV DL,43
MOV AH,2
INT 10H
MOV BL,SW1
MOV AX,091EH
MOV CX,1
INT 10H
MOV DH,6
MOV DL,39
MOV AH,02H
INT 10H ;光标定位
LEA DX,STR1
MOV AH,09H
INT 21H ;显示主干道车的数目
MOV DH,8
MOV DL,37
MOV AH,02H
INT 10H ;光标定位
MOV BL,MCOL1
MOV AX,0903H
MOV CX,01H
INT 10H ;显示主干道3个红绿灯的颜色
MOV DH,8
MOV DL,39
MOV AH,02H
INT 10H
MOV BL,MCOL2
MOV AX,0903H
MOV CX,01H
INT 10H
MOV DH,8
MOV DL,41
MOV AH,02H
INT 10H
MOV BL,MCOL3
MOV AX,0903H
MOV CX,01H
INT 10H
MOV DH,8 ;显示主干道秒倒计时器
MOV DL,43
MOV AH,02H
INT 10H
MOV BL,MCOL
MOV AL,MTIM1
MOV CX,1
MOV AH,09H
INT 10H
INC DX
MOV AH,02H
INT 10H
MOV AL,MTIM2
MOV CX,1
MOV AH,09H
INT 10H
MOV DH,14 ;显示4个支线开关状态
MOV DL,11
MOV AH,02H
INT 10H
MOV BL,SW8
MOV AX,091EH
MOV CX,1
INT 10H
MOV DH,14
MOV DL,13
MOV AH,02H
INT 10H
MOV BL,SW7
MOV AX,091EH
MOV CX,1
INT 10H
MOV DH,14
MOV DL,15
MOV AH,02H
INT 10H
MOV BL,SW6
MOV AX,091EH
MOV CX,1
INT 10H
MOV DH,14
MOV DL,17
MOV AH,02H
INT 10H
MOV BL,SW5
MOV AX,091EH
MOV CX,1
INT 10H
MOV DH,14 ;显示支线车的数目
MOV DL,19
MOV AH,02H
INT 10H
LEA DX,STR2
MOV AH,09H
INT 21H
MOV BL,SCOL ;显示支线秒倒计时器
MOV DH,14
MOV DL,23
MOV AH,02H
INT 10H
MOV AL,STIM1
MOV CX,1
MOV AH,09H
INT 10H
INC DX
MOV AH,02H
INT 10H
MOV AH,09H
MOV AL,STIM2
MOV CX,1
INT 10H
MOV DH,12 ;显示支线3个红绿灯颜色
MOV DL,27
MOV AH,02H
INT 10H
MOV BL,SCOL1
MOV AX,0903H
MOV CX,01H
INT 10H
MOV DH,14
MOV DL,27
MOV AH,02H
INT 10H
MOV BL,SCOL2
MOV AX,0903H
MOV CX,01H
INT 10H
MOV DH,16
MOV DL,27
MOV AH,02H
INT 10H
MOV BL,SCOL3
MOV AX,0903H
MOV CX,01H
INT 10H
RET
DISP ENDP
DISP1 PROC NEAR ;屏幕背景初始化程序,显示十字路口
MOV BH,00H
MOV DX,0 ;显示主干道的上半部分
LINESTART:MOV CX,240
LINESCAN: MOV AX,0C03H
INT 10H
CMP CX,410
JZ NEXTL
INC CX
JMP LINESCAN
NEXTL: INC DX
CMP DX,175
JZ S2
JMP LINESTART
S2: MOV CX,00H ;显示支线
S2SCAN: MOV AX,0C03H
INT 10H
CMP CX,639
JZ NEXTL2
INC CX
JMP S2SCAN
NEXTL2: INC DX
CMP DX,295
JZ S3
JMP S2
S3: MOV CX,240 ;显示主干道的下半部分
S3SCAN: MOV AX,0C03H
INT 10H
CMP CX,410
JZ NEXTL3
INC CX
JMP S3SCAN
NEXTL3: INC DX
CMP DX,479
JZ SEND
JMP S3
SEND: RET
DISP1 ENDP
CHANG2 PROC NEAR ;根据mcol,scol,swit的值给其他变量赋值
MOV AL,SWIT
AND AL,0FH
CMP AL,0AH
JNB CHNEXT
ADD AL,30H
MOV STR1[1],AL
MOV STR1[0],30H
JMP CHEX
CHNEXT: MOV STR1[0],31H
SUB AL,0AH
ADD AL,30H
MOV STR1[1],AL ;根据swit的值给str1赋主干道车的数目(16进制转化为10进制)
CHEX: MOV AL,SWIT
AND AL,0F0H
ROR AL,4
CMP AL,0AH
JNB CHNEXT2
ADD AL,30H
MOV STR2[1],AL
MOV STR2[0],30H
JMP CHEX2
CHNEXT2: MOV STR2[0],31H
SUB AL,0AH
ADD AL,30H
MOV STR2[1],AL ;给str2赋支线车的数目
CHEX2: MOV AL,SWIT
NOT AL
TEST AL,01H
JZ CHSW1
MOV SW1,4
JMP CHSNEXT
CHSW1: MOV SW1,2 ;根据swit值,给显示的开关赋颜色值
CHSNEXT: CHSWIT 2
CHSWIT 3
CHSWIT 4
CHSWIT 5
CHSWIT 6
CHSWIT 7
CHSWIT 8 ;宏调用,给其他几个开关赋颜色值
MOV AL,MCOL
CMP AL,2
JZ CMCOG
JMP CHECKR
CMCOG: MOV MCOL1,8
MOV MCOL2,8
MOV MCOL3,2
CHECKR: MOV AL,MCOL
CMP AL,4
JZ CMCOR
JMP CHECKY
CMCOR: MOV MCOL1,4
MOV MCOL2,8
MOV MCOL3,8
CHECKY: MOV AL,MCOL
CMP AL,0EH
JZ CMCOLY
JMP CHECKS
CMCOLY: MOV MCOL1,8
MOV MCOL2,0EH
MOV MCOL3,8 ;根据mcol,给主干道的3个红绿灯赋颜色值
CHECKS: MOV AL,SCOL
CMP AL,2
JZ CSCOG
JMP CHECKR2
CSCOG: MOV SCOL1,8
MOV SCOL2,8
MOV SCOL3,2
CHECKR2: MOV AL,SCOL
CMP AL,4
JZ CSCOR
JMP CHECKY2
CSCOR: MOV SCOL1,4
MOV SCOL2,8
MOV SCOL3,8
CHECKY2: MOV AL,SCOL
CMP AL,0EH
JZ CSCOLY
JMP CHECKEND
CSCOLY: MOV SCOL1,8
MOV SCOL2,0EH
MOV SCOL3,8 ;根据scol,给支线的3个红绿灯赋颜色值
CHECKEND:RET
CHANG2 ENDP
CC PROC NEAR ;根据原来红绿灯的颜色和路上车的数目切换红绿灯状态和秒计时器初值
MOV AL,MCOL
CMP AL,GRE
JE MG
MOV AL,MCOL
CMP AL,YEL
JE MY
MOV AL,MCOL
CMP AL,RED
JE MRX
JMP CCEND
MG: MOV AL,SWIT ;当主干道为红灯时...
AND AL,0F0H
ROR AL,4
CMP AL,3
JA MG1
JMP CCEND
MG1: MOV AL,SWIT
AND AL,0F0H
ROR AL,4
MOV AH,AL
MOV AL,SWIT
AND AL,0FH
CMP AH,AL
JNA CCEND1
MOV MCOL,YEL
MOV MTIM1,30H
MOV MTIM2,33H
MOV SCOL,RED
MOV STIM1,30H
MOV STIM2,33H
JMP CCEND
MRX: JMP MR
MY: CMP MTIM1,30H ;当主干道为黄灯时...
JNE CCEND1
CMP MTIM2,30H
JNE CCEND1
MOV MCOL,RED
MOV MTIM1,32H
MOV MTIM2,38H
MOV SCOL,GRE
MOV STIM1,32H
MOV STIM2,35H
JMP CCEND
CCEND1: JMP CCEND
MR: MOV AL,SCOL ;当主干道为红灯时...
CMP AL,YEL
JE MR1
MOV AL,SWIT
AND AL,0F0H
ROR AL,4
MOV AH,AL
MOV AL,SWIT
AND AL,0FH
CMP AL,4
JB MR3
CMP AH,AL
JBE MR2
MR3: CMP STIM1,30H
JNE CCEND
CMP STIM2,30H
JNE CCEND
MOV SCOL,YEL
MOV STIM1,30H
MOV STIM2,33H
MOV MCOL,RED
MOV MTIM1,30H
MOV MTIM2,33H
JMP CCEND
MR1: CMP STIM1,30H
JNE CCEND
CMP STIM2,30H
JNE CCEND
MOV MCOL,GRE
MOV SCOL,RED
JMP CCEND
MR2: MOV MCOL,RED
MOV MTIM1,30H
MOV MTIM2,33H
MOV SCOL,YEL
MOV STIM1,30H
MOV STIM2,33H
JMP CCEND
JMP CCEND
CCEND: RET
CC ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -