在PC机开始流行的几年前,Cen-tronics公司制造出售过一种使用简单并行总线接口的打印机,这种并行总线用于将一台计算机的数据传送到一台打印机上,并能检测打印机的状态,一直到打印机空闲时才继续传送其他数据。后来这种形式被很多打印机制造商和外设商所采用,很快就被制定为工业标准。随着不同的接口形式在PC机中相继应用,这种并行接口也一直不断改进。现在的电脑都会配备一个25针的并行接口,也称LPT口或打印接口,它目前一般都支持IEEE1284标准中定义的三种并行接口模式,分别为SPP(Standara Par-allel Port)标准并行接口、EPP(Enhanced Parallel Port)增强并行接口、ECP (Extended Capabilities Port)扩展功能并行接口。ECP模式除了支持双向数据的传输,还有可扩展的寄存器控制功能,使得传输速度从SPP模式的50K bps提升到2Mbps。并行接口通常用于连接打印扫描设备或其他要求并行传输的外部设备。如果我们了解它的工作原理和编程方法,就可以把它方便地用于电子制作中进行数据传输或实现自动控制。下面将以一个简单实例──制作简易8位LED数字显示牌,来说明PC机标准并行接口(SPP)的基本工作原理和编程方法。
制 作 实 例
这里介绍一个用电脑并口直接控制的简易8位LED数字显示牌的制作。
先看看要用到的元器件。由图1可见,使用的元件很少,甚至没有用到一个电阻。为了简化电路和充分利用电脑的接口,该制作选用了USB取电,把USB连线的一头剪下,可以看到有红、黑、绿、白4根不同颜色的线,如图2所示,黑色为地线,红色为+5V,其余为信号线,不选用(焊接操作时应小心不要把它接反,为避免损坏USB口可以加整流二极管)。共阳极双七段LED的引脚定义请看图3左半部,而右半部是测量其好坏的示意图,数字万用表打到测二极管挡,这时红表笔有一个正电压(普通万用表则可以使用电阻挡,黑表笔有正电压)。用红表笔接触LED阳极V(Vcc),黑表笔分别接触各个笔划,各笔划亮时为好,否则为坏。制作中也可以使用共阴极的七段LED,只要在软件发送数据时取反就行了。因为使用2个IC和8个LED,若用万用板去制作连线会很多,有条件可以自己制板,若你了解并口的原理也可只接一个LED以简化电路。笔者是使用一块从仪表上拆下的旧8位数字LED印制电路板。



该制作的电路如图4所示。IC1和IC2为74HC373三态八D锁存器,电路中只用到输出态和锁存态,而没有使用到高阻态的控件,所以芯片上输出控制端(①脚)只要接地就行了。IC1是用来控制七段LED的阳极电压的,IC2是用来控制七段LED的笔划的。具体的控制过程为:第一步:软件置并口为高电平,为低电平,这时IC1为输出态,IC2为锁存态,送选择显示位数据到LPT②~⑨脚,D0~D7对应8个LED,因此时IC1为输出态,故数据输出到IC1的Q0~Q7,IC2不受影响。第二步:置并口为低电平,为高电平,这时IC1的数据被锁存,IC2为输出态,此时送笔划数据到D0~D7,重复第一步时,IC2的数据被锁存。如此时IC1的Q0为高电平,IC2的Q1、Q2为低电平,那么DS1号LED的b和c笔划段被点亮,显示“1”字符。若这时置IC1为输出态,输入数据置IC1的Q1为高电平,其他为低电平,“1”字符便会移到第2个LED上显示,只要数据改变得快,人眼看起来就是两个“1”同时显示的。这就是动态显示的基本原理。此制作所用元件见表1。

要想向计算机的并口输入或输出数据,就要对它进行编程。我们来了解一下并口的原理和软件的编写方法。
软件及接口工作原理
图5和图6是常用的并行接口形式。图5是PC后面板上的DB25孔式并行接口,它通常都整合在主机板上,而在旧式的机器上则需外加打印卡或多功能卡取得,PC机要扩展多个这样的接口也需要外加相应的板卡。图6是用于连接PC主机和打印机(或其他外设)的连接线,由一个针式DB25接头和一个Centronics公接头组成。图7是打印机(或其他外设)的Centronics母接头。Centronics是一种36脚弹簧式接口。

本文的实例制作里选用了标准的并口模式——SPP,它是最简单的模式,它可以提供50Kbps的典型传输速度,其最高的传输速度可达150Kbps,可进行9bits的并行输入和12bits的并行输出。通常可选择Nibble(4bits)或Byte(8bits)的方式进行输入数据。还有一种Bi-directional的双向传输方式,这种方式需硬件支持(现在的板载LPT通常在SPP模式下也可以进行双向传输)。SPP硬件是由8条数据线、4条控制线和5条状态线所组成,它们分别对应3个不同的寄存器来进行数据的读写操作。表2是并行接口引脚定义表。
并行接口输出的是TTL标准的逻辑电平,输入信号也要符合TTL标准。这种特性可以使接口容易应用在电子设计中。大部分的PC并行接口能吸收和输出12mA左右的电流,如应用时小于或大于这个值,应使用缓冲电路。
笔者没有在表2中列出的Centronics引脚定义有:留(悬空),辑地,壳地,留(悬空),,留(悬空),V。表中“I/O”栏中的“*”表示如果并行接口支持双向传输则该引脚可以输入数据,表中“SPP信号”栏中,信号名称前的“n”表示该信号低电平有效。例如“nError”表示打印机出错则这个针脚将为低电平,正常为高电平(这里的信号是指定于打印机的,其他的外设可能有不同的定义)。表中的“硬件反转”栏所表示的意思是,输入的信号先被并行接口硬件反相再送到相应的寄存器。例如“Busy”,外部设备输入一个逻辑信号1(TTL+5V逻辑电平),信号被反相送入状态寄存器,这时读状态寄存器bit7(最后一位)为0,如输入信号为0,bit7的值则为1。
整合在主板上的并行接口通常可以选择使用3BCh、378h和278h这三个基地址,它们大多支持SPP、ECP和EPP模式,你可以通过设置BIOS为并行接口选择基地址(地址值为16进制数,加“h”表示)。3BCh这个地址在早期的并口打印机适配器上是不支持EPP和ECP模式的。在本实例程序中使用了直接检测端口的方法来检测并行接口基地址分配,其方法是向基地址写一个非FFh的值,再读出该基地址的值,如果读出的是写入的值而不是FFh,表明地址是可用的。这种方法在DOS或Win9X系统是很容易实现的,在WinNT或Win2000下可用第三方写端口控件或自行编写有Ring0特权的程序。下面一段检测基地址的汇编语句修改一下可以镶入到C、VC++、Delphi、C++Builder中(只能在Win9X或DOS下正常运行,若用软件也可以使其在Win2000或XP下运行,具体可以参看下期配刊光盘中演示程序的说明)。
mov dx,Address//Address为基地址(如为控制、状态地址时向指定口地址读写数据)
mov al,Data//Data为要向基地址输出非FFh的数据
out dx,al//向基地址写数据
in al,dx //读基地址数据
mov Result,al //向主程序返回读出的数据,再用主程序比较Data和Result的值,若相同则该基地址可用
那么如何对端口读写数据呢?在实例制作中程序又是如何控制并行接口引脚电平的呢?下期笔者再为大家介绍。
(温正伟)