📄 交通灯05042005.asm
字号:
.model small
.stack
.data
count DB 0
running db 'running',13,10,'$'
message db 'inter',13,10,'$'
time db '.','$'
.code
main proc far
start:
mov ax,@data
mov ds,ax
cli ;中断标志置0 IF<-0
mov ah,09
lea dx,running
int 21h
mov al,0fh ;0bH
mov ah,35h
int 21h
push es
push bx
push ds
;设置两个中断向量
mov ax,seg interproc
mov ds,ax
mov dx,offset interproc
mov al,0fh
mov ah,25h
int 21h
pop ds
pop bx
pop es
mov al,0bh ;0bH
mov ah,35h
int 21h
push es
push bx
push ds
mov ax,seg timeproc
mov ds,ax
mov dx,offset timeproc
mov al,0bh
mov ah,25h
int 21h
pop ds
pop bx
pop es
;保存原8259屏蔽字
in al,21h
push ax
in al,0a1h
push ax
mov al,071h
out 21h,al
mov al,0fdh
out 0a1h,al
;初始化8253,设置两个计数器的工作方式
;定时器0 工作方式3(方波方式) 10ms
mov dx,213h
mov al,16h ;控制字
out dx,al
mov dx,210h
mov al,64h
out dx,al
;定时器1 工作方式2(分频方式) 100个数
mov dx,213h
mov al,54h ;控制字
out dx,al
mov dx,211h
mov al,00001010b
out dx,al
;初始化8255,设置各端口的工作模式
mov dx,233h
mov al,10001111b ;控制字
out dx,al
;将8255的pc2置1,允许中断
mov dx,233h
mov al,00000101b
out dx,al
repeat: ;开中断,等待
sti
;从8255的A端口送出红绿灯信号
mov dx,230h
mov al,01000010b ;主绿支红
out dx,al
mov ah,1 ;Ctrl+C
int 16h
jz repeat
cli
pop ax
out 0a1h,al
pop ax
out 21h,al
sti
;返回DOS
mov ax,4c00h
int 21h
main endp
interproc proc near ;中断处理程序
;保存现场
cli
push ds
push ax
push cx
push dx
mov ax,@data
mov ds,ax
mov ah,09
lea dx,message
int 21h
mov dx,231h
in al,dx
;主干道有3辆车吗?
mov dx,232h
in al,dx
and al,11100000b ;7,6,5
cmp al,11100000b
jz goend
;清除秒计算器
mov count,0
;送主干道黄灯,支干道红灯数据
mov dx,230h
mov al,11000010b ;主黄支红
out dx,al
sti
;计数
suchao:
cmp count,4
jnz suchao
;秒计数器清零,送主干道红灯,支干道绿灯数据
mov count,0
mov dx,230h
mov al,10000001b ;主红支绿
out dx,al
captain:
cmp count,25
jz cipher
;主干道有3辆车吗?
mov dx,232h
in al,dx
and al,11100000b ;7,6,5
cmp al,11100000b
jnz captain
cipher:
;秒计数器清0,并送主干道红灯,支干道黄灯数据
mov count,0
mov dx,230h
mov al,10000011b ;主红支黄
out dx,al
smartcat:
cmp count,4
jnz smartcat
goend:
mov al,20h
out 20h,al
out 0a0h,al
;恢复现场
pop dx
pop cx
pop ax
pop ds
iret ;退出中断
interproc endp
timeproc proc near ;时间中断
;保存现场
cli
push ds
push ax
push cx
push dx
mov ax,@data
mov ds,ax
inc count
mov ah,09
lea dx,time
int 21h
mov al,20h
out 20h,al
out 0a0h,al
;恢复现场
pop dx
pop cx
pop ax
pop ds
sti
iret ;退出中断
timeproc endp
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -