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. 【IDEA】创建maven项目时,报错[FATAL_ERROR] Cannot start Maven: Cannot find JRE '1.7'

    在使用IDEA使用maven创建springMVC项目时,出现下面的错误,导致无法创建生成正常的springMVC项目结构,而只有一个pom文件: [FATAL_ERROR] Cannot start ...

  2. 如何在 .NET 库的代码中判断当前程序运行在 Debug 下还是 Release 下

    我们经常会使用条件编译符 #if DEBUG 在 Debug 下执行某些特殊代码.但是一旦我们把代码打包成 dll,然后发布给其他小伙伴使用的时候,这样的判断就失效了,因为发布的库是 Release ...

  3. tomcat  nginx  证书切换

    1. 导出公钥 keytool -export -alias tomcat -keystore <you jks>wsriakey.keystore -file <outputfil ...

  4. CF 1093E Intersection of Permutations——CDQ分治

    题目:http://codeforces.com/contest/1093/problem/E 只能想到转化成查询一个区间里值在一个范围里的数的个数…… 没有想到这样适合用主席树套树状数组维护.不过据 ...

  5. CF 360E Levko and Game——贪心

    题目:http://codeforces.com/contest/360/problem/E 官方题解与证明:http://codeforces.com/blog/entry/9529 一条可以调整的 ...

  6. 洛谷3195(HNOI2008)玩具装箱

    题目:https://www.luogu.org/problemnew/show/P3195 自己做斜率优化的第一道题. 推成斜率优化的样子很重要. 斜率优化的样子就是从 j 中求 i 的话,关系式里 ...

  7. 解决div嵌套时IE8和FF无法自适应高度

    解决div嵌套时IE8和FF无法自适应高度 还是做类似新浪评论回复的时候,将回复的DIV嵌套在一个DIV中,然后点击回复的时候显示子DIV,这是父DIV的高度是会变化的,于是我将父DIV的高度设置为h ...

  8. CentOS 7 named设置主从复制

    前两篇文章介绍了named的安装和配置forward. 本文将介绍named的主从复制. 在从named的配置中添加: zone "weiheng.ink" IN { type s ...

  9. 页面初始加载的是默认刷新一次(f5)

    参考找不到了,不好意思.. 两种可以都试一下,解决问题就好了. 1.----------- <script type="text/javascript"> window ...

  10. 【转】jMeter入门实例

    人们对从认识事物都有一个具体到抽象的过程,学习Jmeter也不例外,通过一个实例来进行学习,一方面可以让初学者有所见即所得的信心,另一方面,其实也是在初学者心中留下了对这事物的一个朦胧的印象,这在以后 ...