概述
1. 首先附上原理图,引脚连接的方式是网络标号的形式,分模块进行原理图的绘画,这样使原理图更加清晰。
2. 实验案例运用的主要芯片有8255、8259, 下面分别对这两个芯片进行主要的讲解。
首先对8255进行端口定义,如下图所示,可以看到在8255A的A0和A1引脚连接的是AB1、AB2,CS引脚连接的是138译码器。那么8255控制字,AD15-AD0分别为:0000 0000 1000 0110B,转化为16进制就是 86H。那么控制A端口自然就是,0000 0000 1000 0000B,即80H,在本实验中,只用到了8255的端口A,所以只对A端口进行定义。
对 8255 端口的定义完成后,需要对8255的工作方式进行定义。
三种工作方式可用软件编程对控制口设置来指定。三种基本的工作方式为: 方式0-基本的输入输出,方式1-选通输入输出方式, 方式2-双向传送方式。本实验的功能是,在每次按键按下后,触发 8259 下降沿中断,进入中断后,对八个LED灯实现16进制的累加,进而对LED灯的控制亮灭。因此,命令8255工作在方式0,A端口为输出状态。
故8255控制字(D7-D0)为:1000 0000B,16进制为 80H。
3. 8259的链接图如下所示。
首先对 ICW1写控制字,本实验为上升沿触发,一片 8255 使用 , 写IW4,因此 ICW1控制字为(D7-D0):0001 0011B。
再对 ICW2写控制字 , 中端号为20H。故 ICW2控制字为(D7-D0):0010 0000B。
最后对 ICW4写控制字,显然 ICW4控制字为(D7-D0):0000 0001B。
本图片来源:中断控制器8259——工作方式、命令字_花无凋零之时的博客-CSDN博客_8259
本图片来源:中断控制器8259——工作方式、命令字_花无凋零之时的博客-CSDN博客_8259
4. 从图中可以看出,LED是共阳的。即初始化变量 CNT = 0FFH , 为LED为全灭状态。若按键按下,8259触发下降沿中断,进入中断函数之中。只需在中断函数之中,把变量 CNT 减 1 , 则实现了16进制的自减。
(1)第一次按下按键,8255 的A端口输出为 0FEH, 转化为 2 进制为 1111 1110B,故是PA0为低电平 , PA1-PA7都为高电平。因此此时只有LED0亮起 , LED1-LED7保持熄灭转态。如下图所示:
(2)第二次按下按键,8255 的A端口输出为 0FDH, 转化为 2 进制为 1111 1101B,故是PA1为低电平 , PA0和P2-PA7都为高电平。因此此时只有LED1亮起 ,其他 LED 保持熄灭转态。如下图所示:
(3)再次按下,同理可得。
5. 总体工程代码如下:
mode equ 080H ; 8255 工作方式
A8255 equ 080H ; 8255 port A
COM8255 equ 086H ; 设置 com口
A8259 equ 090H
B8259 equ 092H
icw1 equ 00010011b ; 单片8259,下降沿中断,要写ICW4
icw2 equ 00100000b ; 中断号为20H
icw4 equ 00000001b ; 工作在8086/88方式
ocw1 equ 11111110b ; 只响应IR0中断
IntBase equ 20H ; 基号:IRO 对应的中断号
data segment
CNT DB 0FFH
data ends
sseg segment stack 'stack'
STA DB 100 dup(?)
;TOP equ lengtH STA
sseg ends
code segment
assume cs:code,ds:data,ss:sseg
start:
mov ax,data
mov ds,ax
;----SET 8255-----
mov dx,COM8255
mov al,mode
out dx,al
;------------------------
cli
pusH ds
;------------------------
mov ax,0
mov ds,ax
mov bx,IntBase*4 ; 20H*4=128 interrupt number 中断号为20H的中断向量入口
mov ax,code
mov cl,4
sHl ax,cl ; =*16
add ax,offset IENTER ; interrupt subroutine entry address 中断入口地址偏移地址
mov [bx],ax
mov ax,0
inc bx
inc bx
mov [bx],ax ; segment address is 0
pop ds
;------------------------
Iinit: ;设置中断工作方式
mov dx,A8259 ;写ICW1
mov al,icw1 ;00010011B
out dx,al ;下升沿触发,间隔为8,单片工作,写ICW4
mov dx,B8259 ;写ICW2
mov al,icw2 ;00100000B
out dx,al
mov al,icw4 ;写ICW4
out dx,al
mov al,ocw1 ;写OCW1
out dx,al
mov al,CNT
mov dx,A8255
out dx,al
;---------------在proteus 中仿真时做如下处理 ————————————;
sti ; 打开CPU可屏蔽中断
LP:
dead_wHile:
mov al,IntBase
out 0, al ;
jmp dead_wHile ;
jmp LP
;------------------------
IENTER:
cli
mov dx,A8255
dec CNT
mov al,CNT
out dx,al ; out counter number
mov dx,A8259
mov al,20H ; ocw2, end of interrupt
out dx,al
sti
iret
code ends
end start
最后
以上就是难过豆芽为你收集整理的微机原理-8259下降沿中断-计数实验的全部内容,希望文章能够帮你解决微机原理-8259下降沿中断-计数实验所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复