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

📄 code3.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            ;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 + -