微机原理实验二之8259A中断控制器
程序员文章站
2022-03-15 14:12:49
...
本次实验的过程是实验一:在本次实验中,我们通过步骤一步一步的实现实验的要求,通过运行程序,上下拨动单脉冲开关,当拨动至凸电平时。我们可以清晰的发现试验箱中的显示器会+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外所有硬件中断
推荐阅读