使用8255,8253,8259完成带时间显示的红绿灯 汇编
时间: 2023-12-02 21:05:17 浏览: 94
以下是使用8255、8253和8259完成带时间显示的红绿灯的汇编程序:
```
;设置8253计时器
mov al, 00110110b ;选择计数器0,工作模式3,二进制计数
out 43h, al ;向控制字寄存器发送命令字节
mov ax, 1193 ;设置计数器0初值为1193,为500ms的计数值
out 40h, al ;向计数器0发送低字节
mov al, ah
out 40h, al ;向计数器0发送高字节
;初始化8255并设置端口方向
mov al, 10000000b ;设置端口A为输出,端口B为输入
out 30h, al ;向控制字寄存器发送命令字节
mov al, 11111111b ;设置端口A初始值为全1,即红灯亮
out 32h, al ;向端口A发送初始值
mov al, 11111110b ;设置端口B初始值为全0
out 32h, al ;向端口B发送初始值
;初始化8259中断控制器
mov al, 11110000b ;设置主片IRQ0~3连接从片,开启中断
out 20h, al ;向主片发送ICW1
mov al, 00000100b ;设置主片IRQ2连接从片
out 21h, al ;向主片发送ICW2
mov al, 00000100b ;设置从片连接主片IRQ2
out 0A0h, al ;向从片发送ICW2
mov al, 00000001b ;设置主片和从片均为8086模式
out 21h, al ;向主片发送ICW4
out 0A1h, al ;向从片发送ICW4
;开启中断
sti
;等待中断发生
wait:
jmp wait
;中断服务程序
interrupt:
;处理中断
;更新计时器0初值为1193,为500ms的计数值
mov al, 00110110b ;选择计数器0,工作模式3,二进制计数
out 43h, al ;向控制字寄存器发送命令字节
mov ax, 1193 ;设置计数器0初值为1193,为500ms的计数值
out 40h, al ;向计数器0发送低字节
mov al, ah
out 40h, al ;向计数器0发送高字节
;更新时间显示
in al, 32h ;读取端口B
not al ;取反端口B的值
out 32h, al ;向端口A发送新的值
;清除中断标志
in al, 20h ;读取主片中断服务结束寄存器
or al, 00000001b ;设置EOI位
out 20h, al ;向主片发送中断服务结束信号
in al, 0A0h ;读取从片中断服务结束寄存器
or al, 00000001b ;设置EOI位
out 0A0h, al ;向从片发送中断服务结束信号
retf ;中断返回
```
在上面的程序中,我们使用8253计时器来定时触发中断,每次计数到1193时触发一次中断,即500ms。我们使用8255来控制红绿灯的状态,并使用端口B来显示时间。在程序的主循环中,我们使用一个无限循环来等待中断的发生。中断服务程序中,我们首先处理中断,然后更新计时器0的初值和时间显示,并使用`retf`指令返回到中断前的状态。