|
本程序是通過秒信號觸發中斷來實現的,要求中斷程序必須在1S內執行完畢
;步進電機轉速控制是通過8255輸入信號在每次執行中斷程序內調整控制信號的循環次數來實現的
CODE SEGMENT
ASSUME CS:CODE
START: PUSH CS
POP DS;數據段和代碼段共用一個地址
JMP MAIN
NUM DB 08H,04H,02H,01H; 定義循環控制信號
DAT1 DB 0H ;定義循環參量
DAT2 DB 0H
;---------初始化8253計數器-----------
MAIN: MOV DX,203H;計數器0初始化,工作在方式3
MOV AL,36H
OUT DX,AL
MOV DX,200H;給計數器0賦計數初值960H(2400)
MOV AL,60H ;低8位
OUT DX,AL
MOV AL,09H ;高8位
OUT DX,AL
MOV DX,203H;計數器1初始化,工作在方式3
MOV AL,76H
OUT DX,AL
MOV DX,201H;給計數器1賦計數處值80H(128)
MOV AL,80H ;低8位
OUT DX,AL
MOV AL,00H ;高8位
OUT DX,AL
;-----------初始化8255---------------
MOV DX,021BH;A口輸入,B口輸出
MOV AL,90H
OUT DX,AL
;-----------初始化向量表8號中斷--------
MOV AX,0;ES:DI
MOV ES,AX
MOV DI,20H;4*8=32
MOV AX,OFFSET INTP;裝載中斷函數的偏移地址
MOV ES:[DI],AX
MOV AX,8100H;
MOV ES:[DI+2],AX
;-------------初始化8259A--------------
MOV DX,210H;ICW1初始化
MOV AL,13H;上升沿觸發,單片,要ICW4
OUT DX,AL
MOV DX,211H;ICW2初始化
MOV AL,08H;初始化中斷類型碼范圍,08-0F對應INT0-INT7
OUT DX,AL
MOV DX,211H;ICW4初始化
MOV AL,01H;
OUT DX,AL
;--------------打開中斷--------------
MOV DX,211H;打開8259A八號中斷
IN AL,DX
AND AL,0FEH;1111 1110
OUT DX,AL
STI;開CPU中斷,IF=1
MOV BX,OFFSET NUM;取控制信號的偏移地址
MOV SI,0 ;將SI循環歸零
LOP: MOV AX,0
JMP LOP;死循環,等待中斷到來
;------------中斷程序開始----------
INTP PROC FAR;
LTP: MOV DX,219H
MOV AL,[BX+SI]
OUT DX,AL
INC SI
CMP SI,04H
JNZ NEXT
MOV SI,0
NEXT: MOV CX,03FFFH ;簡短延時
LOOP $
CALL REFRESH;調用按鍵掃描子程序
DEC DAT1 ;循環次數減一
JNZ LTP ;循環次數減為零時跳出循環
MOV AL,DAT2;重新填裝DAT1的值
MOV DAT1,AL
MOV DX,210H;中斷結束命令
MOV AL,20H
OUT DX,AL
IRET;中斷返回
INTP ENDP
;-------按鍵掃描程序----------
REFRESH PROC FAR
MOV DX,218H
IN AL,DX
CMP AL,00H
JNZ NEXT1 ;若輸入信號為00,則循環參量置為1
MOV DAT2,01H
NEXT1: CMP AL,01H
JNZ NEXT2 ;若輸入信號為01,則循環參量置為2
MOV DAT2,02H
NEXT2: CMP AL,03H
JNZ NEXT3 ;若輸入信號為11,則循環參量置為3
MOV DAT2,03H
NEXT3: CMP AL,07H
JNZ NEXT4 ;若輸入信號為111,則循環參量置為4
MOV DAT2,04H
NEXT4 MOV DAT1,0H
RET
REFRESH ENDP
;-------按鍵掃描結束----------
CODE ENDS
END START
|
|