?? code.asm
字號:
;路口定義:1路口為東,2路口為南,3路口為西,4路口為北
CODE SEGMENT
ASSUME CS:CODE
INTPORT1 EQU 0020H ;定義8259的控制口地址,用來寫ICW1
INTPORT2 EQU 0021H ;定義8259的數(shù)據(jù)口地址,用來寫ICW2,3,4
INTQ3 EQU INTERUPT3 ;定義3號中斷向量對應的處理函數(shù)
INTQ7 EQU INTERUPT7 ;定義7號中斷向量對應的處理函數(shù)
CONTPORT EQU 00DFH ;8255的控制口地址
DATAPORT EQU 00DEH ;8255的數(shù)據(jù)口地址
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控制四個路口左轉(zhuǎn)燈,PC4-PC7控制右轉(zhuǎn)燈,0為亮,1為滅??
DATA1 EQU 0500H ;電平錯誤顯示區(qū)首地址,INTQ7顯示錯誤時使用
DATA2 EQU 0508H ;在CONVERS1中使用到 ,為顯示字符區(qū)首地址
DATA4 EQU 0520H ;顯示緩沖區(qū)的首地址
DATA5 EQU 0528H ;LEDDISP中使用,保存顯示到第幾位
DATA6 EQU 0529H ; INTERUPT3 中使用,用于保存8259收到8253時鐘脈沖的次數(shù)
DATA7 EQU 052AH ;保存當前四個路口的燈處于哪個狀態(tài)(共4個)
DATA8 EQU 052BH ;保存剩余的秒數(shù),在FORMAT函數(shù)的最后進行初始定義
DATA9 EQU 052CH ;保存剩余的秒數(shù),在FORMAT函數(shù)的最后進行初始定義
DATA10 EQU 052EH ;在CONVERS2中使用,作為指針,指向顯示緩沖區(qū)的某一位
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
;--------------------------------------------------------------------------------
;---------------------等待模塊,用來調(diào)用中斷服務程序和交通燈狀態(tài)程序------------------
WATING: STI ;開中斷
CMP BYTE PTR DS:[DATA7],01H ;判斷是否為狀態(tài)一
JA WATING1 ;如果不是則轉(zhuǎn)WATING1
CMP BYTE PTR DS:[DATA8],03H ;如果是狀態(tài)一,看當前時間剩余值是否大于3
JNA ZT1F ;如果小于等于3秒,則調(diào)用狀態(tài)一閃爍程序
CALL ZT1 ;如果大于3秒,則調(diào)用狀態(tài)一程序
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 ;跳轉(zhuǎn)到WATING4,因為JNA指令只能在段內(nèi)跳轉(zhuǎn)范圍為-127b-128b,
;-------------------------------------------------------------------------------------
;-----------------------------交通燈狀態(tài)子程序-----------------------------------------
;-------------狀態(tài)1: 2、4路口直行燈點亮------------------
ZT1: PUSH AX
PUSH DX
MOV AL,01010000B ;設置2,4路口直行燈亮
MOV DX,BPort ;BPort為8255A的PB口的地址
OUT DX,AL ;更改PB口的值,從而改變LED燈顯示的狀態(tài)
MOV AL,00H ;設置四個路口左轉(zhuǎn)燈,右轉(zhuǎn)燈全部關閉
MOV DX,CPort ;CPort為8255A的PC口的地址
OUT DX,AL ;更改PC口的值,從而改變LED燈顯示的狀態(tài)
POP DX
POP AX
RET
ZT1F: ;狀態(tài)一閃爍程序: 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 ;循環(huán)
POP DX
POP AX
JMP WATING
;-----------------------------------------------------------------
;---------------狀態(tài)2: 1、3路口左轉(zhuǎn)燈亮,2、4路口右轉(zhuǎn)燈亮---------
;------------------------------------------------------------
;------------------------------交通燈閃爍延時程序------------
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 ;寫中斷向量子程序
MOV ES,AX
MOV DI,002CH
LEA AX,INTQ3
STOSW
MOV AX,CS
STOSW
MOV DI,003CH
LEA AX,INTQ7
STOSW
MOV AX,CS
STOSW
RET
;----------------------------------------------中斷處理程序-----------------------------------
INTERUPT3:
CLI ;處理中斷時先關中斷
PUSH AX
PUSH DX
MOV AL,DS:[DATA6] ;DATA6 EQU 0529H 地址中為00D ,用于保存收到的中斷次數(shù)
INC AL
MOV DS:[DATA6],AL ;將00D改為 01D ,DATA6用于保持收到脈沖的次數(shù),滿20時加1
CMP AL,20H
JAE NEXT ; 大于等于20時,清零,并轉(zhuǎn)向狀態(tài)判斷程序,中斷返回
JMP INTRE2 ;小于時中斷返回
NEXT: MOV BYTE PTR DS:[DATA6],00H ;將中斷計數(shù)器清零
CALL LEDDISP ;將顯示緩沖區(qū)中的數(shù)字顯示出來
CALL NEWTIME ;將時間緩沖區(qū)中的數(shù)字減一
P1: CMP BYTE PTR DS:[DATA7],01H ;判斷是否是第一個狀態(tài)
JNZ P2 ;如果不是第一個狀態(tài),則轉(zhuǎn)P2
CMP BYTE PTR DS:[DATA8],00H ;看20S是否已經(jīng)減到0
JNE CONV ;如果未減到0,則更新顯示緩沖區(qū),并中斷返回
MOV BYTE PTR DS:[DATA7],02H ;如果減到0,則轉(zhuǎn)到第二個狀態(tài)
MOV BYTE PTR DS:[DATA9],8H ; 設定2狀態(tài)時,路口的顯示初始值
MOV BYTE PTR DS:[DATA8],8H ;
JMP CONV
CONV: CALL CONVERS ;把時間緩沖區(qū)中的時間轉(zhuǎn)換到顯示緩沖區(qū)中
INTRE2: CALL LEDDISP
MOV AL,20H ;寫8259控制口 ,并中斷返回
MOV DX,INTPORT1
OUT DX,AL
POP DX
POP AX
STI ;開中斷
IRET ;中斷返回
;------------------------------------------------------------------------------------------------
INTERUPT7: CLI ;電平不符合要求時,自動顯示ERR
MOV SI,DATA1
CALL LEDDISP
MOV AL,14H
MOV DX,INTPORT1
OUT DX,AL
IRET
;-----------------------------轉(zhuǎn)換子程序,將時間數(shù)值轉(zhuǎn)換為顯示字符,存入顯示緩沖區(qū)-----------------
CONVERS: MOV AL,BYTE PTR DS:[DATA9] ;轉(zhuǎn)換2,4路口(對應于實驗儀上右邊顯示屏)的秒
CALL CONVERS2
ADD WORD PTR DS:[DATA10],03H ;轉(zhuǎn)換1,3路口(對應于實驗儀上左邊顯示屏)的秒
MOV AL,BYTE PTR DS:[DATA8]
CALL CONVERS2
MOV WORD PTR DS:[DATA10],DATA4 ;恢復[DATA10]的指向顯示緩沖區(qū)首地址
RET
CONVERS2: PUSH AX
CALL CONVERS1 ;轉(zhuǎn)換低位
MOV BX,WORD PTR DS:[DATA10]
MOV DS:[BX],AL ;更新低位所對應的顯示緩沖區(qū)
ADD WORD PTR DS:[DATA10],01H ;[DATA10]指向高位
POP AX
PUSH CX
MOV CL,4H
SHR AL,CL ;AL右移CL(4)位, 丟棄低4位,如AL為12H,則轉(zhuǎn)換為01H
POP CX
CALL CONVERS1 ;轉(zhuǎn)換高位
MOV BX,WORD PTR DS:[DATA10] ;更新高位所對應的顯示緩沖區(qū)
MOV DS:[BX],AL
RET
CONVERS1: MOV BH,0H
AND AL,0FH ;取AL的低位 ,如AL為12H,則取02H
MOV BL,AL ; 將數(shù)值存入BL中,作為基址
MOV AL,CS:[BX+DATA2] ;將相應的顯示字符存入AL,如將2對應的字符存入AL.
RET
;-------------------------------------------------------------------------------------------
;--------------------------------更新時間緩沖區(qū)子程序---------------------------------------
NEWTIME:
MOV AL,BYTE PTR DS:[DATA9] ;[DATA789]全部加1D
SUB AL,01D
DAS ;減法的十進制調(diào)整,如12D改為12H
MOV BYTE PTR DS:[DATA9],AL
MOV AL,BYTE PTR DS:[DATA8]
SUB AL,01D
DAS
MOV BYTE PTR DS:[DATA8],AL
RET ;返回
;----------------------------------------------------------------------------------------------
;-------------------------------------顯示子程序,調(diào)用時顯示時間緩沖區(qū)中的字符--------------------------
LEDDISP:
PUSH AX ;顯示子程序
PUSH BX
PUSH CX
PUSH DX
MOV SI,DATA4 ;DATA4 EQU 0520H 從0520h開始顯示
MOV AL,90H ;初始顯示時 DATA3 EQU 0518H
MOV DX,CONTPORT ;寫8255控制口
OUT DX,AL
MOV BYTE PTR DS:[DATA5],00H ;DATA5 EQU 0528H
LED1: CMP BYTE PTR DS:[DATA5],05H
JA LED2 ;如果顯示完8位后,返回
MOV BL,DS:[DATA5]
MOV BH,0H
MOV AL,CS:[BX+SI] ; 初始時,SI等于DATA3 0518H ,
;INTQ3時等于DATA4 0520H ,從0520h顯示到0527H
MOV DX,DATAPORT ;寫8255數(shù)據(jù)口,以此改變顯示值
OUT DX,AL
ADD BYTE PTR DS:[DATA5],01H ;顯示下一位
JNZ LED1
LED2:
POP DX
POP CX
POP BX
POP AX
RET
;---------------------------------------------------------------------------------------------------------
FORMAT: MOV BX,0 ;DATA1 EQU 0500H
MOV WORD PTR DS:[BX+DATA1],5050H ; 1 0 INTQ7中使用,顯示ERR
ADD BX,2
MOV WORD PTR DS:[BX+DATA1],0079H ;3 2
ADD BX,2
MOV WORD PTR DS:[BX+DATA1],0000H ;5 4
ADD BX,2
MOV WORD PTR DS:[BX+DATA1],0000H ;7 6
ADD BX,2
MOV WORD PTR DS:[BX+DATA1],063FH ;9 8 顯示字符 1 0
ADD BX,2
MOV WORD PTR DS:[BX+DATA1],4F5BH ;0B 0A 3 2
ADD BX,2
MOV WORD PTR DS:[BX+DATA1],6D66H ;0D 0C
ADD BX,2
MOV WORD PTR DS:[BX+DATA1],077DH ;0F 0E
ADD BX,2
MOV WORD PTR DS:[BX+DATA1],6F7FH ;11 10
ADD BX,2
MOV WORD PTR DS:[BX+DATA1],7C77H ;13 12
ADD BX,2
MOV WORD PTR DS:[BX+DATA1],5E39H ;15 14
ADD BX,2
MOV WORD PTR DS:[BX+DATA1],7179H ;17 16
;----------------------------------------- 初始化時顯示 ------------------------
ADD BX,2
MOV WORD PTR DS:[BX+DATA1],663FH ;19 18 40
ADD BX,2
MOV WORD PTR DS:[BX+DATA1],3F3fH ;1B 1A 0-
ADD BX,2
MOV WORD PTR DS:[BX+DATA1],3F3FH ;1D 1C 00
ADD BX,2
MOV WORD PTR DS:[BX+DATA1],3F3FH ;1F 1E 00
ADD BX,2
;-------------------------------------------------------------------------------
;-------------顯示緩沖區(qū),保存著當前時間對應的顯示字符,INTQ3中進行調(diào)用和修改-----------
MOV WORD PTR DS:[BX+DATA1],065bH ;21 20 初次顯示12
ADD BX,2
MOV WORD PTR DS:[BX+DATA1],0000H ; 23 22 0-
ADD BX,2
MOV WORD PTR DS:[BX+DATA1],065bH ;25 24 初次顯示12
ADD BX,2
MOV WORD PTR DS:[BX+DATA1],0000H ; 27 26 00
;---------------------------------------------------------------------------------------
MOV BYTE PTR DS:[DATA6],00H ;保存8259A當前收到時鐘脈沖的次數(shù)
MOV BYTE PTR DS:[DATA7],01H ;設置初始狀態(tài)
MOV BYTE PTR DS:[DATA8],12H ;設置剛開始正常工作后1,3路口顯示的秒數(shù)
MOV BYTE PTR DS:[DATA9],12H ;設置剛開始正常工作后2,4路口顯示的秒數(shù)
MOV WORD PTR DS:[DATA10],DATA4
RET
;--------------------------------------------------------------------------------------------
CODE ENDS
END START
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -