📄 sun3.asm
字号:
;路口定义:1路口为东,2路口为南,3路口为西,4路口为北
CODE SEGMENT
ASSUME CS:CODE
INTPORT1 EQU 0020H ;定义8259的控制口地址,用来写ICW1
INTPORT2 EQU 0021H ;定义8259的数据口地址,用来写ICW2,3,4
INTQ3 EQU INTERUPT3 ;定义3号中断向量对应的处理函数
INTQ7 EQU INTERUPT7 ;定义7号中断向量对应的处理函数
CONTPORT EQU 00DFH ;8255的控制口地址
DATAPORT EQU 00DEH ;8255的数据口地址
CtrPort EQU 0073H ;8255的方式选择控制字地址
APort EQU 0070H ;8255的A口地址,A口在本实验中未使用
BPort EQU 0071H ;8255的B口地址,PB4-PB7控制四个路口直行灯的亮灭(本例为PB0-PB3)
CPort EQU 0072H ;8255的C口地址,PC0-PC3控制四个路口左转灯,PC4-PC7控制右转灯,0为亮,1为灭??
DATA1 EQU 0500H ;电平错误显示区首地址,INTQ7显示错误时使用
DATA2 EQU 0508H ;在CONVERS1中使用到 ,为显示字符区首地址
DATA4 EQU 0520H ;显示缓冲区的首地址
DATA5 EQU 0528H ;LEDDISP中使用,保存显示到第几位
DATA6 EQU 0529H ; INTERUPT3 中使用,用于保存8259收到8253时钟脉冲的次数
DATA7 EQU 052AH ;保存当前四个路口的灯处于哪个状态(共4个)
DATA8 EQU 052BH ;保存剩余的秒数,在FORMAT函数的最后进行初始定义
DATA9 EQU 052CH ;保存剩余的秒数,在FORMAT函数的最后进行初始定义
DATA10 EQU 052EH ;在CONVERS2中使用,作为指针,指向显示缓冲区的某一位
ORG 1800H ;存储地址的偏移量
START:
;------------------------ 初始化存储空间和各个芯片--------------------------------
CALL FORMAT
CLD
;初始化8253
MOV DX,004BH
MOV AL,0B6H
OUT DX,AL
MOV DX,004AH
MOV AL,50H
OUT DX,AL
MOV AL,0C3H
OUT DX,AL
; 定义8255的工作方式,三个端口均工作于方式0,均为输出口
MOV AL,80H
MOV DX,CtrPort
OUT DX,AL
;写中断向量
MOV AX,0H
MOV DS,AX
CALL writeINT
MOV AL,13H ;初始化8259
MOV DX,INTPORT1
OUT DX,AL
MOV AL,08H
MOV DX,INTPORT2
OUT DX,AL
MOV AL,0BH
OUT DX,AL
MOV AL,0F7H
OUT DX,AL
;--------------------------------------------------------------------------------
;---------------------等待模块,用来调用中断服务程序和交通灯状态程序------------------
WATING: STI ;开中断
CMP BYTE PTR DS:[DATA7],01H ;判断是否为状态一
JA WATING1 ;如果不是则转WATING1
CMP BYTE PTR DS:[DATA8],03H ;如果是状态一,看当前时间剩余值是否大于3
JNA ZT1F ;如果小于等于3秒,则调用状态一闪烁程序
CALL ZT1 ;如果大于3秒,则调用状态一程序
JMP WATING
WATING1: CMP BYTE PTR DS:[DATA7],02H
JA WATING2
CMP BYTE PTR DS:[DATA8],03H
JNA ZT2F
CALL ZT2
JMP WATING
WATING2: CMP BYTE PTR DS:[DATA7],03H
JA WATING3
CMP BYTE PTR DS:[DATA8],03H
JNA ZT3F
CALL ZT3
JMP WATING
WATING3: JMP WATING4 ;跳转到WATING4,因为JNA指令只能在段内跳转范围为-127b-128b,
;-------------------------------------------------------------------------------------
;-----------------------------交通灯状态子程序-----------------------------------------
;-------------状态1: 2、4路口直行灯点亮------------------
ZT1: PUSH AX
PUSH DX
MOV AL,01010000B ;设置2,4路口直行灯亮
MOV DX,BPort ;BPort为8255A的PB口的地址
OUT DX,AL ;更改PB口的值,从而改变LED灯显示的状态
MOV AL,00H ;设置四个路口左转灯,右转灯全部关闭
MOV DX,CPort ;CPort为8255A的PC口的地址
OUT DX,AL ;更改PC口的值,从而改变LED灯显示的状态
POP DX
POP AX
RET
ZT1F: ;状态一闪烁程序: 2、4路口直行灯闪烁
PUSH AX
PUSH DX
MOV CX,12H ;定义闪烁12次
ZT1Flash:MOV AL,00H ;灯灭
MOV DX,BPort
OUT DX,AL
CALL DELAY2 ;短延时
MOV DX,BPort
MOV AL,01010000B ;灯亮
OUT DX,AL
CALL DELAY2 ;短延时
LOOP ZT1Flash ;循环
POP DX
POP AX
JMP WATING
;-----------------------------------------------------------------
;---------------状态2: 1、3路口左转灯亮,2、4路口右转灯亮---------
ZT2: PUSH AX
PUSH DX;熄灭四个直行灯
MOV DX,BPort
MOV AL,0FH
OUT DX,AL ;1、3路口左转灯亮,2、4路口右转灯亮
MOV AL,01011010B
MOV DX,CPort
OUT DX,AL
POP DX
POP AX
RET
ZT2F: PUSH AX ;状态二闪烁程序
PUSH DX
MOV CX,12H ;定义闪烁12次
ZT2Flash:MOV AL,00H ;灯灭
MOV DX,CPort
OUT DX,AL
CALL DELAY2 ;短延时
MOV AL,01011010B ;灯亮
OUT DX,AL
CALL DELAY2 ;短延时
LOOP ZT2Flash
POP DX
POP AX
JMP WATING
;-------------------------------------------------------------
;---------------状态3: 1、3路口右转灯亮,2、4路口左转灯亮------
ZT3:PUSH AX
PUSH DX;熄灭四个直行灯
MOV DX,BPort
MOV AL,0FH
OUT DX,AL ;1、3路口左转灯亮,2、4路口右转灯亮
MOV AL,10100101B
MOV DX,CPort
OUT DX,AL
POP DX
POP AX
RET
ZT3F: PUSH AX ;状态三闪烁程序
PUSH DX
MOV CX,12H ;定义闪烁12次
ZT3Flash:
MOV AL,00H ;灯灭
MOV DX,CPort
OUT DX,AL
CALL DELAY2 ;短延时
MOV AL,10100101B ;灯亮
OUT DX,AL
CALL DELAY2 ;短延时
LOOP ZT3Flash
POP DX
POP AX
JMP WATING
;--------------------------------------------------------------
;--------------------------------状态四判断程序-----------------
WATING4:
CMP BYTE PTR DS:[DATA8],03H
JNA ZT4F
CALL ZT4
JMP WATING
;------------------------------状态4: 1、3路口的灯点亮----------
ZT4: PUSH AX
PUSH DX;1,3路口直行灯亮
MOV AL,10100000B
MOV DX,BPort
OUT DX,AL ;四个路口左转灯,右转灯全部关闭
MOV DX,CPort
MOV AL,00H
OUT DX,AL
POP DX
POP AX
RET
ZT4F: PUSH AX ;状态四闪烁程序
PUSH DX
MOV CX,12H ;定义闪烁8次
ZT4Flash:MOV AL,00H ;灯灭
MOV DX,BPort
OUT DX,AL
CALL DELAY2 ;短延时
MOV AL,10100000B ;灯亮
OUT DX,AL
CALL DELAY2 ;短延时
LOOP ZT4Flash
POP DX
POP AX
JMP WATING
;------------------------------------------------------------
;------------------------------交通灯闪烁延时程序------------
DELY2: CALL DELAY2
LOOP DELY2
POP CX
POP AX
RET
DELAY2: PUSH CX
MOV CX,9000H
DELA1: LOOP DELA1
POP CX
RET
;---------------------------------------------------------------------------------------
writeINT: MOV AX,0H ;写中断向量子程序
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -