。第10章并行接口芯片8255A10.18255A概述10.1.28255A的内部结构8255A内部结构如图10-1(下页),它由如下几部分组成:(1)数据总线缓冲器(2)读写控制逻辑(3)A组和B组控制A口及C口的高4位构成A组,B口及C口的低四位构成B组。(4)数据端口A、B、C10.1.38255A的引脚8255A是一个40引脚双列直插式封装芯片,引脚如图10-2所示。关于A1、A0说明:A1,A0:端口选择线,8255A需占用4个连续的端口地址,分别用于寻址A、B、C三个数据口及一个控制寄存器端口。A1A0=00选择A口,A1A0=01选择B口,A1A0=10选择C口,A1A0=11选择控制口。在8088系统中,A1A0直接接到系统地址总线的A1A0即可。在8086系统中存在奇偶地址的问题,一般将8255A的数据线系统的低8位数据总线相连,8255A的A1A0与系统地址总线的A2A1连接,而用系统地址总线的A0=0作为该8255A的片选条件之一。图10-18255A内部结构这样,仍可满足8255A占4个连续地址的要求,但它实际上是占据了CPU的4个连续的偶地址。下图是10-28255A引脚10.28255A的控制字10.2.1工作方式控制字8255A的工作方式控制字的格式如下图10-3所示。10.2.2C口按位置位/复位控制字C口按位置位/复位控制字的格式如图10-4所示。(1)仅C口可按位置位/复位,且只对C口的输出状态进行控制(对输入无作用)。(2)一次只能设置C口1位的状态。(3)这个控制字应写入控制口,而不是C口。下面是图10-410.38255A的工作方式10.3.1方式0:基本输入/输出在方式0下,A、B、C三个端口均用作输入/输出用,这种输入/输出只是简单的输入/输出,无联络信号。如下图10-5所示。10.3.2方式1:带选通的输入/输出1.方式1的输入A口和B口都设置为方式1输入时的情况,如图10-6所示。当A口设定为方式1输入时,A口所用三条联络信号线是C口的PC3、PC4、PC5,B口则用了C口的PC0、PC1、PC2作为联络信号。各联络线的定义如下:STB:外设送来的输入选通信号,低电平有效。IBF:8255A送外设的输入缓冲器满信号,高电平有效。INTR:8255A送到CPU或系统总线的中断请求信号,高电平有效。该信号另外受INTE控制。INTE:中断允许信号。2.方式1的输出A口和B口都设置为方式1输出时的情况如图10-7所示。当A口与B口设为方式1输出时,也分别指定C口的三条线为联络信号,A口所用三条联络信号线是C口的PC3、PC6、PC7,B口则用了PC0、PC1、PC2。各联络线的定义如下:图10-6A口和B口在方式1输入时的情况图10-7A口和B口在方式1输出时的情况OBF:送外设的输出缓冲器满信号,低电平有效。ACK:外设送来的响应信号,低电平有效。INTR:中断请求信号,高电平有效。该信号另受INTE控制。INTE:它功能和输入方式一样。10.3.3方式2:带选通的双向输入/输出方式2是一种双向选通输入/输出方式,只适用于A口,方式2下的引脚定义如图10-8所示(见下页)。在方式2下,各联络信号的含义如下:INTR:中断请求信号,高电平有效。OBF:输出缓冲器满,低电平有效。ACK:来自外设的响应信号,低电平有效。INTE1:A口输出中断允许。STB:来自外设的选通输入,低电平有效。IBF:输入缓冲器满,高电平有效。INTE2:A口输入中断允许。图10-8方式2下的引脚定义10.48255A的编程例10.1如图10-9所示(见下页),设8255端口地址为2F80~2F83H,编程设置8255A组、B组均工作于方式0,A口输出,B口输出,C口高4位输入,低4位输出。然后,读入开关K的状态,若K打开,则使发光二极管熄灭;若K闭合,则使发光二极管点亮。程序如下:MOVAL,88HMOVDX,2F83HOUTDX,ALMOVDX,2F82HINAL,DXMOVDX,2F81HANDAL,20HJZL1;条件成立时PC5=0,K闭合MOVAL,0OUTDX,ALJMPEND1L1:MOVAL,40HOUTDX,ALEND1:HLT右面是图10-9例10.2PC机的扬声器驱动系统如图10-10所示(见下页)。扬声器的发声控制系统由8255APB口的D0、D1位与8253计数器的计数通道2共同控制。8255A的端口地址为60~63H,8253的端口地址为40~43H。采用直接对8255A的PB口的D1位交替输出0和1,使扬声器交替地通与断,推动扬声器发声的程序如下:CODESEGMENTASSUMECS:CODESTART:MOVDX,1000H;开关次数INAL,61H;取端口61H的内容PUSHAX;入栈保存,以便退出时恢复ANDAL,11111100B;将第0、1位置0SOUND:XORAL,2;D1位取反OUT61H,AL;输出到端口61HMOVCX,2000H;设置延时空循环的次数DELAY:LOOPDELAY;空循环,延时一小会DECDX;共1000H次JNZSOUNDPOPAX;从堆栈中弹出原AX内容OUT61H,AL;恢复原61H端口内容MOVAH,4CHINT21H;返回DOSCODEENDSENDSTART。下面是图10-10例10.3双机并行通信接口设计:在甲乙两台微机之间并行传送1K字节数据,甲机发送,乙机接收。甲机一侧的8255A采用方式1工作,乙机一侧的8255A采用方式0工作。两机的CPU与接口之间都采用查询方式交换数据,8255A端口地址均为300H~303H。接口电路的连接如下图10-11所示。甲机发送程序:DATASEGMENTBUFFERDB1024DUP(?);定义待发送数据DATAENDSCODESEGMENTASSUMECS:CODESTART:MOVAX,DATAMOVDS,AXMOVBX,OFFSETBUFFER;BX=发送数据首地址MOVCX,1024;CX=发送数据个数MOVDX,303H;8255A命令口MOVAL,0A0H;初始化工作方式字OUTDX,ALMOVAL,0DH;置发送中断允许INTEA=1,即置PC6=1OUTDX,ALAGAIN:MOVAL,[BX];从发送缓冲区中取一个数MOVDX,300H;A口地址OUTDX,AL;数据写入A口,WAIT1:MOVDX,302H;8255A的C口地址INAL,DX;查发中断请求INTRA=1?ANDAL,08H;PC3=1?JZWAIT1;若无中断请求,则循环等待。INCBX;已有中断请求,则内存地址加1LOOPAGAIN;全部数据未发送完,继续MOVAH,4CH;已完,退出INT21H;返回DOSCODEENDSENDSTART乙机接收程序:DATASEGMENTBUFFERDB1024DUP(?);定义接收数据缓冲区DATAENDSCODESEGMENTASSUMECS:CODESTART:MOVAX,DATAMOVDS,AXMOVBX,OFFSETBUFFER;BX=接收数据缓冲区首址MOVCX,1024;CX=接收数据个数MOVDX,303H;8255A命令口MOVAL,98H;初始化工作方式字OUTDX,ALAGAIN:MOVAL,01H;表尚未接收到数据OUTDX,ALWAIT1:MOVDX,302H;8255A的C口地址INAL,DX;查甲机的=0?(PC4=0)ANDAL,10H;即查甲机是否有数据发来JNZWAIT1;若无数据发来,则循环等待MOVDX,300H;若已有数据发来,则准备读A口INAL,DX;从A口读入数据MOV[BX],AL;保存数据MOVDX,303H;控制口地址MOVAL,0H;OUTDX,AL;NOP;空操作,以信号使有一定的宽度NOPINCBX;内存地址加1LOOPAGAIN;全部数据未发送完,继续MOVAH,4CHINT21H;返回DOSCODEENDSENDSTART