当前位置:首页 >> 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












相关文章:
并行数字输入输出端口的使用_4
1 4.1 MSP430 系列微控制器的并行数字输入/输出端口 MSP430 系列微控制器最多...并行数据接口连接 #include <MSP430.h> const unsigned char decoder_seg7[18...
PC机标准并行接口的原理和应用
LED 数字显示牌,来说明 PC 机标准并行接口(SPP)的基本工作原理和编程方 法. ...可进行 9Bits 的并行输入和 12Bits 的并行输出. 通常可选择 Nibble (4bits)...
8255可编程并行接口(基本输入输出、动静态七段数码管、...
编程从键盘输入一位十进制数字(0~9) ,在七段数码管上 显示出来。 (2)动态...不变,位码 驱动输入端 S1 接+5V(选中) ,S0 接 8255A 的 C 口的 PC1...
并行端口
并行端口_信息与通信_工程科技_专业资料。PC 并行端口作为数字 I/O 口的应用方法...4位口一次只能输入4位数据,但可以输出8位数据;8位口可以一次 输入输出8位...
计算机常见通讯接口
计算机常见通讯接口_电脑基础知识_IT/计算机_专业资料...目前已经有数码相机、数字音箱、扫描仪、键盘、 鼠标...在数据输出过程中,CPU 把要输出的字符(并行地)送...
PC机并口的数据和使用
PC 机并行端口的数据和使用早期 PC 机的并行口通常...电平输出,和 5 路 TTL 电平输入信号,如果外加译码...图 4 所示是利用串入并出数字芯片组成的 8 位...
计​算​机​接​口​概​念​介​绍
则进行 数据的输入输出,否则 CPU 等待,循环查询...二、常见接口 1.并行接口 目前,计算机中的并行接口...现在的 PC 机一般至少有两个串行口 COM1 和 COM...
电脑配置的作用
1 输入输出设备:电脑只能识别二进制数字电信号, 而人们习惯于接受图文声像信号...现在的电脑至少有两个串行口 COM1 和 COM2。 #1 并行通讯接口:简称并行口,...
关于WINIO的使用
SetPortVal 函数向指定端口写入一个 BYTE/WORD/DWORD 类型的值; 除 dwPortVal 为输入参数,表示待写入外,其余个变量含义与 GetPortVal 相似。 PC 并行口数字输出...
实验一 数字量输入输出实验
数字输入输出(3) 5页 免费喜欢此文档的还喜欢 PC104采集卡 光隔离数字......3. 通过实验熟悉 51 单片机的并行 I/O 口,并掌握它们的应用。 . 4. 掌握...
更多相关标签: