PC机标准并行接口的原理和应用(中篇)
作者:温正伟 原载:无线电杂志
|
软件及接口工作原理 先来看看图七和图八,它们是常用的并行接口形式。图七是PC后后面板上的DB25孔式并行接口,现在它通常都会整合在主机板上,要应用PC并口就是从这里取得,而在旧式的机器上则需外加打印卡或多功能卡取得,PC机要扩展多一个这样的接口也需要外加相应的板卡。图八是用于连接PC主机和打印机(或其它外设)的连接线,由一个针式DB25接头和一个Centronics公接头组成。图九是打印机(或其它外设)的Centronics母接头。Centronics是一种36脚弹簧式接口引脚定义看表二。
 |
图7:PC后面板上的DB25并行接口 |
 |
图8:打印机连接线 |
 |
图9:打印机上的Centronics并行接口 |
本文的实例制作里选用了标准的并口模式――SPP模式,它是最简单的模式,它可以提供50K Bits/秒的典型传输速度,其最高的传输速度可达150K Bits/秒。可进行9Bits的并行输入和12Bits的并行输出。通常可选择Nibble(4bits)或Byte(8bits)的方式进行输入数据,还有一种Bi-directional的双向传输方式,这种方式需硬件支持(现在的板载LPT通常在SPP模式下也是可以进行双向传输的)。SPP硬件是由8条数据线,4条控制线和5条状态线所组成,它们分别对应三个不同的寄存器来进行数据的读写操作。表二是并行接口引脚定义表。 并行接口输出的是TTL标准的逻辑电平,输入信号也要符合TTL标准。这种特性可以使接口容易应用在电子设计中。大部分的PC并行接口能吸收和输出12mA左右的电流,如应用时小于或大于这个值,应使用缓冲电路。
针脚(Centronics)
|
针脚(D-Type25)
|
I/O
|
SPP信号
|
寄存器
|
硬件反转
|
1
|
1
|
输入/输出
|
nStrobe选通
|
控制
|
是
|
2
|
2
|
输出/*
|
Data0数据位0
|
数据
|
|
3
|
3
|
输出/*
|
Data1数据位1
|
数据
|
|
4
|
4
|
输出/*
|
Data2数据位2
|
数据
|
|
5
|
5
|
输出/*
|
Data3数据位3
|
数据
|
|
6
|
6
|
输出/*
|
Data4数据位4
|
数据
|
|
7
|
7
|
输出/*
|
Data5数据位5
|
数据
|
|
8
|
8
|
输出/*
|
Data6数据位6
|
数据
|
|
9
|
9
|
输出/*
|
Data7数据位7
|
数据
|
|
10
|
10
|
输入
|
nAck确认
|
状态
|
|
11
|
11
|
输入
|
Busy忙
|
状态
|
是
|
12
|
12
|
输入
|
Pager-Out
|
状态
|
|
|
|
|
Pager-End缺纸
|
|
|
13
|
13
|
输入
|
Select选择
|
状态
|
|
14
|
14
|
输入/输出
|
nAuto-Linefeed
|
控制
|
是
|
|
|
|
自动换行
|
|
|
32
|
15
|
输入
|
nError/nFault
|
状态
|
|
|
|
|
错误
|
|
|
31
|
16
|
输入/输出
|
nInitialize初始化
|
控制
|
|
36
|
17
|
输入/输出
|
nSelect-Printer
|
控制
|
是
|
|
|
|
nSelect-In选择输入
|
|
|
19-30
|
18-25
|
Gnd
|
Ground信号地
|
|
|
表2 D型25针和36针Centronics的针脚定义
表注:没有在表中列出的Centronics引脚定义有:15保留(悬空),16逻辑地,17机壳地,18保留(悬空),33地,34保留(悬空),35 +5V。表中"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下正常运行,若用软件也可以使其在win2k或xp下运行,具体可以参看本文范例中的说明 )。 mov dx,Address //Address为基地址(如为控制、状态地址时向指定口地址读写数据) mov al,Data //Data为要向基地输出非FFh的数据 out dx,al //向基地址写数据 in al,dx //读基地址数据 mov Result,al //向主程序返回读出的数据,再用主程序比较Data和Result的值,若相同则该基地址可用 那么如何对端口读写数据呢?在实例制作中程序又是如何控制并行接口引脚电平的呢? SPP标准并行接口模式有三个寄存器,分别为数据寄存器,状态寄存器和控制寄存器(通常称为数据端口,状态端口,控制端口)。在本文的实例中用到数据寄存器和控制寄存器,下面来看看它们的具体操作方法。
数据寄存器: 数据寄存器所占用的地址是并行接口的基地址,连接于接口的2-9针,如果你的并行接口不支持双向传输,则它只能输出数据。当你向寄存器写一个八位二进制数时,这个二进制数的每一位的值分别对应设置该接口2-9针的电平状态,当数据为1时,引脚就被设定为高电平,数据为0时引脚则为低电平。也就是说我们要想使引脚2,引脚4和引脚9为高电平时,就要向数据寄存器写二进制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中的编码,因是共阳极的所以要显示"8"就要要求abcdefg极为低电平,在这个电路编码就为10000000(十进制为128),也就是说要IC2的Q0-Q7的电平为这个值。同时还要求VCC为高电平也就是IC1的Q0端为高电平。要满足这个要求先要向LPT控制寄存器写12,这时LPT16脚为高电平,17脚为低电平,IC1为输出态,IC2为锁存,送1到数据寄存器,此时IC1的Q0为高电平,向控制寄存器写0,IC1为锁存,IC2为输出态,是写128到数据寄存器,这时IC2输出脚电平符合要求,LED显示"8"。具体的编程方法请看所附例程。
地址
|
I/O
|
数据位
|
引脚
|
SPP信号
|
数据位为1时引脚电平状态
|
基地址 |
输出 (如果并口支持双向 传输则也可输入数据)
|
Bit0 |
2 |
Data0 |
H (H为高电平,L为低电平) |
Bit1 |
3 |
Data1 |
H |
Bit2 |
4 |
Data2 |
H |
Bit3 |
5 |
Data3 |
H |
Bit4 |
6 |
Data4 |
H |
Bit5 |
7 |
Data5 |
H |
Bit6 |
8 |
Data6 |
H |
Bit7 |
9 |
Data7 |
H |
表3 数据寄存器的相关参数
|