?? zhiliu.asm
字號:
.MODEL SMALL
INT0 EQU 220H
INT1 EQU 221H
INT10 EQU 228H
INT11 EQU 229H
C8255 EQU 21BH
PA8255 EQU 218H
PB8255 EQU 219H
PC8255 EQU 21AH
C8253 EQU 203H
T08253 EQU 200H
T18253 EQU 201H
T28253 EQU 202H
.STACK 200H
.DATA
TIMES DW 000FH,02FFH,04FFH,08FFH,0FFFH
.CODE
START:
MOV AX,@DATA
MOV DS,AX
S8255:
MOV DX,C8255
MOV AL,90H
OUT DX,AL
MOV DX,PB8255
MOV AL,01H
OUT DX,AL
S8259:
CLI ;關中斷
PUSH DS ;以下設置中斷向量
MOV AX,0000H ;SET IRQ0
MOV DS,AX
MOV AX,OFFSET IRQ0
ADD AX,0000H
MOV SI,20H
MOV [SI],AX
;MOV AX,8100H
MOV AX,CS
MOV SI,22H
MOV [SI],AX
POP DS
;以下設置8259工作方式
MOV AL,13H ;ICW1
MOV DX,INT0
OUT DX,AL
MOV AL,8 ;ICW2
MOV DX,INT1
OUT DX,AL
mov cx,0fffh
loop $
MOV AL,9 ;ICW4
MOV DX,INT1
OUT DX,AL
mov cx,0fffh
loop $
MOV DX,INT1
MOV AL,0FEH ;OCW1
OUT DX,AL
mov cx,0fffh
loop $
MOV DX,INT0
MOV AL,20H ;OCW2
OUT DX,AL
mov cx,0fffh
loop $
;以下設置8253的工作方式
;使用T1,工作于方式1
S8253:
MOV DX,C8253
MOV AL,71H
OUT DX,AL
MOV DX,T18253
MOV BX,0
MOV AX,TIMES[BX]
;賦定時初值
OUT DX,AL
MOV AL,AH
OUT DX,AL
STI ;開中斷
MOV CL,0
;CL用于作PB0輸出高還是低電平的標志
;CL=0,PB0輸出低,CL=1,PB0輸出高
WAITT1: JMP WAITT1;等待T1中斷
IRQ0: ;中斷程序
TEST CL,0
;首先判斷CL狀態,根據其狀態決定輸出是高還是低
JNZ SETPB0
CLRPB0: ;CL=0,PB0輸出低
MOV DX,PB8255
MOV AL,0
OUT DX,AL
INC CL
JMP LOWTIME
SETPB0: ;CL=1,PB0輸出高
MOV DX,PB8255
MOV AL,01H
OUT DX,AL
DEC CL
;以下是通過讀入A口的數據來決定定時值
;從而達到直流電機的調速目的
;只有5中數據有效:00,01,02,04,08
MOV DX,PA8255
IN AL,DX
AND AL,0FH
CMP00:
CMP AL,00H
JNZ CMP01
MOV BX,0
JMP NEXT
CMP01:
CMP AL,01H
JNZ CMP02
MOV BX,0001H
JMP NEXT
CMP02:
CMP AL,02H
JNZ CMP04
MOV BX,0002H
JMP NEXT
CMP04:
CMP AL,04H
JNZ CMP08
MOV BX,0003H
JMP NEXT
CMP08:
CMP AL,08H
JNZ OTHERS
MOV BX,0004H
JMP NEXT
OTHERS: MOV BX,0
JMP NEXT
LOWTIME: MOV BX,0
;低電平持續時間的定時值
NEXT: ;把所要求的定時值賦給T1
;MOV DX,C8253
;MOV AL,71H
;OUT DX,AL
MOV AX,TIMES[BX]
MOV DX,T18253
OUT DX,AL
MOV AL,AH
OUT DX,AL
EOI: ;發EOI命令
MOV DX,INT0
MOV AL,20H
OUT DX,AL
STI ;啟動中斷
IRET ;中斷返回
MOV AX,4C00H ;返回操作系統
INT 21H
END START ;程序結束
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -