|
图1:电脑侧打印口示意图 (原文件名:200832573749798.jpg)
并口彩图 (原文件名:Ppdb25.png)
软件对应引脚 (原文件名:Softwarepinout.png)
(原文件名:1222.gif)
表中名称前有斜杠的表示低电平有效,寄存器位代表该引脚在8位寄存器中对应的位置。打印口有3个端口:数据端口、状态端口和控制端口,对应的3个寄存器地址分别为:378H、379H和37AH。其中378H可以写,部分电脑通过配置控制寄存器的第5位为1时可以读,部分电脑则不能读,只能写。37AH可读可写,而379H为只读端口。
并口用作电脑打印机接口时,打印口各引脚的定义:
1. 选通, PC->Printer
2-9. 数据(D0-D7)
10 . 应答(ACK), Printer->PC
11. 忙(BUSY), Printer->PC
12. 无纸(PE), Printer->PC
13. 联机(SLCT), Printer->PC
14. 自动换行(AUTO FD), PC->Printer
15. 错误(ERROR), Printer->PC
16. 初始化(INIT), PC->Printer
17. 选择输出(SELECT IN) PC->Printer
18-25. 地(GND)
在雕刻机软件 mach2 的端口与引脚设置里,以下5条引脚是作为输入脚的: 10,11,12,13,15
以下的12条脚,作为输出脚:1,2,3,4,5,6,7,8,9,14,16,17
直接访问和控制电脑的打印口(并行口)
for Windows 98/ME/NT/2000/XP/2003
Victor Chen, (C++ 爱好者)
--------------------------------------------------------------------------------
本程序利用直接端口 I/O 操作来访问并行口。
支持操作系统: Windows 98/ME/2000/XP/2003
程序编译环境: C++ Builder 5.0 / C++ Builder 6.0。
程序演示了:
① 直接向打印机输出数据, 这种方法可以行为单位打印, 每打印一行, 纸走一行的距离。
② 直接控制打印口输出脉冲信号, 输出如右图所示的 LED 循环轮流点亮/闪烁。
--------------------------------------------------------------------------------
(原文件名:12345.gif)
--------------------------------------------------------------------------------
程序提供了 TParallelPort 类, 可直接对打印口操作。
属性:
__property unsigned short Base; //并行口的开始地址, 默认值为 0x378
__property unsigned char Data; //并行口的数据 D0-D7, 可读写
__property unsigned char Flag; //并行口的状态, 包括 ~BUSY, ACK, PE, ONLINE, ~ERROR 等, 这个属性是只读的
__property unsigned char Ctrl; //并行口的状态, 包括 ~INIT, AUTOFD, STORE 等, 这些属性是可写的。
Flag 的各个位的定义:
enum TPrnFlags
{
pfIdle = 0x80, //F7 = ~BUSY
pfAck = 0x40, //F6 = ACK
pfPE = 0x20, //F5 = PE
pfOnLine = 0x10, //F4 = ONLINE
pfNoError = 0x08, //F3 = ~ERROR
};
Ctrl 的各个位的定义:
enum TPrnCtrls
{
pcIRQE = 0x10, //C4
pcSelect = 0x08, //C3
pcFInit = 0x04, //C2 = ~INIT
pcAutoFD = 0x02, //C1
pcStore = 0x01, //C0 = STORE
};
__property bool NoException; //这个属性是控制打印的, 默认为 false, 如果这个属性为 true, 打印不会抛出异常, 而是返回错误码
事件:
__property bool __fastcall (__closure *OnMakeSure)(TPrnError ErrCode); //产生错误时会触发这个事件, 默认的处理是询问是否重试
错误代码:
enum TPrnError
{
peNoError = 0,
peNotOnLine = -1,
peOutOfPaper = -2,
pePrinterErr = -3,
};
方法:
int printf(const char *format,...); //参数与标准 C 的 printf 相同, 返回值为错误码, 这个函数是从打印机输出数据
int vprintf(const char* format, va_list paramList); //参数与标准 C 的 vprintf 相同, 这个函数是从打印机输出数据
void InitPrinter(int iInitDelay=2000, int iInitWait=1000); //初始化打印机, 两个参数分别是初始化时间和初始化之后的延时(ms)
程序还提供了以下函数, 是大家所熟悉的端口操作函数, 可直接操作电脑的硬件端口, 这些函数可直接使用:
unsigned char inportb(unsigned short);
unsigned short inportw(unsigned short);
unsigned long inportd(unsigned short);
void outportb(unsigned short, unsigned char );
void outportw(unsigned short, unsigned short);
void outportd(unsigned short, unsigned long );
--------------------------------------------------------------------------------
程序采用 Yariv Kaplan 的 WinIo 2.0 来进行端口操作。
Yariv Kaplan 的主页: http://www.internals.com/
WinIo 2.0 使用非常简单, 提供一个初始化函数 InitializeWinIo(); 和 关闭结束函数 ShutdownWinIo();
在调用初始化函数成功之后, 就可以进行任意端口操作了, 在程序结束时调用关闭结束函数。
--------------------------------------------------------------------------------
相关下载: WinIo 2.0 (含源代码和帮助) ourdev_526457.zip(文件大小:195K) (原文件名:winio_20.zip)
直接操作并行口 - 下载完整的程序源代码ourdev_526458.rar(文件大小:184K) (原文件名:prnport_bcb_src.rar) |
|