目前,,計(jì)算機(jī)中的并行接口主要作為打印機(jī)端口,接口使用的不再是36針接頭而是25針D形接頭,。所謂“并行”,,是指8位數(shù)據(jù)同時(shí)通過并行線進(jìn)行傳送,這樣數(shù)據(jù)傳送速度大大提高,。
現(xiàn)在常見的并口有五種:SPP型,、PS/2型、EPP型,、ECP型和多模式接口,,大多數(shù)PC機(jī)配有SPP并口:
SPP標(biāo)準(zhǔn)并行口有4位、8位,、半8位:4位口一次只能輸入4位數(shù)據(jù),,但可以輸出8位數(shù)據(jù);8位口可以一次輸入和輸出8位數(shù)據(jù);半8位也可以,。
PS/2簡(jiǎn)單雙向并行口:它引入雙向數(shù)據(jù)端口,這種雙向數(shù)據(jù)端口容許外設(shè)每次向PC機(jī)發(fā)送8位信息,。PS/2型并口是指所有具有雙向數(shù)據(jù)端口,,但不支持后面介紹的EPP或ECP模式的并行接口。
EPP增強(qiáng)并行口:允許8位雙向數(shù)據(jù)傳送,,它可以在大約1ms的時(shí)間內(nèi)完成包括握手聯(lián)絡(luò)在內(nèi)的一個(gè)字節(jié)的數(shù)據(jù)傳送;而SPP或SP/2接口則需要大約4ms才能完成同樣的工作,。因此可以連接各種非打印機(jī)設(shè)備,如掃描儀,、LAN適配器,、磁盤驅(qū)動(dòng)器和CDROM 驅(qū)動(dòng)器等。
ECP口擴(kuò)展并行口:是雙向數(shù)據(jù)端口,,并能以ISA總線速度傳送數(shù)據(jù),。ECP有緩沖區(qū),支持命令周期,、數(shù)據(jù)周期和多個(gè)邏輯設(shè)備尋址,,在多任務(wù)環(huán)境下可以使用DMA(直接存儲(chǔ)器訪問)。
多模式接口:許多新型接口支持多種模式,,可以工作在以上提到的部分或全部模式下,,用戶可以使用配置選擇,使用上述各種接口形式,,或只使用其中一些而禁止其它,。
二、PC標(biāo)準(zhǔn)配備并行口介紹
本文主要介紹計(jì)算機(jī)的標(biāo)準(zhǔn)配備并行端口即25針的母接頭端口的應(yīng)用,,在此基礎(chǔ)上可以運(yùn)用相同的原理使用其它模式的并行端口,。并行端口共有25支腳,但不是每支腳均被使用到,。這些腳被區(qū)分為3種主要的功能,,分別是用于數(shù)據(jù)的傳送、檢查打印機(jī)的狀態(tài)及控制打印機(jī),,其接口如下所示:
在PC機(jī)中,,標(biāo)準(zhǔn)并行口使用3個(gè)8位的端口寄存器,PC就是通過對(duì)這些寄存器,,也就是所說的數(shù)據(jù),、狀態(tài)、控制寄存器的讀寫訪問并口的信號(hào)的,。本文中使用一些通用的叫法,,8個(gè)數(shù)據(jù)位分別為D0~D7,,5個(gè)狀態(tài)位為S3~S7,,4個(gè)控制為C0~C3,。其中字母表示了端口寄存器,數(shù)字則表示該信號(hào)在寄存器中的位,。
數(shù)據(jù)寄存器
數(shù)據(jù)端口或稱數(shù)據(jù)寄存器(D0~D7)保存了寫入數(shù)據(jù)輸出端口的一字節(jié)信息,。數(shù)據(jù)端口可以寫入數(shù)據(jù),也可以讀出數(shù)據(jù)(即可擦寫);寫進(jìn)去的當(dāng)然是我們希望從數(shù)據(jù)端口引腳輸出的數(shù)據(jù),,不過讀進(jìn)來的也只是我們上次寫進(jìn)去的數(shù)據(jù),,或是原來保留在里面的數(shù)據(jù),并不是從端口引腳輸入PC的數(shù)據(jù),。數(shù)據(jù)端口引腳是PIN2~PIN9,,其定義如下:
數(shù)據(jù)寄存器(即數(shù)據(jù)輸出端口) 可擦寫、基地址
bit引腳:D-sub信號(hào)名信號(hào)源是否在連接器處倒相
0Pin2D0PC否
1Pin3D1PC否
2Pin4D2PC否
3Pin5D3PC否
4Pin6D4PC否
5Pin7D5PC否
6Pin8D6PC否
7Pin9D7PC否
如果我們把這8支腳當(dāng)成一般的數(shù)字輸出的腳位看待,,上述8支腳就相當(dāng)于是8個(gè)數(shù)字輸出的位置一般,,我們就可以把它們當(dāng)成是8個(gè)可以自由控制的輸出點(diǎn)。當(dāng)我們通過數(shù)據(jù)端口傳送數(shù)據(jù)時(shí),,就是改變這8支腳的電平狀態(tài);而接受方也按照相同的編碼原則解釋,,就可以獲得傳送的數(shù)據(jù)。
狀態(tài)寄存器
狀態(tài)端口或稱狀態(tài)寄存器保存的是5個(gè)輸入(S3~S7)的邏輯狀態(tài),。S0~S2位不出現(xiàn)在并口連接器中,。除了S0以外,狀態(tài)寄存器是只讀的,,讀出數(shù)據(jù)信息是狀態(tài)端口引腳上的邏輯狀態(tài),。S0是支持EPP傳輸并口的超時(shí)標(biāo)志信息,可以用軟件方法清零,。在許多并口中,,狀態(tài)輸入接有上拉電阻。狀態(tài)端口引腳是Pin10~Pin13,、Pin15,,其定義如下:
狀態(tài)寄存器(即狀態(tài)輸入端口) 基地址+1
bit引腳:D-sub信號(hào)名信號(hào)源是否在連接器處倒相
0Time-Out
1未使用
2未使用
3Pin15nError(nFault)外設(shè)否
4Pin13Select外設(shè)否
5Pin12PaperEnd外設(shè)否
6Pin10nAck外設(shè)否
7Pin11Busy外設(shè)是
上表中所謂的(基地址+1)指的是:如果我們的LPT地址是378H,在加上1就是379H;這個(gè)地址是專門用來傳遞打印機(jī)的狀態(tài)的,。和數(shù)據(jù)地址比較起來不一樣的是,,這里地址并非在連接器的腳位上均有對(duì)應(yīng)點(diǎn)。在這個(gè)狀態(tài)的顯示上只有5個(gè)腳位有對(duì)應(yīng),,位S0~S2是沒有的--最起碼是無法讓計(jì)算機(jī)有對(duì)應(yīng)的值可讀取,。
如果打印機(jī)接到并口上,那么打印機(jī)的狀態(tài)將會(huì)通過這幾支腳傳送到PC,,程序只要去基地址+1的位置讀取數(shù)值即可知道現(xiàn)在打印機(jī)所處的狀態(tài),。由于這幾支腳可以讓打印機(jī)傳送狀態(tài)給PC,那么我們可以把這幾支腳位拿來當(dāng)作數(shù)字輸入的通道;我們可以讓這幾支腳位的狀態(tài)發(fā)生電位的改變,而利用程序去讀取這些腳位的數(shù)值,,即可實(shí)現(xiàn)數(shù)據(jù)的輸入,。
控制寄存器
控制端口或稱控制寄存器保存了C0~C3的4位的控制信息。C4~C7不出現(xiàn)在并口連接器中,。一般來說,,這些位被用來輸出,然而大多數(shù)SPP中,,控制位為集電極開路/漏極開路模式,,也就是說,它們同樣可以用作輸入,。要從控制位上讀取外部邏輯信號(hào),,首先將向相應(yīng)的輸出寫入“1”,然后讀取控制寄存器的值即可,。但是,,為了提高交換速度,大多數(shù)支持EPP和ECP接口中,,控制位工作在不能用作輸入的推拉模式下,。在一些多模式接口中,控制位采用的是改進(jìn)型的推拉模式,,可以用作輸入,。控制端口引腳是Pin1,、Pin14,、Pin16和Pin17,其定義如下:
控制寄存器(即控制輸出端口) 基地址+2
bit引腳:D-sub信號(hào)名信號(hào)源是否在連接器處倒相
0Pin1nStrobePC是
1Pin14nAutoLFPC是
2Pin16nInitPC否
3Pin17nSelectInPC是
4IRQ
5未使用
6未使用
7未使用
上表中所謂的(基地址+2)指的是:如果我們的LPT地址是378H,,在加上1就是37AH;這個(gè)地址是專門用來控制打印機(jī)動(dòng)作的,。
如同數(shù)據(jù)的送出,我們的程序只要將我們的信息送往(基地址+2)的地址去,,就可以實(shí)現(xiàn)數(shù)據(jù)輸出,,接受端在相應(yīng)引腳就可以接受到相應(yīng)的邏輯電位狀態(tài)。當(dāng)控制端口的信號(hào)源為高電平時(shí),,這些引腳可以作為輸入引腳,,如同狀態(tài)端口引腳一樣。
在上述定義表格中,,所謂“是否在連接器處倒相”是指并口硬件將連接器與相應(yīng)寄存器位之間的4個(gè)信號(hào)進(jìn)行了倒相處理,。具體說來,S7,、C0,、C1,、C3信號(hào)的邏輯狀態(tài)在連接器處是與相應(yīng)寄存器位反相的。當(dāng)你對(duì)這些位進(jìn)行寫操作時(shí),,必須牢記寫入的值應(yīng)該與你想在連接器處設(shè)置的值相反;當(dāng)要對(duì)這些位進(jìn)行讀操作時(shí),,也必須記住所讀取的值與連接器處的值相反。
計(jì)算機(jī)的標(biāo)準(zhǔn)配備并行端口除以上介紹的數(shù)據(jù)端口引腳Pin2~Pin9,、狀態(tài)端口引腳Pin15,、Pin10~Pin13,、控制端口引腳Pin1,、Pin14、pin16,、Pin17外,,連接器上的 其它引腳Pin18~Pin25是歸地引腳GND。
三,、PC并行口數(shù)字輸入/輸出
所謂的數(shù)字輸出就是在程序要求某一個(gè)設(shè)備的某一開關(guān)點(diǎn)開或關(guān),,產(chǎn)生高電位或低電位。從計(jì)算機(jī)的觀點(diǎn)來說,,低電位就是0.7V以下(邏輯0),,而高電位是2.1V以上(邏輯1),若電位處在0.7~2.1V時(shí),,電位的邏輯狀態(tài)是不確定的,。想要通過計(jì)算機(jī)去控制外部設(shè)備,最簡(jiǎn)單的方法就是控制數(shù)字輸出,。
所謂的數(shù)字輸入,,也就是外界的狀況被計(jì)算機(jī)用0或1的數(shù)值予以記錄下來而儲(chǔ)存,此0與1就代表了外界某一個(gè)設(shè)備的某一開關(guān)點(diǎn)開或關(guān)的兩種情形,。
PC并行口即可以作數(shù)字輸出口,,也可以作數(shù)字輸入口。其中的數(shù)據(jù)端口,、控制端口都可以作為數(shù)字輸出端口,,數(shù)據(jù)端口共8位,控制端口共4位,,兩個(gè)端口可以組成1~12位的任意數(shù)字輸出端口;其中的狀態(tài)端口,、控制端口都可以作為數(shù)字輸入端口,狀態(tài)端口共5位,,控制端口共4位,,兩個(gè)端口可以組成1~9位的任意數(shù)字輸入端口。本文給出了并行端口3種寄存器的讀寫方法,,如下圖所示:
四,、PC并行口數(shù)字輸入/輸出的VC實(shí)現(xiàn)
由于Windows對(duì)系統(tǒng)底層操作采取了屏蔽的策略,,因而對(duì)用戶而言,系統(tǒng)變得更為安全,,但這卻給眾多的硬件或者系統(tǒng)軟件開發(fā)人員帶來了不小的困難,,因?yàn)橹灰獞?yīng)用中涉及到底層的操作,開發(fā)人員就不得不深入到Windows的內(nèi)核去編寫屬于系統(tǒng)級(jí)的設(shè)備驅(qū)動(dòng)程序,。對(duì)并行口的讀寫操作就是如此,,由于Windows對(duì)系統(tǒng)的保護(hù),絕對(duì)不允許任何的直接I/O動(dòng)作發(fā)生,,所以必須帶上*.dll,、*.sys或*.vxd文件,這些文件用來讓操作系統(tǒng)知道有一個(gè)特定的I/O可能會(huì)被調(diào)用,。系統(tǒng)開機(jī)后,,這些文件中的內(nèi)容就會(huì)加載到內(nèi)存中,一旦有對(duì)應(yīng)的動(dòng)作發(fā)生,,就會(huì)引發(fā)I/O的實(shí)際動(dòng)作,。
本文只是介紹并行口作為數(shù)字I/O口的使用,不在于介紹并行I/O口驅(qū)動(dòng)的編寫,。故本文中直接使用由 Yariv Kaplan 編寫的 WinIo 庫,,它有如下特點(diǎn):WinIo 庫通過使用內(nèi)核模式下設(shè)備驅(qū)動(dòng)程序和其它一些底層編程技巧繞過 Windows 安全保護(hù)機(jī)制,允許32位 Windows 程序直接對(duì) I/O 口進(jìn)行操作,。
支持Windows 9x,、Windows NT、Windows2000,、WindowsXP環(huán)境;在Windows NT/2000/XP下,,允許非 Administrator 用戶應(yīng)用 WinIo 應(yīng)用程序;不支持中斷。
注意事項(xiàng):使用這個(gè)類代碼時(shí)請(qǐng)確保不要與其它使用常規(guī) Win32 調(diào)用操作并行端口的程序發(fā)生沖突,。
WinIo庫在VC應(yīng)用程序中的使用(WinIo庫下載)
為了在VC中能正常使用WinIo庫,必須按以下步驟進(jìn)行配置:
(1):將WinIo.dll,、WinIo.sys、WINIO.VXD三個(gè)文件放在程序可執(zhí)行文件所在目錄下;
(2):將WinIo.lib添加到工程中,WinIo.lib及winio.h文件必須放在工程目錄下;
(3):在StdAfx.h頭文件中加入#include "winio.h"語句;
(4):調(diào)用InitializeWinIo函數(shù)初始化WinIo驅(qū)動(dòng)庫;
(5):調(diào)用讀寫IO口的GetPortVal或SetPortVal函數(shù);
(6):調(diào)用ShutdownWinIo函數(shù);
在非管理員權(quán)限下運(yùn)行,,必須首先完成以下步驟:
(1):將WinIo.dll,、WinIo.sys、WINIO.VXD三個(gè)文件放在任一WinIo應(yīng)用程序可執(zhí)行文件所在目錄下;
(2):以管理員或其它具有管理員權(quán)限的用戶身份登陸;
(3):調(diào)用InstallWinIoDriver函數(shù),,第一個(gè)參數(shù)設(shè)置為WinIo.sys文件所在目錄路徑,,第二個(gè)參數(shù)設(shè)置為false;
(4):重新啟動(dòng)系統(tǒng);
(5):以普通用戶身份登錄,現(xiàn)在可以調(diào)用WinIo庫函數(shù);
(6):當(dāng)不再需要WinIo庫時(shí),,可以再次以管理員身份或其它具有管理員權(quán)限的用戶身份登陸系統(tǒng),,調(diào)用RemoveWinIoDriver卸載該庫;
WinIo庫中幾個(gè)函數(shù)說明:
(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函數(shù)從指定端口讀取一個(gè)BYTE/WORD/DWORD類型的值;
wPortAddr是指定一個(gè)端口地址值;
pdwPortVal為指向一雙字節(jié)型變量的指針,該變量存儲(chǔ)從wPortAddr端口讀取的值;
bSize指定讀取字節(jié)數(shù),,值可以為1,,2或4,。
SetPortVal函數(shù)向指定端口寫入一個(gè)BYTE/WORD/DWORD類型的值;
除dwPortVal為輸入?yún)?shù),表示待寫入外,,其余個(gè)變量含義與GetPortVal相似,。
PC并行口數(shù)字輸出的VC實(shí)現(xiàn)(示例工程下載)
為了測(cè)試并行口的數(shù)字輸出,可以準(zhǔn)備12支LED發(fā)光二極管,,將LED的陽極分別與數(shù)據(jù)端口引腳Pin2~Pin9和控制端口引腳Pin1,、Pin14、Pin16,、Pin17相連接;將LED的陰極連接在一起與并行口的歸地引腳GND相連即可,。在實(shí)際控制應(yīng)用中不能這樣連接,因?yàn)閿?shù)據(jù)端口引腳,、控制端口引腳輸出的電流非常小,,只有10mA左右,,必須添加 其它硬件電路,。
(1):數(shù)據(jù)端口數(shù)字輸出的VC實(shí)現(xiàn)
//獲得數(shù)據(jù)端口地址
WORD m_nport=(WORD)0x378;
//獲得要寫入數(shù)據(jù)端口的值WriteValue(數(shù)據(jù)范圍為0~255)
DWORD m_nValue=(DWORD)WriteValue;
//調(diào)用WinIo庫函數(shù)SetPortVal寫端口值
SetPortVal(m_nport, m_nValue, 1);//write a BYTE value to an I/O port
(2):控制端口數(shù)字輸出的VC實(shí)現(xiàn)
//獲得控制端口地址
WORD m_nport=(WORD)0x37A;
//獲得控制端口的值,保持高位值不變,將要輸出的值從低4位輸出,,且使連接器上的電位狀態(tài)與想輸出的值一致
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(數(shù)據(jù)范圍為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):數(shù)據(jù)端口及控制端口組合成12位數(shù)字輸出的VC實(shí)現(xiàn)
//獲得端口地址
WORD m_nportData=(WORD)0x378;
WORD m_nportControl=(WORD)0x37A;
//獲得要寫入端口的值WriteValue(數(shù)據(jù)范圍為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_dwPortVal;
temp_aa=temp_aa&0x0F0; //取低8位值,將低4位置為0;高4位不變;
temp_aa=temp_aa^0x0B; //將低4位中C0、C1,、C3置為1,,C2置為0;高4位不變;
unsigned int WriValue;
WriValue=WriValue>>8;//取高4位值
temp_aa=temp_aa^WriValue; //將寫入值的低4位中的C0、C1,、C3取反,,C2位不變,高4位保持端口值不變
SetPortVal(m_nportControl, (DWORD)temp_aa, 1); //寫出的值中,,高4位保持端口原來的值不變,,
//低4位是寫入什么電平,連接器上既是什么電平
PC并行口數(shù)字輸入的VC實(shí)現(xiàn)
(1):狀態(tài)端口數(shù)字輸入的VC實(shí)現(xiàn)
為了測(cè)試并行口狀態(tài)端口的數(shù)字輸入,,可以將數(shù)據(jù)端口引腳Pin2~Pin6連接到狀態(tài)端口引腳Pin15,、Pin13,、Pin12、Pin10,、Pin11上,。引腳接好后,先從數(shù)據(jù)端口輸出數(shù)據(jù),,在從狀態(tài)端口和控制端口讀出數(shù)據(jù),,讀出的數(shù)據(jù)應(yīng)與寫入的數(shù)據(jù)一致,數(shù)據(jù)范圍為0~31,。
DWORD dwPortVal;
unsigned int ValueGet=0;
//獲得端口地址
WORD m_nport=(WORD)0x379;
//獲得端口數(shù)據(jù)
GetPortVal(m_nport, &dwPortVal, 1);
ValueGet=(unsigned int)dwPortVal;
ValueGet=ValueGet^0x80; //保持得到的State值與連接器處的值一直;
ValueGet=ValueGet&0xF8; //去掉S0 ~S2位;
ValueGet=ValueGet>>3; //右移3位,,將S7~S3變?yōu)榈?位
(2):控制端口數(shù)字輸入的VC實(shí)現(xiàn)
為了測(cè)試并行口控制端口的數(shù)字輸入,可以將數(shù)據(jù)端口引腳Pin2~Pin5連接到控制端口引腳Pin1,、Pin14,、Pin16、Pin17上 ,。引腳接好后,,先從數(shù)據(jù)端口輸出數(shù)據(jù),在從狀態(tài)端口和控制端口讀出數(shù)據(jù),,讀出的數(shù)據(jù)應(yīng)與寫入的數(shù)據(jù)一致,,數(shù)據(jù)范圍為0~15。
//獲得端口地址
WORD m_nport=(WORD)0x37A;
//===== 將C0~C3位置1,,即使連接器上為高電平 ,,使控制端口為輸入端口=====
DWORD temp_dwPortVal;
unsigned int temp_aa;
GetPortVal(m_nport, &temp_dwPortVal, 1); //獲取端口的當(dāng)前值
temp_aa=(unsigned int)temp_dwPortVal;
temp_aa=temp_aa&0x0F0; //取低8位值,將低4位置為0;高4位不變;
temp_aa=temp_aa^0x4; //將低4位中C0、C1,、C3置為0,,C2置為1;高4位不變;
SetPortVal(m_nport, (DWORD)temp_aa, 1); //寫出的值中,高4位保持端口原來的值不變,,
//低4位是寫高電平,,即使連接器上是高電平
//=============================================================
unsigned int ValueGet=0;
DWORD dwPortVal;
//獲得端口數(shù)據(jù)
GetPortVal(m_nport, &dwPortVal, 1);
ValueGet=(unsigned int)dwPortVal;
ValueGet=ValueGet^0x0B; //保持C0,C1,C3位的值與連接器處的值一至;
ValueGet=ValueGet&0x0F; //去掉高4位值
(3):控制端口及狀態(tài)端口組合成9位數(shù)字輸入的VC實(shí)現(xiàn)
為了測(cè)試并行口的數(shù)字輸入,可以將數(shù)據(jù)端口引腳Pin2~Pin9連接到控制端口引腳Pin1,、Pin14,、Pin16、Pin17和狀態(tài)端口引腳Pin15,、Pin13,、Pin12、Pin10上,,Pin11引腳連接到歸地引腳GND或懸空,。引腳接好后,先從數(shù)據(jù)端口輸出數(shù)據(jù),,在從狀態(tài)端口和控制端口讀出數(shù)據(jù),,讀出的數(shù)據(jù)應(yīng)與寫入的數(shù)據(jù)一致,,當(dāng)Pin11引腳連接到歸地引腳GND時(shí),數(shù)據(jù)范圍為0~255;當(dāng)Pin11引腳懸空時(shí),,數(shù)據(jù)范圍為256~511,。
unsigned int ValueGet=0;
//獲得端口地址
WORD m_nportState=(WORD)0x379;
WORD m_nportControl=(WORD)0x37A;
//Read State Port
DWORD dwPortVal;
unsigned int ValueState=0;
GetPortVal(m_nportState, &dwPortVal, 1);
ValueState=dwPortVal;
ValueState=ValueState^0x80; //保持得到的State值與連接器處的值一直;
ValueState=ValueState&0xF8; //去掉S0 ~S2位;
ValueState=ValueState<<1; //左移1位,將S7~S3變?yōu)楦?位
//Read control Port
//========== 將C0~C3位置1,,即使連接器上是高電平 ,,使控制端口為輸入端口=====
GetPortVal(m_nportControl, &dwPortVal, 1); //獲取端口的當(dāng)前值
ValueGet=(unsigned int)dwPortVal;
ValueGet=ValueGet&0x0F0; //取低8位值,將低4位置為0;高4位不變;
ValueGet=ValueGet^0x4; //將低4位中C0、C1,、C3置為0,,C2置為1;高4位不變;
SetPortVal(m_nportControl, (DWORD)ValueGet, 1); //寫出的值中,高4位保持端口原來的值不變,,
//低4位是寫高電平,,即使連接器上是高電平
//=============================================================
unsigned int ValueControl=0;
GetPortVal(m_nportControl, &dwPortVal, 1);
ValueControl=(unsigned int)dwPortVal;
ValueControl=ValueControl^0x0B; //保持C0,C1,C3位的值與連接器處的值一至;
ValueControl=ValueControl&0x0F; //去掉高4位值
//get 9bit value
ValueGet=ValueState^ValueControl;
五、結(jié)束
本文只是介紹PC并行端口作為數(shù)字I/O口的應(yīng)用方法,,在實(shí)際運(yùn)用到控制系統(tǒng)中進(jìn)行數(shù)字信號(hào)通信時(shí),,必須注意對(duì)并行端口信號(hào)進(jìn)行其它的處理,以提高端口信號(hào)的抗干擾能力,、穩(wěn)定性及可靠性等,。