📄 code3.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 ;DF=0,以增量方式增长
;初始化8253
MOV DX,004BH ;004B=01001011D,其中A1A0=11
MOV AL,0B6H ;10110110D
OUT DX,AL
; 写入计数初值
MOV DX,004AH ;004A=01001010D,其中A1A0=10
MOV AL,50H ;80H
OUT DX,AL ;将数据送入CNT2
MOV AL,0C3H ;11000011D ,195H
OUT DX,AL ;??
; 定义8255的工作方式,三个端口均工作于方式0,均为输出口
MOV AL,80H ;80H=10000000D,
MOV DX,CtrPort ;CtrPort=0073H=01110011D,其中A1A0=11
OUT DX,AL
;写中断向量
MOV AX,0H
MOV DS,AX
CALL writeINT
MOV AL,13H ;初始化8259
MOV DX,INTPORT1 ;INTPORT1=0020H=00100000D ICW1的编制
OUT DX,AL ;AL=00010011D,ICW1的特征标志位D4,D3=0为上升边沿出发,D2=0无意义 D1=1单片,D0=1需要ICW4
MOV AL,08H ;AL=00001000D
MOV DX,INTPORT2 ;INTPORT2=0021H=00100001D icw2的编制
OUT DX,AL ;D2D1D0=000,中断源是IR0,中断类型码为00001;
MOV AL,0BH ;AL=00001011D
OUT DX,AL ;??
MOV AL,0F7H ;AL=11110111D
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: ;CMP BYTE PTR DS:[DATA7],04H
;JA WATING
JMP WATING4
;-------------------------------------------------------------------------------------
;-----------------------------交通灯状态子程序-----------------------------------------
;-------------状态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
;-----------------------------------------------------------------
;---------------状态3: 1、3路口右转灯亮,2、4路口左转灯亮------
WATING4: CMP BYTE PTR DS:[DATA8],03H
JNA ZT4F
CALL ZT4
JMP WATING
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
ZT4:PUSH AX
PUSH DX;熄灭四个直行灯
MOV DX,BPort
MOV AL,10100000B
OUT DX,AL ;1、3路口左转灯亮,2、4路口右转灯亮
MOV AL,00h
MOV DX,CPort
OUT DX,AL
POP DX
POP AX
RET
ZT4F: PUSH AX ;状态三闪烁程序
PUSH DX
MOV CX,12H ;定义闪烁12次
ZT4Flash:
MOV AL,00H ;灯灭
MOV DX,CPort
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
;---------------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -