📄 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 + -