扩展你的电脑接口
用PC并行接口制作LED数字显示牌(下)

🏠 首页 《无线电》杂志 2004年 🔗 第2期 🔗 第30页 分类:电脑与单片机 🔗 温正伟 🔗

上期,我们介绍了用PC并行接口制作LED数字显示屏的电路结构和部分软件原理,那么如何对端口读写数据呢?在实例制作中程序又是如何控制并行接口引脚电平的呢?这是本期我们要了解的内容。

SPP标准并行接口模式有3个寄存器,分别为数据寄存器、状态寄存器和控制寄存器(通常称为数据端口、状态端口、控制端口)。在用PC并行口制作LED数字显示屏的实例中用到了数据寄存器和控制寄存器,下面来看看它们的具体操作方法。

1.数据寄存器

数据寄存器所占用的地址是并行接口的基地址,连接于接口的②~⑨针,如果你的并行接口不支持双向传输,则它只能输出数据。当你向寄存器写一个八位二进制数时,这个二进制数的每一位值分别对应设置该接口②~⑨针的电平状态。当数据为1时,引脚就被设定为高电平,数据为0时引脚则为低电平。也就是说我们要想使引脚②、④和⑨为高电平时,就要向数据寄存器写二进制10000101(十进制为133,十六进制为85),可以用下面一段程序:

mov dx,Address//Address为数据寄存器地址(LPT基地址)

mov al,85H//数据

out dx,al//向数据寄存器写数据

在使用EPP或ECP模式时,数据寄存器是支持双向传输的,这样它可以用来接收输入的电平状态,要注意的是在读入数据前时最好先把数据寄存器置为高电平(可以只单独设置要读取的数据位),然后可以用以下的语句去读取数据:

mov dx,Address//Address为基地址(如为控制、状态地址时向指定口地址读写数据)

in al,dx //读基地址数据

mov Result,al //向主程序返回读出的数据

以上的读写程序同样适用于控制寄存器和状态寄存器,只要把Address的值改为相应的寄存器地址就可以了。这里所说的读就是从寄存器返回一个值,这个值就是所对应的引脚逻辑电平值;写就是向寄存器发送一个值,这个值将会反映到相对应的引脚上,引起引脚逻辑电平的高低变化。知道这些我们就可以明白如何控制实例电路显示数字了。如要在最右边的第一位显示“8”,先要得知“8”在共阳极七段LED中的编码,因为要求abcdefg极为低电平,故该电路的编码为10000000(十进制为128),即IC2的Q0~Q7的电平为该值。同时还要求VCC为高电平,也就是IC1的Q0端为高电平。要满足这个要求先要向并口的控制寄存器写12,这时并口的为高电平,为低电平,IC1为输出态,IC2为锁存,送1到数据寄存器,此时IC1的Q0为高电平,向控制寄存器写0,IC1为锁存,IC2为输出态,是写128到数据寄存器,这时IC2输出脚电平符合要求,LED显示“8”。具体的编程方法请看本期配刊光盘的“本期程序”文件夹中的源程序。表3为数据寄存器的相关参数。

图2
图2 🔍原图 (673×287)

2.状态寄存器

状态寄存器占用的地址是基地址加1,与接口的⑩、相连,这个寄存器是只读寄存器,在用于打印机驱动时用来取得打印机的当前状态,如出错、选中、缺纸等。该寄存器中包含一个IRQ中断寄存器(由ACK反相后形成),当有中断发生时,这个数据位为“0”。在读入数据时要注意的是Bit7(引脚,在输入+5VTTL电平时,数据值为“0”,有反转的特性。表4为状态寄存器的相关参数。

图3
图3 🔍原图 (673×288)

3.控制寄存器

控制寄存器占用的地址是基地址加2,与并行接口的①、相连,寄存器可读写。其中Bit0、Bit1、Bit3有反转的特性。通常用于打印机控制时,这个端口只用发送控制数据,如初始化打印机、自动换行等。这个端口还有高阻特性,在应用时可以根据要求加电阻,使电平足够高或足够低。Bit4为IRQ应用,当向Bit4写入“1”时,将使ACK(引脚⑩)信号反相后成为中断请求IRQ信号,通常为IRQ5或IRQ7。在本文中的实例里,用到并口的脚去控制IC1和IC2的控制端。无论使用哪一个寄存器,在程序的编写过程中一定要注意引脚电平和数据位的相互关系,否则就得不到想要的电平或数据。表5为控制寄存器的相关参数。

图1
图1 🔍原图 (598×288)

4.握手信号

所谓的握手就是PC向设备查询设备的工作状态,再根据返回的信号进行相应的操作。使用标准PC并行接口的打印机会用到Centronics标准的握手信号,该信号的时序图见图9。首先数据加到数据寄存器,然后检查Busy(引脚是否为高。如果为高,则打印机处在以下状态之一:正在输入数据、正在打印操作、打印机出错、处在脱机状态,这时打印机不接收数据;Busy为低时,nStrobe(引脚①)输出一最小宽度大于1μs的负脉冲,打印机随后接收数据并使Busy变为高,打印机接收完一个字节后回送给并行接口nACK(引脚⑩)一个宽度大于5μs的响应负脉冲,这个信号可以被并行接口硬件反相之后作为IRQ中断信号或作为查询的状态信号。由于该信号的负脉冲较短,一般不会查询它,而是查询Busy。打印机状态回复,准备接收下一个字节。在我们自己的制作中也可以制定相应的握手信号,在应用标准并行接口的外部设备中并不一定就会用到这种握手信号,在本文的实例中就没有必要用到握手信号。

现在板载的并行接口都会支持EPP和ECP模式,由于硬件的数据端口支持双向传输,所以在SPP模式下也可在数据端口中输入数据。如果你用的是旧式的并行接口功能卡或不想用数据端口输入数据,而又要用并行接口采集8bit的数据时,还可以用以下的两种方法。一种是用控制端口和状态端口的输入功能组成8bit的数据输入,但要注意输入电平和所对应的数据位的相互关系,可以用软件进行调整控制。另一种方式只用到状态端口进行输入,因为一次只能读取4bit也就是半个字节,故又称Nibble Mode。具体电路图请参看图10。电路中用nStrobe控制74HC157(或74LS157)是读取前半个字节还是后半个字节,读取后只要把前后半个字节合并就可。

软 件 实 例

在本期杂志配刊光盘的“本期程序”文件夹中有笔者提供的八位LED演示程序(界面见图11)及其源代码和笔者写的一个应用标准并口的小软件源码Port1.0(见图12)。Port1.0不但可以控制数据口和控制口电平状态,还可以用方波图直观显示状态口引脚的电平状态,它是用BC++5.0编写的,八位LED实例电路也可以借助它来进行测试。本文的演示程序是用Delphi7.0编写,嵌入汇编,用于Win9x系统,编译后可以借助第三方软件运行在Win2000或XP系统下,通过它在实例电路中显示输入的数字和PC机的日期时间,该程序的具体说明见本期光盘。有兴趣的读者还可以访问笔者的网站www.cdle.net以得到更多相关信息。

图4
图4 🔍原图 (409×245)
图5
图5 🔍原图 (425×316)

(温正伟)