C#实现并口输出输入高低电位
来源:互联网 发布:淘宝内部优惠券口令 编辑:程序博客网 时间:2024/05/01 04:20
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下操作成功,附上源码如下
public class WinIo { [DllImport("WinIo32.dll")] public static extern bool InitializeWinIo(); [DllImport("WinIo32.dll")] public static extern void ShutdownWinIo(); [DllImport("WinIo32.dll")] public static extern bool GetPortVal(IntPtr wPortAddr, out int pdwPortVal, byte bSize); [DllImport("WinIo32.dll")] public static extern bool SetPortVal(IntPtr wPortAddr,int dwPortVal, byte bSize); //以下是与并口无关 [DllImport("WinIo32.dll")] public static extern byte MapPhysToLin(byte pbPhysAddr, uint dwPhysSize, IntPtr PhysicalMemoryHandle); [DllImport("WinIo32.dll")] public static extern bool UnmapPhysicalMemory(IntPtr PhysicalMemoryHandle, byte pbLinAddr); [DllImport("WinIo32.dll")] public static extern bool GetPhysLong(IntPtr pbPhysAddr, byte pdwPhysVal); [DllImport("WinIo32.dll")] public static extern bool SetPhysLong(IntPtr pbPhysAddr, byte dwPhysVal); [DllImport("user32.dll")] public static extern int MapVirtualKey(uint Ucode, uint uMapType); public bool online = false; //WinIo打开标志 //数据端口共8位,控制端口共4位,可以组成1~12位的任意数字输出端口; //状态端口共5位,控制端口共4位,可以组成1~9位的任意数字输入端口 private static IntPtr data_port = (IntPtr)0x378; //数据端口地址 D0-D7 8个端口 private static IntPtr state_port = (IntPtr)0x379; //状态端口地址 S3-S7 只能读取5位 private static IntPtr control_port = (IntPtr)0x37A; //控制端口地址 C0-C3 只能控制或输出4位 /// <summary> /// 设定DataPort输出 /// </summary> /// <param name="WriteValue">设定值:范围为0~255</param> private void setDateBuff(int WriteValue) { IntPtr m_nport = data_port; //数据端口地址data_port int m_nValue = WriteValue; //调用WinIo库函数SetPortVal写端口值 SetPortVal(m_nport, m_nValue, 1); //write a BYTE value to an I/O port } /// <summary> /// 设定ControlPort输出 /// 高4位默认设置,请不要修改,因此输出时保持高位值不变,将要输出的值从低4位输出 /// Control端口C2读写正常,C0、C1、C3写入0则输出高电平,写入1输出低电平;读取亦然 /// </summary> /// <param name="WriteValue">设定值</param> private void setControlBuff(int WriteValue) { IntPtr m_nport = control_port; //获得控制端口地址 //获得控制端口的值, int temp_dwPortVal = 0; GetPortVal(m_nport, out temp_dwPortVal, 1); //reads a BYTE value from an I/O port int temp_aa = temp_dwPortVal & 0xF0; //将低4位置为0;高4位不变 int WriValue = WriteValue & 0x0F; //取设定值低4位;高4位为0 temp_aa = temp_aa | WriteValue; //合并端口值高4位与设定值低4位 temp_aa = temp_aa ^ 0x0B; //将低4位中C0、C1、C3取反(0->1;1->0)(保证设定值与实际电平相吻合) SetPortVal(m_nport, temp_aa, 1); //写出的值中,高4位保持端口原来的值不变,低4位实际输出 } /// <summary> /// 读取ControlPort值 /// Control端口C2读取正常,C0、C1、C3高电平则读入0,低电平则读入1 /// </summary> /// <returns>返回C0-C3 四个端口的值:范围为0~15</returns> private int getControlBuff() { IntPtr m_nport = control_port; //控制端口地址data_port int m_nValue = 0; //调用WinIo库函数SetPortVal写端口值 GetPortVal(m_nport, out m_nValue, 1); //reads a BYTE value from an I/O port int ValueGet = m_nValue ^ 0x0B; //将低4位中C0、C1、C3取反(0->1;1->0) ValueGet = ValueGet & 0x0F; //去掉高4位值 return ValueGet; } /// <summary> /// 读取StatePort值 /// State端口S7高电平则读入0,低电平则读入1;其他正常 /// </summary> /// <returns>返回S3-S7 五个端口的值:范围0-31</returns> private int getStateBuff() { IntPtr m_nport=state_port ; //控制端口地址state_port int dwPortVal =0; GetPortVal(m_nport, out dwPortVal, 1); //reads a BYTE value from an I/O port int ValueGet = dwPortVal ^ 0x80; //将S7取反(保证读取与实际电平相吻合) ValueGet = ValueGet & 0xF8; //去掉S0 ~S2位; ValueGet = ValueGet >> 3; //右移3位,将S7~S3变为低5位 return ValueGet; } public bool OpenWinIo() { if (InitializeWinIo()) { this.online = true; return true; } else { this.online = false; return false; } } public void CloseWinIo() { ShutdownWinIo(); this.online = false; }}
附上WinIo3.0库:WinIo
及小弟例程源码:源码
- C#实现并口输出输入高低电位
- 谈谈串口针脚高低电位测试工具。
- C#并口指令打印的实现总结
- C#并口指令打印的实现总结
- Hi3518EV200平台直接操作GPIO输入或输出高低电平
- Hi3518EV200平台直接操作GPIO输入或输出高低电平
- 代码实现高低电平反转或0-1连续输出
- C#并口操作
- C#操作并口
- C#并口打印类
- C#操作并口
- C# 高低位获取
- C# 串口 并口 打印代码
- C# 串口、并口 打印机控制
- 关于上拉输入、下拉输入、模拟输入、浮空输入、推挽输出、开漏输出、复用输出的区别 [此博文包含图片] (2016-08-04 14:01:56) 转载 ▼ 1、上拉输入:上拉就是把电位拉高,比如
- 实现输出流转输入流
- android 实现输入计算输出
- c#实现拼碎图输出
- 宣布降低Windows Azure 存储和计算的价格
- 启用SQL2008外围管理器
- excel 让单元格上的文字全部显示(英文版)
- http://www.uml.org.cn 学习
- jquery-ajax简单示例
- C#实现并口输出输入高低电位
- 线程 Thread Runnable Join
- javascript鼠标点入input内value值隐藏事件
- Android实现异步加载图片 ListView
- 现代数字影视 电影使用标准
- 坐标变换
- java,hibernate和sql server对应的数据类型
- win 2008R2 下SqlServer 2005 修改密码报错解决方法
- JavaScript File API 文件上传