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

来源:互联网 发布:c语言经典案例 编辑:程序博客网 时间:2024/05/16 19:28

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

这里写图片描述

实验效果图

这里写图片描述

这里写图片描述

代码片段

.MODEL TINYEXTRN InitKeyDisplay:NEAR, Display8:NEARI08259_0 EQU 0250HI08259_1 EQU 0251H.STACK 100.DATABUFFER DB 8 DUP(?)Counter DB ?ReDisplayFlag DB 0.CODESTART:  MOV AX,@DATA    MOV DS,AX    MOV ES,AX    NOP    CALL InitKeyDisplay    CALL Init8259    CALL WriIntver    MOV Counter,0    MOV ReDisplayFlag,1    STISTART1: LEA SI,Buffer    CALL Display8    CMP ReDisplayFlag,0    JZ START1    CALL LedDisplay    MOV ReDisplayFlag,0    JMP START1Init8259 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    RETInit8259 ENDPWriIntver PROC NEAR     PUSH ES    MOV AX,0    MOV ES,AX    MOV DI,20H    LEA AX,INT_0    STOSW    MOV AX,CS    STOSW    POP ES    RETWriIntver ENDPLedDisplay 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    RETLedDisplay ENDPINT_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 tinyextrn InitKeyDisplay:NEAR,Display8:NEARIO8259_0 EQU 0250hIO8259_1 EQU 0251h.stack 100.databuffer db 8 dup(?)IRQ0_INT db 0IRQ7_INT db 0.codestart: mov ax,@DATAmov ds,axmov es,axnopcall InitKeyDisplaymov IRQ0_INT ,00hmov IRQ7_INT ,00hcall Init8259call WriIntvercall LedDisplaystistart1: lea si,buffercall Display8jmp start1LedDisplay proc NEARpush axmov al,IRQ0_INTor al,IRQ0_INTjz LedDisplay1add al,IRQ7_INTLedDisplay1: mov buffer,almov buffer+1,10hmov buffer+2,10hmov buffer+3,10hmov buffer+4,10hmov buffer+5,10hmov buffer+6,10hmov al,IRQ7_INTmov buffer+7,alpop axretLedDisplay endpInit8259 proc nearmov dx,IO8259_0mov al,13hout dx,almov dx,IO8259_1mov al,08hout dx,almov al,09hout dx,almov al,7ehout dx,alret Init8259 endpdelay proc nearpush sipush cxpush axmov cx,100a3:lea si,buffercall display8loop a3pop axpop cxpop siretdelay endpIRQ0: push dxpush axinc IRQ0_INTcall LedDisplaysticall delaydec IRQ0_INTcall LedDisplaymov al,20hout dx,alpop axpop dxiretIRQ7:push dxpush axinc IRQ7_INTcall LedDisplaysticall delaydec IRQ7_INTcall LedDisplaymov dx,IO8259_0mov al,20hout dx,alpop axpop dxiretWriIntver proc nearpush esmov ax,0mov es,axmov di,20hlea ax,IRQ0stoswmov ax,csstoswmov di,20h+7*4lea ax,IRQ7stoswmov ax,csstoswpop esret WriIntver endpend 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外所有硬件中断

原创粉丝点击