PC并行口各阵脚定义:

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)

并口开机时默认状态:                                        除了C3(17)针及地线外,全部为高;

并口输出输入规则:                                        DataPort      地址0x378   8个针脚(D0-D7) 正常,写入0输出低电平,写入1则输出高电平;

ContorlPort  地址0x37A  4个针脚(C0-C3) C2正常,C0、C1、C3取反-----写入0输出高,写入1则输出低;读取同理;

StatePort       地址0x379   5个针脚(S3-S7) S7取反,其他正常;

 PC并口的8位DataPort 、4位ContorlPort都可以作为数字输出端口,两个端口可以组成1~12位的任意数字输出端口;而这4位StatePort、5位ContorlPort 都可以作为数字输入端口,状态端口共5位,控制端口共4位,两个端口可以组成1~9位的任意数字输入端口。

本人使用WinIo3.0库操作并口,在XP下操作成功,附上源码如下

[csharp] view plaincopy

  1. public class WinIo
  2. {
  3. [DllImport("WinIo32.dll")]
  4. public static extern bool InitializeWinIo();
  5. [DllImport("WinIo32.dll")]
  6. public static extern void ShutdownWinIo();
  7. [DllImport("WinIo32.dll")]
  8. public static extern bool GetPortVal(IntPtr wPortAddr, out int pdwPortVal, byte bSize);
  9. [DllImport("WinIo32.dll")]
  10. public static extern bool SetPortVal(IntPtr wPortAddr,int dwPortVal, byte bSize);
  11. //以下是与并口无关
  12. [DllImport("WinIo32.dll")]
  13. public static extern byte MapPhysToLin(byte pbPhysAddr, uint dwPhysSize, IntPtr PhysicalMemoryHandle);
  14. [DllImport("WinIo32.dll")]
  15. public static extern bool UnmapPhysicalMemory(IntPtr PhysicalMemoryHandle, byte pbLinAddr);
  16. [DllImport("WinIo32.dll")]
  17. public static extern bool GetPhysLong(IntPtr pbPhysAddr, byte pdwPhysVal);
  18. [DllImport("WinIo32.dll")]
  19. public static extern bool SetPhysLong(IntPtr pbPhysAddr, byte dwPhysVal);
  20. [DllImport("user32.dll")]
  21. public static extern int MapVirtualKey(uint Ucode, uint uMapType);
  22. public bool online = false;                          //WinIo打开标志
  23. //数据端口共8位,控制端口共4位,可以组成1~12位的任意数字输出端口;
  24. //状态端口共5位,控制端口共4位,可以组成1~9位的任意数字输入端口
  25. private static IntPtr data_port = (IntPtr)0x378;     //数据端口地址 D0-D7 8个端口
  26. private static IntPtr state_port = (IntPtr)0x379;    //状态端口地址 S3-S7 只能读取5位
  27. private static IntPtr control_port = (IntPtr)0x37A;  //控制端口地址 C0-C3 只能控制或输出4位
  28. /// <summary>
  29. /// 设定DataPort输出
  30. /// </summary>
  31. /// <param name="WriteValue">设定值:范围为0~255</param>
  32. private void setDateBuff(int WriteValue)
  33. {
  34. IntPtr m_nport = data_port;                 //数据端口地址data_port
  35. int m_nValue = WriteValue;
  36. //调用WinIo库函数SetPortVal写端口值
  37. SetPortVal(m_nport, m_nValue, 1);           //write a BYTE value to an I/O port
  38. }
  39. /// <summary>
  40. /// 设定ControlPort输出
  41. /// 高4位默认设置,请不要修改,因此输出时保持高位值不变,将要输出的值从低4位输出
  42. /// Control端口C2读写正常,C0、C1、C3写入0则输出高电平,写入1输出低电平;读取亦然
  43. /// </summary>
  44. /// <param name="WriteValue">设定值</param>
  45. private void setControlBuff(int WriteValue)
  46. {
  47. IntPtr m_nport = control_port;              //获得控制端口地址
  48. //获得控制端口的值,
  49. int temp_dwPortVal = 0;
  50. GetPortVal(m_nport, out temp_dwPortVal, 1); //reads a BYTE value from an I/O port
  51. int temp_aa = temp_dwPortVal & 0xF0;        //将低4位置为0;高4位不变
  52. int WriValue = WriteValue & 0x0F;           //取设定值低4位;高4位为0
  53. temp_aa = temp_aa | WriteValue;             //合并端口值高4位与设定值低4位
  54. temp_aa = temp_aa ^ 0x0B;                   //将低4位中C0、C1、C3取反(0->1;1->0)(保证设定值与实际电平相吻合)
  55. SetPortVal(m_nport, temp_aa, 1);            //写出的值中,高4位保持端口原来的值不变,低4位实际输出
  56. }
  57. /// <summary>
  58. /// 读取ControlPort值
  59. /// Control端口C2读取正常,C0、C1、C3高电平则读入0,低电平则读入1
  60. /// </summary>
  61. /// <returns>返回C0-C3 四个端口的值:范围为0~15</returns>
  62. private int getControlBuff()
  63. {
  64. IntPtr m_nport = control_port;              //控制端口地址data_port
  65. int m_nValue = 0;
  66. //调用WinIo库函数SetPortVal写端口值
  67. GetPortVal(m_nport, out m_nValue, 1);      //reads a BYTE value from an I/O port
  68. int ValueGet = m_nValue ^ 0x0B;            //将低4位中C0、C1、C3取反(0->1;1->0)
  69. ValueGet = ValueGet & 0x0F;                //去掉高4位值
  70. return ValueGet;
  71. }
  72. /// <summary>
  73. /// 读取StatePort值
  74. /// State端口S7高电平则读入0,低电平则读入1;其他正常
  75. /// </summary>
  76. /// <returns>返回S3-S7 五个端口的值:范围0-31</returns>
  77. private int getStateBuff()
  78. {
  79. IntPtr m_nport=state_port ;               //控制端口地址state_port
  80. int dwPortVal =0;
  81. GetPortVal(m_nport, out dwPortVal, 1);    //reads a BYTE value from an I/O port
  82. int ValueGet = dwPortVal ^ 0x80;          //将S7取反(保证读取与实际电平相吻合)
  83. ValueGet = ValueGet & 0xF8;               //去掉S0 ~S2位;
  84. ValueGet = ValueGet >> 3;                 //右移3位,将S7~S3变为低5位
  85. return ValueGet;
  86. }
  87. public bool OpenWinIo()
  88. {
  89. if (InitializeWinIo())
  90. {
  91. this.online  = true;
  92. return true;
  93. }
  94. else
  95. {
  96. this.online  = false;
  97. return false;
  98. }
  99. }
  100. public void CloseWinIo()
  101. {
  102. ShutdownWinIo();
  103. this.online  = false;
  104. }
  105. }

附上WinIo3.0库:WinIo

及小弟例程源码:源码

更多0
相关主题推荐
数据 源码 sel

C#实现并口输出输入高低电位的更多相关文章

  1. 【VB超简单入门】五、基本输出输入

    之前讲了VB IDE的基本操作和概念,接下来要开始将VB语言的编程了. 程序最重要的部分是输出和输入,输入数据,经过计算机处理,再输出结果.本文将介绍两种最基本的输出输入方法,分别是Print.Msg ...

  2. Java基础(5)- 输出输入

    输出输入 public class Input { public static void main (String[] args){ try { /** * 打开文件流进行读取 */ Scanner ...

  3. c++学习笔记---05--- C++输出输入小结

    C++输出输入小结 题目: 这个程序将向用户提出一个"Y/N"问题,然后把用户输入的值赋值给answer变量. 要求: 针对用户输入'Y'或'y'和'N'或'n'进行过滤: 发掘程 ...

  4. c 整数的逆序输出 输入3,2就算 2+22+222的结果

    #include<stdio.h> #include<math.h> //整数逆序输出 void nixu() { int num,i; i = ; scanf("% ...

  5. Python基础-变量定义-输出输入

    一.变量的定义 字母.数字.下划线组成,不能以数字开头,同时区分大小写 二.输出 print() print(,) 输出空格 input() 读取键盘输入

  6. python/基础输出输入用法

    输出及输入的简单用法 print print,中文意思是打印,在python里它不是往纸上打印,而是打印在命令行,或者叫终端.控制台里面.print是python里很基本很常见的一个操作,它的操作对象 ...

  7. C++ stringstream格式化输出输入探索

    - 最近在笔试时经常遇见各种输入问题,于是细心总结一波: - 首先string str; cin>>str;遇到空格结束: - 于是乎产生了getline(),可与得到一行字符串:空格自动 ...

  8. GPIO口的输入输出模式

    1.浮空输入  GPIO_Mode_IN_FLOATING       2.带上拉输入  GPIO_Mode_IPU       3.带下拉输入  GPIO_Mode_IPD       4.模拟输入 ...

  9. MR案例:输出/输入SequenceFile

    SequenceFile文件是Hadoop用来存储二进制形式的key-value对而设计的一种平面文件(Flat File).在SequenceFile文件中,每一个key-value对被看做是一条记 ...

随机推荐

  1. mac下安装伪分布hadoop2.6.0和hbase1.0.1.1

    1.安装JDK,我安装的是java1.7 2.创建管理员账户 3.安装ssh服务(如果已有跳过此步) 4.ssh无密码验证登陆 以上过程略,可参考ubuntu下安装hadoop一文. 5.下载并解压h ...

  2. Linux 中断处理

    HardIRQ 和 softirq : http://www.it165.net/os/html/201211/3766.html 博文:http://blog.csdn.net/yin262/art ...

  3. sssp-springmvc+spring+spring-data-jpa问题总结

    问题:Caused by: java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to re ...

  4. Loj 2534 异或序列

    Loj 2534 异或序列 考虑莫队离线处理.每加一个数,直接询问 \(a[x]\oplus k\) 的前/后缀数目即可,减同理. 利用异或的优秀性质,可以维护异或前缀和,容易做到每次 \(O(1)\ ...

  5. Helm Charts

    Use this repository to submit official Charts for Kubernetes Helm. Charts are curated application de ...

  6. FastAdmin 无刷新地址改变

    FastAdmin 无刷新地址改变 群里有人问 FastAdmin 是不是用了 pjax? 之前有看到 Karson 回复过,其实 FastAdmin 用的是 HTML5 的一个History API ...

  7. Java 设计模式之抽象工厂模式(三)

    原文地址:Java 设计模式之抽象工厂模式(三) 博客地址:http://www.extlight.com 一.前言 上篇文章 <Java 设计模式之工厂模式(二)>,介绍了简单工厂模式和 ...

  8. ZooKeeper+Kafka+Storm

    http://www.cnblogs.com/panfeng412/archive/2012/11/30/how-to-install-and-deploy-storm-cluster.html

  9. 批量修改文件名的bash脚本

    #!/bin/bash while IFS='' read -r line || [[ -n "$line" ]]; do # echo "sox $line --cha ...

  10. ConcurrentLinkedQueue 模拟火车售票过程

    火车票类 public class Ticket { private String NO; // 车票编号 private double price; // 票价 public Ticket(Stri ...