首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

VC++ 並行埠數位 I/O 控制完整指南:WinIo 函式庫、暫存器操作與 LED 測試電路

     編輯:關於VC++

前言

並行埠 (LPT) 以 8 位元並行傳輸,速度遠超序列埠,適合即時控制系統 (單晶片、PLC、數位 I/O 卡)。Windows 保護模式禁止直接 I/O 存取,本文介紹使用 WinIo 函式庫 繞過保護,實現資料/狀態/控制暫存器讀寫,並提供完整 VC++ 範例與硬體測試電路。

並行埠硬體架構 (標準 SPP 模式)

暫存器位址功能腳位位元
資料暫存器Base (0x378)輸出 8 位元 (可讀回)Pin 2~9D0~D7
狀態暫存器Base+1 (0x379)輸入 5 位元 (S3~S7)Pin 15,13,12,10,11S3~S7
控制暫存器Base+2 (0x37A)輸出 4 位元 (可作輸入)Pin 1,14,16,17C0~C3

注意:S7、C0、C1、C3 在接腳端為反相邏輯,讀寫時需對應處理。

WinIo 函式庫設定與使用

  1. 複製 WinIo.dll, WinIo.sys, WINIO.VXD 至執行檔目錄。
  2. 專案加入 WinIo.lib,StdAfx.h 加入 #include "winio.h"。
  3. 初始化:InitializeWinIo();結束:ShutdownWinIo()。
  4. 非管理員執行需先以管理員身分執行 InstallWinIoDriver(path, FALSE) 並重開機。

核心 API


BOOL GetPortVal(WORD wPortAddr, PDWORD pdwPortVal, BYTE bSize); // 讀 1/2/4 bytes
BOOL SetPortVal(WORD wPortAddr, DWORD dwPortVal, BYTE bSize);   // 寫 1/2/4 bytes

VC++ 實作範例

1. 資料埠 8 位元輸出 (0~255)


WORD port = 0x378;
DWORD val = outputValue; // 0~255
SetPortVal(port, val, 1);

2. 控制埠 4 位元輸出 (處理反相)


WORD port = 0x37A;
DWORD cur; GetPortVal(port, &cur, 1);
unsigned int v = (unsigned int)cur;
v = (v & 0xF0) ^ 0x0B; // 保留高 4 位,C0/C1/C3 反相預置為 1
v ^= (outputValue & 0x0F); // 寫入低 4 位 (再次反相抵消)
SetPortVal(port, v, 1);

3. 12 位元合成輸出 (資料埠 8 位 + 控制埠 4 位)


DWORD val = outputValue; // 0~4095
SetPortVal(0x378, val & 0xFF, 1); // 低 8 位

DWORD cur; GetPortVal(0x37A, &cur, 1);
unsigned int v = (unsigned int)cur;
v = (v & 0xF0) ^ 0x0B;
v ^= ((val >> 8) & 0x0F); // 高 4 位
SetPortVal(0x37A, v, 1);

4. 狀態埠 5 位元輸入 (Pin 15,13,12,10,11)


DWORD val; GetPortVal(0x379, &val, 1);
unsigned int v = val ^ 0x80; // S7 反相修正
v = (v & 0xF8) >> 3;         // 取 S7~S3 -> 低 5 位
// 結果 0~31

5. 控制埠 4 位元輸入 (需先設高電位啟用)


// 1. 設 C0~C3 為高電位 (接腳端高) 啟用輸入模式
DWORD cur; GetPortVal(0x37A, &cur, 1);
unsigned int v = (unsigned int)cur;
v = (v & 0xF0) ^ 0x04; // C2=1, C0/C1/C3=0 (接腳端反相後為高)
SetPortVal(0x37A, v, 1);

// 2. 讀取並修正反相
GetPortVal(0x37A, &val, 1);
v = val ^ 0x0B; // C0/C1/C3 反相修正
v &= 0x0F;      // 取低 4 位
// 結果 0~15

6. 9 位元合成輸入 (狀態 5 位 + 控制 4 位)


// 讀狀態埠 -> 左移 1 位佔高 5 位
// 讀控制埠 (啟用輸入後) -> 佔低 4 位
// 合成 0~511 (Pin 11 接地) 或 256~511 (Pin 11 懸空)

硬體測試電路

  • 輸出測試:12 顆 LED 陽極分別接 Pin 2~9, 1,14,16,17,陰極共接 GND (Pin 18~25)。注意:並行埠輸出電流僅 ~10mA,實際應用需加驅動電路 (ULN2803 等)。
  • 輸入測試:用杜邦線將資料埠 Pin 2~9 依序接至狀態/控制埠輸入腳位,程式輸出已知值並讀回驗證。

進階應用建議

  • 加入光耦隔離 (PC817) 提升抗干擾與保護電腦主機板。
  • 使用 EPP/ECP 模式提高頻寬 (需 BIOS 設定與驅動支援)。
  • 現代電腦多無並行埠,可改用 USB 轉並行埠晶片 (CH341, FT232H) 或 USB GPIO 模組 (LabJack, NI USB-6008)。

總結

WinIo 庫提供了在 Windows 9x/NT/2000/XP 下直接存取並行埠 I/O 的最簡單路徑。掌握三大暫存器位址、反相邏輯與讀寫 API,即可開發各類數位 I/O 控制應用。範例程式碼涵蓋 1~12 位元輸出、1~9 位元輸入的完整組合,可直接套用至專案中。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved