⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sun3.asm

📁 可编程并行接口8255A完成的交通灯实验   用8255A的B端口和C端口控制12个LED的亮和灭(输出为0则亮
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;路口定义: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 + -