📄 p3.asm
字号:
;8255交通灯显示实验
;****************根据查看端口资源修改下列符号值*******************
IOY0 EQU 0C400H ;片选IOY0对应的端口始地址
;*****************************************************************
MY8255_A EQU IOY0+00H*4 ;8255的A口地址
MY8255_B EQU IOY0+01H*4 ;8255的B口地址
MY8255_C EQU IOY0+02H*4 ;8255的C口地址
MY8255_MODE EQU IOY0+03H*4 ;8255的控制寄存器地址
STACK1 SEGMENT STACK
DW 256 DUP(?)
STACK1 ENDS
DATA SEGMENT
MESS1 DB 'ENTER ANY KEY TO BEGIN!',0DH,0AH,'$'
SATA1 DB 'ALL RAD',0AH,0DH,'$'
SATA2 DB 'N AND S:GREEN,E AND W:RED',0AH,0DH,'$'
SATA3 DB 'GREEN OFF',0AH,0DH,'$'
SATA4 DB 'GREEN ON',0AH,0DH,'$'
SATA5 DB 'N AND S:YELLOW',0AH,0DH,'$'
SATA6 DB 'N AND S:RED,E AND W:GREEN',0AH,0DH,'$'
SATA7 DB 'E AND W:YELLOW',0AH,0DH,'$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV AH,09H
LEA DX,MESS1
INT 21H
MOV DX,MY8255_MODE ;定义8255工作方式
MOV AL,81H ;工作方式0,A口和B口为输出 .c口低四位是输出
OUT DX,AL
BEGIN: ; CALL DIS ;显示刷新
CALL CLEAR ;清屏
CALL CCSCAN ;扫描按键
JNZ H1 ;有键按下则跳置H1
JMP BEGIN
H1: CALL LOOP1
QUIT: MOV AH,1
INT 16H
JZ QUIT
MOV AX,4C00H ;结束程序退出
INT 21H
CCSCAN PROC NEAR ;扫描是
MOV AL,00H ;否有按键闭合子程序
MOV DX,MY8255_B ;将4列全选通,X1~X4置0
OUT DX,AL
MOV DX,MY8255_C
IN AL,DX ;读Y1~Y4
NOT AL
AND AL,0FH ;取出Y1~Y4的反值 ,延迟20MS
MOV CX,16EAH
DELAY: LOOP DELAY
RET
CCSCAN ENDP
CLEAR PROC NEAR ;清除数码管显示子程序
MOV DX,MY8255_A ;段位置0即可清除数码管显示
MOV AL,00H
OUT DX,AL
RET
CLEAR ENDP
LOOP1 PROC NEAR
MOV AL,10001000B ;全红灯
MOV DX,MY8255_A
OUT DX,AL
MOV AH,09H ;显示信息
LEA DX,SATA1
INT 21H
MOV DL,0DH ;回车,置光标到行首
MOV AH,02H
INT 21H
CALL DALLY5
LOOP2: MOV AL,01001000B
OUT DX,AL ;南北绿,东西红
MOV AH,09H ;显示信息
LEA DX,SATA2
INT 21H
MOV DL,0DH ;回车,置光标到行首
MOV AH,02H
INT 21H
MOV DX,MY8255_A
MOV BX,200H
CALL DLY
MOV CX,03H
D0: MOV AL,00001000B ;绿灯灭
MOV DX,MY8255_A
OUT DX,AL
MOV AH,09H ;显示信息
LEA DX,SATA3
INT 21H
MOV DL,0DH ;回车,置光标到行首
MOV AH,02H
INT 21H
MOV BX, 20H
CALL DLY
MOV AL,01001000B ;绿灯亮
MOV DX,MY8255_A
OUT DX,AL
MOV AH,09H ;显示信息
LEA DX,SATA4
INT 21H
MOV DL,0DH ;回车,置光标到行首
MOV AH,02H
INT 21H
MOV BX,20H
CALL DLY
LOOP D0
MOV AL,00101000B
MOV DX,MY8255_A ;黄灯亮
OUT DX,AL
MOV AH,09H ;显示信息
LEA DX,SATA5
INT 21H
MOV DL,0DH ;回车,置光标到行首
MOV AH,02H
INT 21H
MOV BX, 100H
CALL DLY
MOV AL,10000100B ;东西绿,南北红
MOV DX,MY8255_A
OUT DX,AL
MOV AH,09H ;显示信息
LEA DX,SATA6
INT 21H
MOV DL,0DH ;回车,置光标到行首
MOV AH,02H
INT 21H
MOV BX,200H
CALL DLY
MOV CL,03H
C0: MOV AL,10000000B ;绿灯灭
MOV DX,MY8255_A
OUT DX,AL
MOV AH,09H ;显示信息
LEA DX,SATA3
INT 21H
MOV DL,0DH ;回车,置光标到行首
MOV AH,02H
INT 21H
MOV BX,20H
CALL DLY
MOV AL,10000100B ;绿灯亮
MOV DX,MY8255_A
OUT DX,AL
MOV AH,09H ;显示信息
LEA DX,SATA4
INT 21H
MOV DL,0DH ;回车,置光标到行首
MOV AH,02H
INT 21H
MOV BX,20H
CALL DLY
LOOP C0
MOV AL,10000010B ;黄灯亮
MOV DX,MY8255_A
OUT DX,AL
MOV AH,09H ;显示信息
LEA DX,SATA7
INT 21H
MOV DL,0DH ;回车,置光标到行首
MOV AH,02H
INT 21H
MOV BX,20H
CALL DLY
PUSH AX
PUSH DX
CALL CCSCAN ;扫描按键
JNZ DSS ;有键按下则跳置DSS
POP DX
POP AX
JMP LOOP2
DSS: JMP QUIT
RET
LOOP1 ENDP
DLY PROC NEAR
PUSH CX
DDD: MOV CX,0FFFFH
CCC: LOOP CCC
DEC BX
PUSH AX
PUSH DX
CALL CCSCAN ;扫描按键
JNZ DSS ;有键按下则跳置DSS
POP DX
POP AX
CMP BX,0
JNE DDD
POP CX
RET
DLY ENDP
DALLY5 PROC NEAR ;软件延时子程序 Y
PUSH CX
PUSH AX
MOV CX, 1FFFH
D9: MOV AX,0FFFFH
D10: DEC AX
JNZ D10
LOOP D9
POP AX
POP CX
RET
DALLY5 ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -