微机原理实验二之8259A中断控制器

本次实验的过程是实验一:在本次实验中,我们通过步骤一步一步的实现实验的要求,通过运行程序,上下拨动单脉冲开关,当拨动至凸电平时。我们可以清晰的发现试验箱中的显示器会+1,反复拨动,计数会不断的加一。

这里写图片描述

实验效果图

这里写图片描述

这里写图片描述

代码片段

.MODEL TINY
EXTRN InitKeyDisplay:NEAR, Display8:NEAR
I08259_0 EQU 0250H
I08259_1 EQU 0251H
.STACK 100
.DATA
BUFFER DB 8 DUP(?)
Counter DB ?
ReDisplayFlag DB 0
.CODE
START:  MOV AX,@DATA
    MOV DS,AX
    MOV ES,AX
    NOP
    CALL InitKeyDisplay
    CALL Init8259
    CALL WriIntver
    MOV Counter,0
    MOV ReDisplayFlag,1
    STI
START1: LEA SI,Buffer
    CALL Display8
    CMP ReDisplayFlag,0
    JZ START1
    CALL LedDisplay
    MOV ReDisplayFlag,0
    JMP START1
Init8259 PROC NEAR
    MOV DX,I08259_0
    MOV AL,13H
    OUT DX,AL
    MOV DX,I08259_1
    MOV AL,08H
    OUT DX,AL
    MOV AL,09H
    OUT DX,AL
    MOV AL,0FEH
    OUT DX,AL
    RET
Init8259 ENDP
WriIntver PROC NEAR 
    PUSH ES
    MOV AX,0
    MOV ES,AX
    MOV DI,20H
    LEA AX,INT_0
    STOSW
    MOV AX,CS
    STOSW
    POP ES
    RET
WriIntver ENDP
LedDisplay PROC NEAR
    MOV AL,Counter
    MOV AH,AL
    AND AH,0F0H
    ROR AH,4
    MOV Buffer+1,AH
    MOV Buffer+2,10H
    MOV Buffer+3,10H
    MOV Buffer+4,10H
    MOV Buffer+5,10H
    MOV Buffer+6,10H
    MOV Buffer+7,10H
    RET
LedDisplay ENDP
INT_0:  PUSH DX
    PUSH AX
    MOV AL,Counter
    ADD AL,1
    DAA
    MOV Counter,AL
    MOV ReDisplayFlag,1
    MOV DX,I08259_0
    MOV AL,20H
    OUT DX,AL
    POP AX
    POP DX
    IRET

    END START

实验二:
这里写图片描述

实验效果图

这里写图片描述

这里写图片描述

实验代码

.model tiny
extrn InitKeyDisplay:NEAR,Display8:NEAR
IO8259_0 EQU 0250h
IO8259_1 EQU 0251h
.stack 100
.data
buffer db 8 dup(?)
IRQ0_INT db 0
IRQ7_INT db 0
.code
start: mov ax,@DATA
mov ds,ax
mov es,ax
nop
call InitKeyDisplay
mov IRQ0_INT ,00h
mov IRQ7_INT ,00h
call Init8259
call WriIntver
call LedDisplay
sti
start1: lea si,buffer
call Display8
jmp start1
LedDisplay proc NEAR
push ax
mov al,IRQ0_INT
or al,IRQ0_INT
jz LedDisplay1
add al,IRQ7_INT
LedDisplay1: mov buffer,al
mov buffer+1,10h
mov buffer+2,10h
mov buffer+3,10h
mov buffer+4,10h
mov buffer+5,10h
mov buffer+6,10h
mov al,IRQ7_INT
mov buffer+7,al
pop ax
ret
LedDisplay endp
Init8259 proc near
mov dx,IO8259_0
mov al,13h
out dx,al
mov dx,IO8259_1
mov al,08h
out dx,al
mov al,09h
out dx,al
mov al,7eh
out dx,al
ret 
Init8259 endp
delay proc near
push si
push cx
push ax
mov cx,100
a3:lea si,buffer
call display8
loop a3
pop ax
pop cx
pop si
ret
delay endp
IRQ0: push dx
push ax
inc IRQ0_INT
call LedDisplay
sti
call delay
dec IRQ0_INT
call LedDisplay
mov al,20h
out dx,al
pop ax
pop dx
iret
IRQ7:push dx
push ax
inc IRQ7_INT
call LedDisplay
sti
call delay
dec IRQ7_INT
call LedDisplay
mov dx,IO8259_0
mov al,20h
out dx,al
pop ax
pop dx
iret
WriIntver proc near
push es
mov ax,0
mov es,ax
mov di,20h
lea ax,IRQ0
stosw
mov ax,cs
stosw
mov di,20h+7*4
lea ax,IRQ7
stosw
mov ax,cs
stosw
pop es
ret 
WriIntver endp
end start

总结:本次实验最大的收获就是理解了8259a的初始化过程,其中的Init8259 PROC NEAR
MOV DX,I08259_0
MOV AL,13H
OUT DX,AL
MOV DX,I08259_1
MOV AL,08H
OUT DX,AL
MOV AL,09H
OUT DX,AL
MOV AL,0FEH
OUT DX,AL
RET
Init8259 ENDP

分别对应的是设置ICW1
高电平触发,单片,写ICW4
设置ICW2
中断类型码为08H
设置ICW4
一般完全嵌套,带缓冲,正常中断结束,86系统
设置OCW1
屏蔽除D0外所有硬件中断

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值