微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > PC并行端口作为数字I/O口的应用

PC并行端口作为数字I/O口的应用

时间:10-23 来源:本站整理 点击:

  为了在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 port

  temp_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 port

  DWORD temp_dwPortVal;

  unsigned int temp_aa;

  GetPortVal(m_nportControl, &temp_dwPortVal, 1); //reads a BYTE value from an I/O port

temp_aa=(unsigned int)temp_d

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top