一、實驗目的 ??????????????
掌握I/O地址譯碼電路的工作原理。
二、實驗電路
實驗電路如圖1所示,其中74LS74為D觸發器,可直接使用實驗臺上數字電路實驗區的D觸發器,74LS138為地址譯碼器, Y0:280H~287H,Y1:288H~28FH,Y2:290H~297H,Y3:298H~29FH,Y4:2A0H~2A7H,Y5:2A8H~2AFH,Y6:2B0H~2B7H,Y7:2B8H~2BFH。
三、實驗內容
CPU執行I/O指令且地址在280H~2BFH范圍內,譯碼器選中,必有一根譯碼線輸出負脈沖。利用這個負脈沖控制L7發光二極管閃爍發光(亮、滅、亮、滅…),時間間隔通過軟件延時實現。
四、編程提示
1.實驗電路中D觸發器CLK端輸入脈沖Y4,上升沿使Q端輸出高電平L7發光,CD端加低電平L7滅。
2. 執行下面兩條指令
?????????? MOV? DX,2A0H
?????????? OUT? DX,AL(或IN? AL,DX)
Y4輸出一個負脈沖。
執行下面兩條指令
?????????? MOV? DX,2A8H
?????????? OUT? DX,AL(或IN? AL,DX)
Y5輸出一個負脈沖。
五、實驗程序(必須加注釋)和結果
; 定義輸出端口1的地址
outport1 equ 2a0h
; 定義輸出端口2的地址
outport2 equ 2a8h
; 數據段定義
DATAS SEGMENT
??? ; 定義字符串mess1
??? mess1 DB 'Kruanjian221? Liuxijing 2022900616 AND HuTiaWen2022900615',0DH,0AH,'$'
??? ; 定義字符串mess2
??? mess2 DB 'end with any key',0DH,0AH,'$'
??? ; 定義字符串mess3
??? mess3 DB 'over',0DH,0AH,'$'
DATAS ENDS
; 代碼段定義
code segment
??? assume cs:code
start:
??? ; 將數據段地址賦給ax
??? MOV ax,DATAS
??? ; 將ax的值賦給ds
??? MOV ds,ax
??? ; 設置ah為9,準備調用21h中斷顯示字符串
??? MOV ah,9
??? ; 將mess1的偏移地址賦給dx
??? MOV dx,offset mess1
??? ; 調用21h中斷顯示字符串
??? int 21h
??? ; 設置ah為9,準備調用21h中斷顯示字符串
??? MOV ah,9
??? ; 將mess2的偏移地址賦給dx
??? MOV dx,offset mess2
??? ; 調用21h中斷顯示字符串
??? int 21h
AG:
??? ; 將outport1的地址賦給dx
??? mov dx,outport1
??? ; 將al的值輸出到dx指定的端口
??? out dx,al
??? ; 調用延時子程序
??? call delay??????? ;調延時子程序
??? ; 將outport2的地址賦給dx
??? mov dx,outport2
??? ; 將al的值輸出到dx指定的端口
??? out dx,al
??? ; 調用延時子程序
??? call delay??????? ;調延時子程序
??? ; 設置ah為1,準備調用16h中斷讀取鍵盤輸入
??? mov ah,1
??? ; 調用16h中斷讀取鍵盤輸入
??? int 16h
??? ; 如果沒有鍵盤輸入,跳轉到AG標簽處繼續循環
??? je AG
??? ; 設置ah為4ch,準備調用21h中斷結束程序
??? mov ah,4ch
??? ; 調用21h中斷結束程序
??? int 21h
; 延時子程序定義
delay proc near??????? ;延時子程序
??? ; 將5000賦給bx
??? mov bx,5000
lll:
??? ; 將0賦給cx
??? mov cx,0
ll:
??? ; 循環cx次
???? loop ll
??? ; bx減1
??? dec bx
??? ; 如果bx不等于0,跳轉到lll標簽處繼續循環
??? jne lll
??? ; 子程序返回
??? ret
delay endp
code ends
; 程序結束
end start
設計思路:
- 數據段定義(DATAS SEGMENT):
定義了三個字符串:mess1、mess2和mess3。這些字符串用于在屏幕上顯示信息。
- 代碼段定義(code segment):
程序的主體部分,包含了初始化數據段、顯示消息、循環輸出數據和延時的邏輯。
- 初始化數據段(MOV ax,DATAS / MOV ds,ax):
將數據段的地址加載到ax寄存器,然后將ax的值賦給ds寄存器,以便程序可以訪問數據段中的數據。
- 顯示消息(MOV ah,9 / MOV dx,offset mess1 / int 21h):
使用int 21h中斷的功能9來顯示字符串。首先設置ah為9,然后將字符串的偏移地址賦給dx,最后調用int 21h中斷。
- 循環輸出數據(AG:...):
程序的主要循環部分,通過兩個指定的端口(outport1和outport2)輸出數據,并在每次輸出后調用延時子程序。
- 延時子程序(delay proc near):
一個簡單的延時子程序,。
- 檢測鍵盤輸入(mov ah,1 / int 16h):
使用int 16h中斷的功能1來檢測鍵盤輸入。如果沒有鍵盤輸入,程序將繼續循環;如果有鍵盤輸入,程序將結束。
- 結束程序(mov ah,4ch / int 21h):
使用int 21h中斷的功能4ch來結束程序。