;每隔一秒产生一个脉冲,该脉冲由 OUT0 输出。设系统时钟周期为 0.5us,先用定时器 1
;产生周期为 1ms 的方波,再将计数器 1 的 OUT1 接到定时器 0 的 CLK0,让计数器 0 对
OUT1
;计数,并每计数 1000 次输出一个脉冲,便得到每隔 1S 对 8259 提出一次中断请求。
;可知:
;计数器 1 工作于方式 3 1ms/0.5ms=2000 即为计数器 1 的初值,由于初值大于 256,送
;控制字时,应使赋值方式选择为先低 8 位,后高 8 位。
;计数器 0 工作于方式 2,初值 1000,同样,赋值方式为先地位、后高位。设 8253 占用
;的设备端口地址为 0FF40H-0FF43H,计数器 0 的地址为:0FF40H,计数器 1 的地址为:
;0FF41H,控制寄存器的地址为:0FF43H.
;程序如下:
SET_8253 PROC
MOV DX,0FF43H
MOV AL,01110110B;计数器 1,方式 3,先送低 8 位、后送高 8 位,二进制
OUT DX,AL
MOV AL,00110100B;计数器 0,方式 2,先送低 8 位、后送高 8 位,二进制
OUT DX,AL
MOV DX,0FF41H ;计数器 1 的地址
MOV AX,2000 ;计数器 1 的初值
OUT DX,AL
MOV AL,AH
OUT DX,AL ;由于输出数据用的中间寄存器必须为 AL
MOV DX,0FF40H ;计数器 0 占用设备的端口地址
MOV AX,1000 ;计数器零的初值
OUT DX,AL
MOV AL,AH
OUT DX,AL
RET
SET_8253 ENDP
;3.8259 中断处理
;将计数器 0 的 OUT0 接到 8259 的 IR0 端,以 8253 的 OUT0 作为中断源产生中断请求,中断
;类型号为 08H,设置 IR0 的处罚方式为上升沿触发
;设置中断向量
SET_8259:
PUSH DS ;保存当前段地址
LEA DX,INTR ; 取中断处理程序的偏移地址
MOV AX,SEG INTR ;取中断处理程序的段地址
MOV DS,AX
MOV AL,08H ;送中断类型号
MOV AH,25H ; 用 25H 功能号设置中断向量
INT 21H ;调用 DOS 功能
POP DS ;回复当前段地址
;8259 初始化:设端口地址 20H、21H,中断类型码为:08H-0FH,I/O 地址为奇数(A0=1)
;时,则写(ICW2、ICW3、ICW4 和 OCW1),地址为偶数时,写(ICW2、ICW3)