某电脑的8253地址是1230~1233H,CLK0连接了8284的PCLKOUT1连接了一个发光二极管(带限流电阻)。现需要实现如下功能:当键盘按下“Y”时,这个发光二极管开始闪烁,闪烁频率为1Hz。 问:(1)8253还需要接什么线? (2)相应的汇编代码如何编写?、
时间: 2023-06-16 15:06:40 浏览: 76
(1) 除了CLK0连接8284的PCLKOUT1外,还需要将GATE0连接到一个可编程中断控制器(如8259A)的INT信号输入端口,这样才能实现定时器中断功能,从而实现闪烁效果。
(2) 汇编代码如下:
```
; 初始化8253定时器
MOV AL, 00110110B ; 设置工作模式3(定时器模式)
OUT 43H, AL ; 向8253控制字寄存器写入工作模式
MOV AX, 0 ; 设置定时器初值为0
OUT 40H, AL ; 向8253通道0的数据寄存器写入低8位初值
OUT 40H, AH ; 向8253通道0的数据寄存器写入高8位初值
; 初始化8259A可编程中断控制器
MOV AL, 00110000B ; 设置8259A工作在嵌套模式下
OUT 20H, AL ; 向主片写入ICW1
MOV AL, 00000100B ; 设置主片IR2连接从片
OUT 21H, AL ; 向主片写入ICW2
MOV AL, 00000100B ; 设置从片连接主片IR2
OUT 21H, AL ; 向从片写入ICW2
MOV AL, 00000001B ; 使8259A能接收中断请求
OUT 21H, AL ; 向主片写入ICW4
MOV AL, 11111110B ; 屏蔽主片除IR0外的所有中断请求
OUT 21H, AL ; 向主片写入OCW1
; 等待键盘按下Y键
WAIT:
IN AL, 60H ; 从键盘控制器读取状态码
CMP AL, 15H ; 判断是否为Y键
JNE WAIT ; 如果不是,则继续等待
; 开启定时器中断
MOV AL, 00110110B ; 设置工作模式3(定时器模式)
OUT 43H, AL ; 向8253控制字寄存器写入工作模式
MOV AX, 0F424H ; 设置定时器初值为0F424H(1秒)
OUT 40H, AL ; 向8253通道0的数据寄存器写入低8位初值
OUT 40H, AH ; 向8253通道0的数据寄存器写入高8位初值
MOV AL, 00000011B ; 向8253控制字寄存器写入GATE=1、GATE=0、工作模式3
OUT 43H, AL ; 向8253控制字寄存器写入工作模式
; 开启中断
STI
; 闪烁发光二极管
BLINK:
IN AL, 60H ; 从键盘控制器读取状态码
CMP AL, 15H ; 判断是否为Y键
JE BLINK ; 如果是,则继续闪烁
MOV AL, 00000011B ; 向8253控制字寄存器写入GATE=1、GATE=0、工作模式3
OUT 43H, AL ; 向8253控制字寄存器写入工作模式
CLI ; 关闭中断
RET
```