一. 實驗目的
1. 通過並行接口8255實現十字路口交通燈的模擬控制
;***********************************;
;* 交通燈設計實驗 *;
;* *;
;* 1紅 1黃 1綠 0 0 2紅 2黃 2綠 *;
;* 緊急控制開關 *;
;* 01: 兩個方向同時亮紅燈 *;
;* 10: 兩個風向黃燈都閃爍 *;
;***********************************;
;------------數據段------------------
data segment
io8255a equ 288h
io8255b equ 28bh
io8255c equ 28ah
proth equ 280h
protlr equ 290h
ls273 equ 2a8h
led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh ; led 燈顯示編碼
min DB 00h,01h,02h,03h,04h,05h,06h,07h,08h,
count db 6
index dw 0
index2 dw 0
len db 8 ;顯示 "南北向行車"的編碼
BUFF1 db 0h, 5fh,54h,5eh,0d7h,5eh,74h,5fh,0h, ;"南"
db 0h,43h,21h,0ffh,0h,0ffh,24h,22h,0h, ;"北"
db 0h,3fh,20h,2eh,2ah,0aeh,60h,3fh,0h, ;"向"
db 0h,50h,5fh,52h,10h,40h,0bfh,50h,28h, ;"行"
db 0h,4ah,4ah,4ah,0dfh,4ah,6ah,5ah,0h, ;"車"
db 0h,0h,0h,0h,0h,0h,0h,0h,0h, ;"空格"
;顯示"東西向行車"的編碼
db 0h,49h,4ah,48h,0dfh,48h,6ah,59h,8h,
db 0h,5fh,55h,51h,7dh,51h,7dh,55h,5fh, ;"東"
db 0h,3fh,20h,2eh,2ah,0aeh,60h,3fh,0h, ;"西"
db 0h,50h,5fh,52h,10h,40h,0bfh,50h,28h, ;"向"
db 0h,4ah,4ah,4ah,0dfh,4ah,6ah,5ah,0h, ;"行"
db 0h,0h,0h,0h,0h,0h,0h,0h,0h,0h ;"車"
portc1 db 24h,44h,04h,44h,04h,44h,04h,44h,04h,44h,04h ;六個燈可能
db 81h,82h,80h,82h,80h,82h,80h,82h,80h,82h,80h ;的狀態數據
db 0ffh ;結束標誌
data ends ;數據段結束標誌
;-------------代碼段------------------------------
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
re_on: mov bx,0 ;初始化bx,bx指示BUFF1的下標,從第一幀開始
on: ;開始循環滾動字幕的每一幀
call urgency ;判斷是否有緊急控制開關信號
mov al,portc1[bx]
mov index2,bx ;保存小標bx,以便在display中調用緊急控制開關程序後重新顯示原來的狀態
cmp al,0ffh ;判斷是否到達交通燈狀態的最後那個編碼
jz re_on ;若是,重新從0開始
mov dx,io8255c ;設置8255爲C口輸出
out dx,al ;點亮相應的燈
inc bx
mov cx,500 ;控制黃燈閃爍時間
test al,42h ;判斷是否要顯示黃燈閃爍
jnz s1
call flash ;調用黃燈閃爍程序
s1:
test al,21h ;是否有綠燈亮
jz de1 ;沒有,短延時
push cx
push ax
push bx
push dx
push si
mov cx,54
loop0:
cmp index,54
jz j1
cmp index,108
jz j2
mov dx,index
push cx
CALL caption
inc index
pop cx
loop loop0
j1: mov index, 55
jmp j3
j2: mov index,0
j3:
pop si
pop dx
pop bx
pop ax
pop cx
mov cx,10 ;控制黃燈閃爍時間
de1:mov di,9000 ;di賦初值9000,也可控制黃燈閃爍時間
de0:dec di ;減1計數
jnz de0 ;di不爲0
loop de1
push dx
mov ah,06h
mov dl,0ffh
int 21h
pop dx
jz on
;沒有,轉到on
exit:
mov ah,4ch ;返回
int 21h
;----------------------------------------------------------------
;----------------------------------------------------------------
DELAY PROC NEAR ;延遲子程序
push cx
mov cx,0ffh;ffh
ccc: loop ccc
pop cx
ret
DELAY ENDP
;--------------------------------------------
;---------------------------------------
caption PROC NEAR
agn: mov cx,5h ;控制文字滾動速度
d1: mov ah,01h
push cx
mov cx,0008h
mov si,offset min
next:
call urgency
push ax ;利用index2,重新回到中斷前的狀態
push bx
push cx
push dx
mov bx,index2
mov al,portc1[bx]
mov dx,io8255c ;設置8255爲C口輸出
out dx,al ;點亮相應的燈
pop dx
pop cx
pop bx
pop ax
mov al,[si]
mov bx,offset buff1
add bx,dx
xlat
push dx ;得到第一行碼
mov dx,proth
out dx,al
mov al,ah
mov dx,protlr
out dx,al ;顯示第一行紅
mov al,0
out dx,al
shl ah,01
inc si
push cx
mov cx,0ffh;ffh
del: loop del ;延時
pop cx
pop dx
loop next
pop cx
call delay
loop d1
mov al,00
mov dx,protlr
out dx,al
RET
caption ENDP
;---------------------------------------------------------------------
;---------------------------------------------------------------
flash proc near
push ax
push bx
push cx
push dx
cmp count,6
jz x1
cmp count,0
jnz nochange
mov count,6
mov al,00h
jmp x2
nochange:
mov al,count
mov bx,offset led ;bx爲數碼錶的起始地
xlat ;求出相應的段碼
x2: mov dx,ls273 ;若不是,從2A8H輸出其ASCII碼
out dx,al
x1:
dec count
pop dx
pop cx
pop bx
pop ax
ret
flash endp
;----------------------------------------------------
;----------------------------------------------------
urgency proc near
push ax
push bx
push cx
push dx
x: mov dx,io8255a ;從A口輸入
in al,dx
cmp al,01h
jz e1
cmp al,02h
jz e2
pop dx
pop cx
pop bx
pop ax
ret
e1:
mov al,00h
mov dx,ls273 ;緊急控制時,熄滅七段數碼管
out dx,al
push ax
mov al,84h
mov dx,io8255c
out dx,al
pop ax
jmp x
e2:
mov al,00h
mov dx,ls273 ;緊急控制時,熄滅七段數碼管
out dx,al
push ax
mov al,42h
mov dx,io8255c
out dx,al
push cx
mov cx,100
e3:
mov di,9000 ;di賦初值9000,也可控制黃燈閃爍時間
e4:
dec di ;減1計數
jnz e4 ;di不爲0
loop e3
pop cx
mov al,00h
out dx,al
push cx
mov cx,100
e5:
mov di,9000 ;di賦初值9000,也可控制黃燈閃爍時間
e6:
dec di ;減1計數
jnz e6 ;di不爲0
loop e5
pop cx
pop ax
jmp x
urgency endp
;--------------------------------------------------------------------
code ends
end start