📄 改好的源程序.asm
字号:
;设置数据段,以及端口地址分配
data segment
pb db ?
porta equ 1024h
portb equ 1025h
portc equ 1026h
ptcon equ 1027h
mess db 'ENTER ANY KEY CAN EXIT TO DOS!',0dh,0ah,'$'
data ends
;设置堆栈段和代码段
stack segment stack
sta dw 50 dup(?)
top equ length sta
stack ends
code segment
assume cs:code,ds:data,es:data,ss:stack
start: mov ax,data
mov ds,ax
mov es,ax
mov ah,09h ;显示
mov dx,offset mess
int 21h
mov dx,ptcon ;输入控制字
mov al,80h ;工作在方式0
out dx,al ;A、B、C口都为输出
;初始化设置
mov dx,portb ;控制4个黄灯灭
mov al,0ffh
out dx,al
mov dx,portc ;控制4个绿灯灭
mov al,0f0h ;4个红灯亮
out dx,al
call delay1 ;延时
mov pb,11111010b ;1,3路口绿灯亮
mov al,11110101 ;2,4路口红灯亮
;开始控制程序
lll: mov dx,porta ;点亮2,4红灯
out dx,al
mov dx,portc ;点亮1,3绿灯
out dx,pb
mov cx,0x0ah ;延时程序循环10次,实现10S延时
222: call delay1
DEC cx
jnz 222 ; 延时10S
or al,00000101 ;1,3绿灯灭,其它绿灯亮灭不变
out dx,al
mov cx,0003h ;黄灯闪烁次数
333: mov dx,portb ;绿灯亮的相应位置黄灯亮
and al,11111010b ;1,3黄灯亮
out dx,al
call delay1
or al,00000101b ;1,3黄灯灭
out dx,al
dec cx ;实现3次闪烁
jnz 333
mov al,11111010 ;1,3路口红灯亮
out dx,al
mov dx,portc ;控制绿灯
mov al,11110101b ;2,4绿灯亮
out dx,al
mov cx,0x0ah ;延时程序循环10次,实现10S延时
444: call delay1
DEC cx
jnz 444 ; 延时10S
or al,00001010; 2,4路口绿灯灭,其他绿灯状态不变
out dx,al
555:
and al,11110101b ;2,4黄灯亮,其他黄灯不变
out dx,al
call delay1
or al,00001010b ;2,4黄灯灭,其它不变
out dx,al
dec cx ;实现3次闪烁
jnz 555
jmp lll ;继续控制红绿灯
ppp: mov ax,4c00h ;退出,回到DOS
int 21h
;延时程序;用来进行1S钟的延迟
delay1:PUSHF
PUSH BX
PUSH CX
MOV BX,3E8H ; BX的值为1000
LP2: MOV CX,176H ;设定循环次数
LP1: PUSHF
POPF
LOOP LP1 ;CX减1后若不等于0转LP1
DEC BX
JNZ LP2
POP CX
POP BX
POPF
RET
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -