計組彙編實驗:交通燈設計實驗

交通燈設計實驗 

一. 實驗目的

1. 通過並行接口8255實現十字路口交通燈的模擬控制

2. 進一步熟悉74LS273,掌握數碼管顯示數字的原理
3. 瞭解點陣LED顯示器的基本原理,掌握PC機控制點陣LED顯示程序的設計方法
二. 實驗原理
通過8255C口輸出來控制LED燈的顯示,以及控制點陣滾動顯示提示信息,同時通過74LS273來顯示七段數碼管
三. 實驗內容
    如圖8-1,L7、L6、L5作爲南北路口的交通燈與PC7、PC6、PC5相連,L2、L1、L0作爲東
西路口的交通燈與PC2、PC1、PC0相連。編程使六個燈按交通燈變化規律亮滅。
加在8x8點陣上滾動顯示:自己 選定一方向,綠燈亮時,點陣顯示“南北向行車”;另一個方向,綠燈亮時,點陣顯示“東西向行車”。並且設置了兩個緊急開關
 01: 兩個方向同時亮紅燈 
 10: 兩個風向黃燈都閃爍 
四. 實驗器材
8255、74LS273芯片、點陣
五. 實驗分析與設計
首先參考實驗八,利用8255的C出口來控制交通燈的顯示。led 燈顯示編碼分別爲
3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh。然後參考點陣輸出“年”字實驗,來利用8255來控制點陣的顯示提示信息。之後參考簡單並行接口實驗,利用74ls273來輸出對七段數碼管的顯示控制。最後利用可編程並行接口實驗,利用8255的A口來得到從手動開關的數據。將這4個功能整合在一起,就可以實現實驗要求。
 線路連接圖


流程圖














































六. 實驗心得
在剛開始做這個實驗時,看到第一個題目就感覺無從下手。然後慢慢地靜下心來看實驗冊上有關的例子。漸漸有了一點頭緒。來到實驗室後先一個一個把相關的演示實驗運行起來,並儘可能詳細的研究所給的代碼。並在這些代碼的基礎上逐漸弄明白了8255,74ls273、點陣和七段數碼管的功能與使用方法。雖然基本上有了大概的思路,但是在真正操作起來時,發現沒寫一段代碼就會有響應的問題出現。
首先就是彙編程序中跳轉的範圍有限制,所以剛開始時全部代碼直接寫在main函數裏面導致了跳轉時超出範圍,然後決定把相關的功能代碼包裝成一個個函數。但是函數間參數的傳遞又是另外一個大問題。之後的解決方法就是利用寄存器和定義的全局變量來傳參數,但是要記得利用push和pop來保存寄存器的值以及定義變量時要記得注意變量類型,又是db和dw會差別很大。還有一個問題就是8255的C出口和A出口不能同時的輸出不同的數據,所以採用74ls273來通過數據線來輸出,從而控制七段數碼管的顯示。
這次試驗中,真的遇到了很多問題,也深深體會到自己所掌握的知識是如此的匱乏。不過多虧了這次試驗,纔對彙編程序及接口技術有了更好的理解。在逐個解決問題時,真的很有成就感,雖然在實驗室裏花了很多時間,但最後成功的實現要求時真的覺得這個世界是很美好的!還有一點體會就是真正動手做試驗會比單純的理論知識學到更多,有更深入的理解。

實驗代碼:
;***********************************;
;*         交通燈設計實驗          *;
;*                                 *;
;*   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


發佈了34 篇原創文章 · 獲贊 25 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章