当前位置:首页 >> IT/计算机 >>

PC并行口数字输入输出


一.PC 并行口数字输入/输出 所谓的数字输出就是在程序要求某一个设备的某一开关点开或关, 产生高电位或低电位。 从计算机的观点来说,低电位就是 0.7V 以下(逻辑 0) ,而高电位是 2.1V 以上(逻辑 1) , 若电位处在 0.7~2.1V 时,电位的逻辑状态是不确定的。想要通过计算机去控制外部设备, 最简单的方法就是控制数字输出。 所谓的数字输入, 也就是外界的状况被计算机用 0 或 1 的数值予以记录下来而储存, 此 0 与 1 就代表了外界某一个设备的某一开关点开或关的两种情形。 PC 并行口即可以作数字输出口,也可以作数字输入口。其中的数据端口、控制端口都 可以作为数字输出端口,数据端口共 8 位,控制端口共 4 位,两个端口可以组成 1~12 位的 任意数字输出端口;其中的状态端口、控制端口都可以作为数字输入端口,状态端口共 5 位,控制端口共 4 位,两个端口可以组成 1~9 位的任意数字输入端口。本文给出了并行端 口 3 种寄存器的读写方法,如下图所示:

四、PC 并行口数字输入/输出的 VC 实现 由于 Windows 对系统底层***作采取了屏蔽的策略,因而对用户而言,系统变得更为安 全, 但这却给众多的硬件或者系统软件开发人员带来了不小的困难, 因为只要应用中涉及到 底层的***作, 开发人员就不得不深入到 Windows 的内核去编写属于系统级的设备驱动程序。 对并行口的读写***作就是如此,由于 Windows 对系统的保护,绝对不允许任何的直接 I/O 动作发生,所以必须带上*.dll、*.sys 或*.vxd 文件,这些文件用来让***作系统知道有一个特 定的 I/O 可能会被调用。系统开机后,这些文件中的内容就会加载到内存中,一旦有对应的 动作发生,就会引发 I/O 的实际动作。 本文只是介绍并行口作为数字 I/O 口的使用,不在于介绍并行 I/O 口驱动的编写。故本 文中直接使用由 Yariv Kaplan 编写的 WinIo 库,它有如下特点:WinIo 库通过使用内核模 式下设备驱动程序和 其它一些底层编程技巧绕过 Windows 安全保护机制,允许 32 位 Windows 程序直接对 I/O 口进行***作; 支持 Windows 9x、 Windows NT、 Windows2000、 WindowsXP 环境; Windows NT/2000/XP 在

下,允许非 Administrator 用户应用 WinIo 应用程序;不支持中断。 注意事项:使用这个类代码时请确保不要与其它使用常规 Win32 调用***作并行端口的程 序发生冲突。 WinIo 库在 VC 应用程序中的使用(WinIo 库下载) 为了在 VC 中能正常使用 WinIo 库,必须按以下步骤进行配置: (1):将 WinIo.dll、WinIo.sys、WINIO.VXD 三个文件放在程序可执行文件所在目录下; (2):将 WinIo.lib 添加到工程中,WinIo.lib 及 winio.h 文件必须放在工程目录下; (3):在 StdAfx.h 头文件中加入#include "winio.h"语句; (4):调用 InitializeWinIo 函数初始化 WinIo 驱动库; (5):调用读写 IO 口的 GetPortVal 或 SetPortVal 函数; (6):调用 ShutdownWinIo 函数; 在非管理员权限下运行,必须首先完成以下步骤: (1):将 WinIo.dll、WinIo.sys、WINIO.VXD 三个文件放在任一 WinIo 应用程序可执行文件所在 目录下; (2):以管理员或其它具有管理员权限的用户身份登陆; (3):调用 InstallWinIoDriver 函数,第一个参数设置为 WinIo.sys 文件所在目录路径,第二个 参数设 置为 false; (4):重新启动系统; (5):以普通用户身份登录,现在可以调用 WinIo 库函数; (6): 当不再需要 WinIo 库时, 可以再次以管理员身份或其它具有管理员权限的用户身份登陆 系统,调用 RemoveWinIoDriver 卸载该库; WinIo 库中几个函数说明: (1):初始化与终止 bool _stdcall InitializeWinIo();void _stdcall ShutdownWinIo();

(2):安装与卸载 bool _stdcall InstallWinIoDriver(PSTR pszWinIoDriverPath, bool IsDemandLoaded = false);bool _stdcall RemoveWinIoDriver(); (3):读写 I/O 口 bool _stdcall GetPortVal(WORD wPortAddr, PDWORD pdwPortVal, BYTE bSize);bool _stdcall SetPortVal(WORD wPortAddr, DWORD dwPortVal, BYTE bSize); GetPortVal 函数从指定端口读取一个 BYTE/WORD/DWORD 类型的值; wPortAddr 是指定一个端口地址值; pdwPortVal 为指向一双字节型变量的指针,该变量存储从 wPortAddr 端口读取的值; bSize 指定读取字节数,值可以为 1,2 或 4。 SetPortVal 函数向指定端口写入一个 BYTE/WORD/DWORD 类型的值; 除 dwPortVal 为输入参数,表示待写入外,其余个变量含义与 GetPortVal 相似。 PC 并行口数字输出的 VC 实现(示例工程下载) 为了测试并行口的数字输出,可以准备 12 支 LED 发光二极管,将 LED 的阳极分别与数 据端口引脚 Pin2~Pin9 和控制端口引脚 Pin1、Pin14、Pin16、Pin17 相连接;将 LED 的阴极 连接在一起与并行口的归地引脚 GND 相连即可。在实际控制应用中不能这样连接,因为数 据端口引脚、 控制端口引脚输出的电流非常小, 只有 10mA 左右, 必须添加 其它硬件电路。 (1):数据端口数字输出的 VC 实现 // 获 得 数 据 端 口 地 址 WORD m_nport=(WORD)0x378;// 获 得 要 写 入 数 据 端 口 的 值 WriteValue(数据范围为 0~255)DWORD m_nValue=(DWORD)WriteValue;//调用 WinIo 库函数 SetPortVal 写端口值 SetPortVal(m_nport, m_nValue, 1);//write a BYTE value to an I/O port (2):控制端口数字输出的 VC 实现 //获得控制端口地址 WORD m_nport=(WORD)0x37A; //获得控制端口的值,保持高位值不变, 将 要输出 的值 从低 4 位输 出,且 使连 接器上 的电 位状态 与想 输出的 值一致 DWORD temp_dwPortVal;unsigned int temp_aa;GetPortVal(m_nport, &temp_dwPortVal, 1); //reads a BYTE value from an I/O porttemp_aa=(unsigned int)temp_dwPortVal;temp_aa=temp_aa&0x0F0; //取低 8 位值,将低 4 位置为 0;高 4 位不变;temp_aa=temp_aa^0x0B; //将低 4 位中 C0、C1、 C3 置为 1,C2 置为 0;高 4 位不变;

// 获 得 要 写 入 控 制 端 口 的 值 WriteValue( 数 据 范 围 为 0 ~ 15)unsigned int WriValue;WriValue=WriteValue&0x0F; //取低 4 位;temp_aa=temp_aa^WriValue; //将写入值的 低 4 位中的 C0、C1、C3 取反,C2 位不变,高 4 位保持端口值不变 SetPortVal(m_nport, (DWORD)temp_aa, 1); //写出的值中,高 4 位保持端口原来的值不变,//低 4 位是写入什么电 平,连接器上既是什么电平 (3):数据端口及控制端口组合成 12 位数字输出的 VC 实现 //获得端口地址 WORD m_nportData=(WORD)0x378;WORD m_nportControl=(WORD)0x37A;// 获 得 要 写 入 端 口 的 值 WriteValue( 数 据 范 围 为 0 ~ 4095)DWORD m_nValue=(DWORD)(WriteValue&0x0FF);// 取 低 8 位 值 SetPortVal(m_nportData, m_nValue, 1);//write a BYTE value to Data portDWORD temp_dwPortVal;unsigned int temp_aa;GetPortVal(m_nportControl, &temp_dwPortVal, 1); //reads a BYTE value from an I/O porttemp_aa=(unsigned int)temp_dwPortVal;temp_aa=temp_aa&0x0F0; //取低 8 位值,将低 4 位 置为 0;高 4 位不变;temp_aa=temp_aa^0x0B; //将低 4 位中 C0、C1、C3 置为 1,C2 置为 0; 高 4 位 不 变 ; unsigned int WriValue;WriValue=WriValue>>8;// 取 高 4 位 值 temp_aa=temp_aa^WriValue; //将写入值的低 4 位中的 C0、C1、C3 取反,C2 位不变,高 4 位保持端口值不变 SetPortVal(m_nportControl, (DWORD)temp_aa, 1); //写出的值中, 4 位保 高 持端口原来的值不变,//低 4 位是写入什么电平,连接器上既是什么电平 PC 并行口数字输入的 VC 实现 (1):状态端口数字输入的 VC 实现 为了测试并行口状态端口的数字输入,可以将数据端口引脚 Pin2~Pin6 连接到状态端 口引脚 Pin15、Pin13、Pin12、Pin10、Pin11 上。引脚接好后,先从数据端口输出数据,在从 状态端口和控制端口读出数据,读出的数据应与写入的数据一致,数据范围为 0~31。 DWORD dwPortVal;unsigned int ValueGet=0;//获得端口地址 WORD m_nport=(WORD)0x379;// 获 得 端 口 数 据 GetPortVal(m_nport, &dwPortVal, 1);ValueGet=(unsigned int)dwPortVal;ValueGet=ValueGet^0x80; // 保 持 得 到 的 State 值 与 连 接 器 处 的 值 一 直 ; ValueGet=ValueGet&0xF8; //去掉 S0 ~S2 位;ValueGet=ValueGet>>3; //右移 3 位,将 S7~S3 变为低 5 位 (2):控制端口数字输入的 VC 实现 为了测试并行口控制端口的数字输入,可以将数据端口引脚 Pin2~Pin5 连接到控制端 口引脚 Pin1、Pin14、Pin16、Pin17 上 。引脚接好后,先从数据端口输出数据,在从状态端 口和控制端口读出数据,读出的数据应与写入的数据一致,数据范围为 0~15。 //获得端口地址 WORD m_nport=(WORD)0x37A;//===== 将 C0~C3 位置 1,即使连接器上为 高 电 平 , 使 控 制 端 口 为 输 入 端 口 =====DWORD temp_dwPortVal;unsigned int temp_aa;GetPortVal(m_nport, &temp_dwPortVal, 1); //获取端口的当前值 temp_aa=(unsigned int)temp_dwPortVal;temp_aa=temp_aa&0x0F0; //取低 8 位值,将低 4 位置为 0;高 4 位不变;

temp_aa=temp_aa^0x4; //将低 4 位中 C0、C1、C3 置为 0,C2 置为 1;高 4 位不变; SetPortVal(m_nport, (DWORD)temp_aa, 1); //写出的值中,高 4 位保持端口原来的值不变,// 低 4 位 是 写 高 电 平 , 即 使 连 接 器 上 是 高 电 平 //=============================================================unsigned int ValueGet=0;DWORD dwPortVal;// 获 得 端 口 数 据 GetPortVal(m_nport, &dwPortVal, 1);ValueGet=(unsigned int)dwPortVal; ValueGet=ValueGet^0x0B; //保持 C0,C1,C3 位的值与连接 器处的值一至;ValueGet=ValueGet&0x0F; //去掉高 4 位值 (3):控制端口及状态端口组合成 9 位数字输入的 VC 实现 为了测试并行口的数字输入, 可以将数据端口引脚 Pin2~Pin9 连接到控制端口引脚 Pin1、 Pin14、Pin16、Pin17 和状态端口引脚 Pin15、Pin13、Pin12、Pin10 上 ,Pin11 引脚连接到归 地引脚 GND 或悬空。引脚接好后,先从数据端口输出数据,在从状态端口和控制端口读出 数据,读出的数据应与写入的数据一致,当 Pin11 引脚连接到归地引脚 GND 时,数据范围 为 0~255;当 Pin11 引脚悬空时,数据范围为 256~511。 unsigned int ValueGet=0;// 获 得 端 口 地 址 WORD m_nportState=(WORD)0x379;WORD m_nportControl=(WORD)0x37A;//Read State PortDWORD dwPortVal;unsigned int ValueState=0;GetPortVal(m_nportState, &dwPortVal, 1);ValueState=dwPortVal;ValueState=ValueState^0x80; //保持得到的 State 值与连接器处的值一 直;ValueState=ValueState&0xF8; //去掉 S0 ~S2 位;ValueState=ValueState<<1; //左移 1 位, 将 S7~S3 变为高 5 位//Read control Port//========== 将 C0~C3 位置 1, 即使连接器上是高 电平 ,使控制端口为输入端口=====GetPortVal(m_nportControl, &dwPortVal, 1); //获取端口 的当前值 ValueGet=(unsigned int)dwPortVal;ValueGet=ValueGet&0x0F0; //取低 8 位值,将低 4 位置为 0;高 4 位不变;ValueGet=ValueGet^0x4; //将低 4 位中 C0、C1、C3 置为 0,C2 置为 1;高 4 位不变;SetPortVal(m_nportControl, (DWORD)ValueGet, 1); //写出的值中,高 4 位保持 端 口 原 来 的 值 不 变 , // 低 4 位 是 写 高 电 平 , 即 使 连 接 器 上 是 高 电 平 //=============================================================unsigned int ValueControl=0;GetPortVal(m_nportControl, &dwPortVal, 1);ValueControl=(unsigned int)dwPortVal; ValueControl=ValueControl^0x0B; //保持 C0,C1,C3 位的值与连接器处的值一至; ValueControl=ValueControl&0x0F; // 去 掉 高 4 位 值 //get 9bit valueValueGet=ValueState^ValueControl;

本 文 来 自 CSDN 博 客 , 转 载 请 http://blog.csdn.net/cyd411/archive/2009/04/03/4018567.aspx












相关文章:
数字程控交换机接口(使用说明书)
内线部分有用户接口并行数据接口与串行数据接口。...⑦ 线路信令码查看 电脑串口 1 连接数字交换机串口...-21─–1dBm 2.1.2 输入输出阻抗:600Ω 2.1....
视频输入输接口(图解)
输入输出接口上看到很多视频接口,这些视频接口哪些是模拟接口、 哪些是数字接口,...6 而 评价: 它的设计初衷是成为电子设备(包括便携式摄像机、个人电脑数字...
微机课程设计 数字时钟
2、电路图 1) 、LED 数码管显示电路 2) 、8253 计时器和 8255 并行通信...号数据口 MOV AL,81H MOV DX,203H ;A.B 口方式 0 输出,PC0-3 输入,...
整理(带参考答案) 复习题15+14年
整理(带参考答案) 复习题15+14年_电脑基础知识_IT...处理数值数据,而且还能处理图像和声音等非数值数据 ...输入/输出接口电路等都集成在一起,这块芯片称为__...
数字电压表
数字电压表_电脑基础知识_IT/计算机_专业资料。数字电压表设计 姓名:袁月 专业:...8 位的 I/O 口(即 P0、P1、P2 和 P3),用以 完成数据的并行输入/输出。...
计算机控制作业
PC兼容的插入式板卡,该卡提供32路 数字输入、32路数字输出和3 个计数器/...2 安装于测试 2.1 基址的选择 PCL-720 数据采集卡是通过计算机的I/O 口来...
微型计算机基于8086cup数字时钟课程设计
基于 8086CPU 的数字时钟的设计 设计任务(主要技术...2.4 系统原理通过并行接口芯片 8255 和 8086 计算机...PB0~PB7 为 B 口的 8 条输入输出信号线。 PC...
电脑显示器接口介绍_图文
您的电脑显卡与显示器连接接口选择正确吗? 电脑处理信息的结果,最后都要输出到...DVI 数字输入接口:DVI(Digital Visual Interface,数字视频接口)是近年来随着数字...
模拟接口与数字接口.._图文
进行视频、音频 混合编码,信号会互相干扰,所以它的画质输出质量是所有接口中最差...一般 数字信号一般不存在此问题。 还有一种“UPC”的工艺,它的衰耗比 PC 要...
电脑检测卡 数字清单
电脑检测卡 数字清单 C0:开机检测代码显示 C0,这为...21 维持不可屏蔽中断(NMI)位(奇偶性或输入/输出...检测和安 装固定并行口。 85 . 已检查存储器的...
更多相关标签: