?? sun3.asm
字號:
;路口定義:1路口為東,2路口為南,3路口為西,4路口為北
CODE SEGMENT
ASSUME CS:CODE
INTPORT1 EQU 0020H ;定義8259的控制口地址,用來寫ICW1
INTPORT2 EQU 0021H ;定義8259的數據口地址,用來寫ICW2,3,4
INTQ3 EQU INTERUPT3 ;定義3號中斷向量對應的處理函數
INTQ7 EQU INTERUPT7 ;定義7號中斷向量對應的處理函數
CONTPORT EQU 00DFH ;8255的控制口地址
DATAPORT EQU 00DEH ;8255的數據口地址
CtrPort EQU 0073H ;8255的方式選擇控制字地址
APort EQU 0070H ;8255的A口地址,A口在本實驗中未使用
BPort EQU 0071H ;8255的B口地址,PB4-PB7控制四個路口直行燈的亮滅(本例為PB0-PB3)
CPort EQU 0072H ;8255的C口地址,PC0-PC3控制四個路口左轉燈,PC4-PC7控制右轉燈,0為亮,1為滅??
DATA1 EQU 0500H ;電平錯誤顯示區首地址,INTQ7顯示錯誤時使用
DATA2 EQU 0508H ;在CONVERS1中使用到 ,為顯示字符區首地址
DATA4 EQU 0520H ;顯示緩沖區的首地址
DATA5 EQU 0528H ;LEDDISP中使用,保存顯示到第幾位
DATA6 EQU 0529H ; INTERUPT3 中使用,用于保存8259收到8253時鐘脈沖的次數
DATA7 EQU 052AH ;保存當前四個路口的燈處于哪個狀態(共4個)
DATA8 EQU 052BH ;保存剩余的秒數,在FORMAT函數的最后進行初始定義
DATA9 EQU 052CH ;保存剩余的秒數,在FORMAT函數的最后進行初始定義
DATA10 EQU 052EH ;在CONVERS2中使用,作為指針,指向顯示緩沖區的某一位
ORG 1800H ;存儲地址的偏移量
START:
;------------------------ 初始化存儲空間和各個芯片--------------------------------
CALL FORMAT
CLD
;初始化8253
MOV DX,004BH
MOV AL,0B6H
OUT DX,AL
MOV DX,004AH
MOV AL,50H
OUT DX,AL
MOV AL,0C3H
OUT DX,AL
; 定義8255的工作方式,三個端口均工作于方式0,均為輸出口
MOV AL,80H
MOV DX,CtrPort
OUT DX,AL
;寫中斷向量
MOV AX,0H
MOV DS,AX
CALL writeINT
MOV AL,13H ;初始化8259
MOV DX,INTPORT1
OUT DX,AL
MOV AL,08H
MOV DX,INTPORT2
OUT DX,AL
MOV AL,0BH
OUT DX,AL
MOV AL,0F7H
OUT DX,AL
;--------------------------------------------------------------------------------
;---------------------等待模塊,用來調用中斷服務程序和交通燈狀態程序------------------
WATING: STI ;開中斷
CMP BYTE PTR DS:[DATA7],01H ;判斷是否為狀態一
JA WATING1 ;如果不是則轉WATING1
CMP BYTE PTR DS:[DATA8],03H ;如果是狀態一,看當前時間剩余值是否大于3
JNA ZT1F ;如果小于等于3秒,則調用狀態一閃爍程序
CALL ZT1 ;如果大于3秒,則調用狀態一程序
JMP WATING
WATING1: CMP BYTE PTR DS:[DATA7],02H
JA WATING2
CMP BYTE PTR DS:[DATA8],03H
JNA ZT2F
CALL ZT2
JMP WATING
WATING2: CMP BYTE PTR DS:[DATA7],03H
JA WATING3
CMP BYTE PTR DS:[DATA8],03H
JNA ZT3F
CALL ZT3
JMP WATING
WATING3: JMP WATING4 ;跳轉到WATING4,因為JNA指令只能在段內跳轉范圍為-127b-128b,
;-------------------------------------------------------------------------------------
;-----------------------------交通燈狀態子程序-----------------------------------------
;-------------狀態1: 2、4路口直行燈點亮------------------
ZT1: PUSH AX
PUSH DX
MOV AL,01010000B ;設置2,4路口直行燈亮
MOV DX,BPort ;BPort為8255A的PB口的地址
OUT DX,AL ;更改PB口的值,從而改變LED燈顯示的狀態
MOV AL,00H ;設置四個路口左轉燈,右轉燈全部關閉
MOV DX,CPort ;CPort為8255A的PC口的地址
OUT DX,AL ;更改PC口的值,從而改變LED燈顯示的狀態
POP DX
POP AX
RET
ZT1F: ;狀態一閃爍程序: 2、4路口直行燈閃爍
PUSH AX
PUSH DX
MOV CX,12H ;定義閃爍12次
ZT1Flash:MOV AL,00H ;燈滅
MOV DX,BPort
OUT DX,AL
CALL DELAY2 ;短延時
MOV DX,BPort
MOV AL,01010000B ;燈亮
OUT DX,AL
CALL DELAY2 ;短延時
LOOP ZT1Flash ;循環
POP DX
POP AX
JMP WATING
;-----------------------------------------------------------------
;---------------狀態2: 1、3路口左轉燈亮,2、4路口右轉燈亮---------
ZT2: PUSH AX
PUSH DX;熄滅四個直行燈
MOV DX,BPort
MOV AL,0FH
OUT DX,AL ;1、3路口左轉燈亮,2、4路口右轉燈亮
MOV AL,01011010B
MOV DX,CPort
OUT DX,AL
POP DX
POP AX
RET
ZT2F: PUSH AX ;狀態二閃爍程序
PUSH DX
MOV CX,12H ;定義閃爍12次
ZT2Flash:MOV AL,00H ;燈滅
MOV DX,CPort
OUT DX,AL
CALL DELAY2 ;短延時
MOV AL,01011010B ;燈亮
OUT DX,AL
CALL DELAY2 ;短延時
LOOP ZT2Flash
POP DX
POP AX
JMP WATING
;-------------------------------------------------------------
;---------------狀態3: 1、3路口右轉燈亮,2、4路口左轉燈亮------
ZT3:PUSH AX
PUSH DX;熄滅四個直行燈
MOV DX,BPort
MOV AL,0FH
OUT DX,AL ;1、3路口左轉燈亮,2、4路口右轉燈亮
MOV AL,10100101B
MOV DX,CPort
OUT DX,AL
POP DX
POP AX
RET
ZT3F: PUSH AX ;狀態三閃爍程序
PUSH DX
MOV CX,12H ;定義閃爍12次
ZT3Flash:
MOV AL,00H ;燈滅
MOV DX,CPort
OUT DX,AL
CALL DELAY2 ;短延時
MOV AL,10100101B ;燈亮
OUT DX,AL
CALL DELAY2 ;短延時
LOOP ZT3Flash
POP DX
POP AX
JMP WATING
;--------------------------------------------------------------
;--------------------------------狀態四判斷程序-----------------
WATING4:
CMP BYTE PTR DS:[DATA8],03H
JNA ZT4F
CALL ZT4
JMP WATING
;------------------------------狀態4: 1、3路口的燈點亮----------
ZT4: PUSH AX
PUSH DX;1,3路口直行燈亮
MOV AL,10100000B
MOV DX,BPort
OUT DX,AL ;四個路口左轉燈,右轉燈全部關閉
MOV DX,CPort
MOV AL,00H
OUT DX,AL
POP DX
POP AX
RET
ZT4F: PUSH AX ;狀態四閃爍程序
PUSH DX
MOV CX,12H ;定義閃爍8次
ZT4Flash:MOV AL,00H ;燈滅
MOV DX,BPort
OUT DX,AL
CALL DELAY2 ;短延時
MOV AL,10100000B ;燈亮
OUT DX,AL
CALL DELAY2 ;短延時
LOOP ZT4Flash
POP DX
POP AX
JMP WATING
;------------------------------------------------------------
;------------------------------交通燈閃爍延時程序------------
DELY2: CALL DELAY2
LOOP DELY2
POP CX
POP AX
RET
DELAY2: PUSH CX
MOV CX,9000H
DELA1: LOOP DELA1
POP CX
RET
;---------------------------------------------------------------------------------------
writeINT: MOV AX,0H ;寫中斷向量子程序
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -