日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

转:并口编程参考资料

發(fā)布時(shí)間:2025/5/22 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 转:并口编程参考资料 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
本文主要介紹并行端口的結(jié)構(gòu)以及簡(jiǎn)單的對(duì)并口的讀、寫(xiě)并以及如何獲得端口的狀態(tài)。???

并行接口的分類: SPP(標(biāo)準(zhǔn)并行接口) ,EPP(增強(qiáng)型并行接口),ECP(擴(kuò)展型并行端口)

  標(biāo)準(zhǔn)并行端口(SPP)也是最早的端口定義,主要功能如下,1:并行端口提供了8個(gè)數(shù)據(jù)線以進(jìn)行并行的字節(jié)傳輸,2:計(jì)算機(jī)能夠通過(guò)數(shù)據(jù)線向打印機(jī)發(fā)送選能信號(hào),以通知打印機(jī)已經(jīng)準(zhǔn)備好接收數(shù)據(jù),3:打印機(jī)招收到數(shù)據(jù)后,向計(jì)算機(jī)發(fā)送一個(gè)回應(yīng)信號(hào)(NACK)。其各位信號(hào)線所代表的意義詳見(jiàn)下表。

  增強(qiáng)型并行端口(EPP)的出現(xiàn)提供了一種更高性能的連接方式,并東路向下兼容所有在此之前存在的并行接口及外設(shè)。與SPP不同之處在于原來(lái)17個(gè)信號(hào)中的重新定義,在這17個(gè)信號(hào)中,EPP使用了其中的14個(gè)信號(hào)進(jìn)行傳輸,握手和選通,剩下的3個(gè)信號(hào)可以由外設(shè)設(shè)計(jì)者有來(lái)自定義。

? 并行接口的大致結(jié)構(gòu):
?????
并行口一般有25個(gè)引腳,其中包括8位數(shù)據(jù)線,5位打印機(jī)狀態(tài)線,4位控制線.下面將對(duì)這些引腳予以詳細(xì)說(shuō)明:
? (注:1:>出,表示由計(jì)算機(jī)發(fā)向打印機(jī);入,表示由打印機(jī)發(fā)向計(jì)算機(jī),
????? 2:>低電平有效信號(hào)用上劃線或星號(hào)表示(如S7*),高電平有效信號(hào)則沒(méi)有上劃線或星號(hào))
??????

引腳號(hào)

名稱

數(shù)據(jù)位 寄存器

數(shù)據(jù)方向

定義

1

/STROBE

C0*  

選通信號(hào),低電平有效信號(hào),表明線上有數(shù)據(jù)到達(dá).

2

D0

 DATA_1-DATA_8

 

 

 

 

 

 

?

D1-D8

?

?

?

八位數(shù)據(jù)線,只有在SPP指令下才有能輸出數(shù)據(jù).

?

?

?

?

3

D1

4

D2

5

D3

6

D4

7

D5

8

D6

9

D7

?

10

/ACK

 S6 Status

應(yīng)答,以插入低電平的形式出現(xiàn),表明最后一個(gè)字符已招收完畢。

11

BUSY

 

S7*

Status

繁忙通知,以插入高電平的方式出現(xiàn),表明打印機(jī)處于忙狀態(tài)不能再接收數(shù)據(jù)。

12

PE

S5 Status

沒(méi)有打印機(jī)紙。

13

SELECT

 S4 Status

選擇輸入,以插入高電平的方式出現(xiàn),表明打印機(jī)處于在線待命狀態(tài)。

14

AUTO FEED

 C1* Control

自動(dòng)饋送,低電平有效信號(hào)民,通知打印機(jī)對(duì)于每遇到一個(gè)回車進(jìn)行自動(dòng)換行。

15

/ERROR

S3 Status

錯(cuò)誤,該信號(hào)由打印機(jī)發(fā)向計(jì)算機(jī),表明打印機(jī)處于錯(cuò)誤狀態(tài)。

16

/INIT

 C2 Control

初始化,低電平有效信號(hào),該信號(hào)用來(lái)對(duì)打印機(jī)進(jìn)行復(fù)位。

17

/SELIN

 C3* Control

選擇輸入,低電平有效信號(hào),表明已經(jīng)選中的打印機(jī)。

18

GND

   

---

信號(hào)接地

19

GND

   

---

信號(hào)接地

20

GND

   

---

信號(hào)接地

21

GND

   

---

信號(hào)接地

22

GND

   

---

信號(hào)接地

23

GND

   

---

信號(hào)接地

24

GND

   

---

信號(hào)接地

25

GND

   

---

信號(hào)接地

??? 打印機(jī)常用端口: 對(duì)于LPT1:0X378 為數(shù)據(jù)發(fā)送地址,0X379為打印機(jī)狀態(tài)地址,0X37A為計(jì)算機(jī)向打印機(jī)控制地址, 通常為了使程序具有通用性我們可以從注冊(cè)表中取得這個(gè)地址,對(duì)于WINDOWS CE 而言,這個(gè)值被存儲(chǔ)在{HKEY_LOCAL_MACHINE//DRIVERS//BUILTIN//PARALLEL//IOBASE}.然后我們就可以通過(guò)對(duì)此三個(gè)端口進(jìn)行控制達(dá)到簡(jiǎn)單的并口編程的目的.

下面是對(duì)打印機(jī)狀態(tài)端口及打印機(jī)控制端口作一詳細(xì)解釋:

控制端口:

0x37A

1

1

輸入控制

中斷

17

16

14

1?

  這個(gè)0x37A計(jì)算機(jī)控制打印機(jī)的地址,可以產(chǎn)生對(duì)打印機(jī)進(jìn)行控制的必要信號(hào),可寫(xiě),兩高位(7和8)沒(méi)什么用,第6位寫(xiě)1表示可以向并口輸出數(shù)據(jù)。第五位中斷信號(hào)(IRQ EN),利用此信號(hào)線,驅(qū)動(dòng)程序可以在STATUS端口信號(hào)(nAck)的幫助下,使用該信號(hào)對(duì)中斷信號(hào)的產(chǎn)生與否進(jìn)行控制。第3210位分別控制第17線,第16線,第14線和第1線。(可以控制它們的狀態(tài))具體作用可參見(jiàn)前表

狀態(tài)端口:

0x379

(S7)11

(S6)10應(yīng)答

(S5)12缺紙

(S4)13聯(lián)機(jī)

(S3)15 錯(cuò)誤

?

S2

S1?

S0?

?

0x379為打印機(jī)狀態(tài)地址,可讀,通過(guò)個(gè)端口打印機(jī)適配器可以很方便的讀取打印機(jī)的狀態(tài)。

標(biāo)記為S7的信號(hào)表示最高位,SO表示為最低位,只有S3-S7五個(gè)信號(hào)才是真正有用的信號(hào)。他們的具體信號(hào)功能解釋如下:

S7*(busy):打印機(jī)使用該信號(hào)表示打印機(jī)正處于忙狀態(tài),不能再接收數(shù)據(jù)。需要強(qiáng)調(diào)的是,該信號(hào)通過(guò)適配器板時(shí),進(jìn)行了反相處理,因此連接器上的低電平到微處理器時(shí)就變成了高電平。

S6(nAck):當(dāng)適配器發(fā)出選通信號(hào)時(shí),打印機(jī)就會(huì)產(chǎn)生該信號(hào)作為響應(yīng)。通常情況下,該信號(hào)是高電平,選通打印機(jī)之后,打印機(jī)首先把該信號(hào)設(shè)為低電平,然后再返回高電平。

S5(PE):當(dāng)打印機(jī)缺紙時(shí),它就會(huì)產(chǎn)生一個(gè)這樣的信號(hào),通常情況下,該信號(hào)由打印機(jī)保持為低電平,打印機(jī)紙使用完之后,該信號(hào)就會(huì)變成高電平。

S4(SELECT):當(dāng)打印機(jī)恢復(fù)正常操作時(shí),它就會(huì)插入一個(gè)高電平的該信號(hào)。當(dāng)打印機(jī)處于無(wú)效狀態(tài)時(shí),訪信號(hào)就會(huì)變成低電平。

S3(NERROR):當(dāng)打印機(jī)出現(xiàn)錯(cuò)誤時(shí)就會(huì)產(chǎn)生這種郵錯(cuò)信號(hào)。產(chǎn)生出錯(cuò)的原因很多,如打印紙堵了或產(chǎn)生了內(nèi)部錯(cuò)誤。產(chǎn)生錯(cuò)誤時(shí)該信號(hào)就會(huì)設(shè)置成低電平。

以下為在Windows CE 下打印機(jī)各種狀態(tài)時(shí),所對(duì)應(yīng)的狀態(tài)寄存器的(AL)的值:

1:>在沒(méi)接入打印機(jī)時(shí)寄存器AL值為127,對(duì)應(yīng)二進(jìn)制是:1111111
2:>打印機(jī)在缺紙燈不亮?xí)r寄存器AL值為144,對(duì)應(yīng)二進(jìn)制是:10010000
3:>打印機(jī)在缺紙燈亮?xí)r寄存器AL值為 119;對(duì)應(yīng)二進(jìn)制值是:11101111
4:>打印機(jī)在不缺紙的情況下寄存器AL值 223,對(duì)應(yīng)二進(jìn)制值是:11011111
5:>打印機(jī)在沒(méi)開(kāi)機(jī)的情況下得到AH值為207,對(duì)應(yīng)二進(jìn)制值是:11001111 

下面介紹對(duì)并口的編程控制:

(編程控制示例)(為匯編代碼)
// 此段代碼為并口向打印機(jī)進(jìn)行寫(xiě)數(shù)據(jù),并發(fā)送控制信息。

#define LPT_CLEAR_MASK 0x40
#define LPT_STROBE_HI 0x0D
#define LPT_STROBE_LO 0x0C

#define LPT_STATUS_BITS 0xF8
#define LPT_BITS_INVERT 0x48
#define LPT_NOTBUSY 0x80
#define LPT_PAPEROUT 0x20
#define LPT_SELECT 0x10
#define LPT_NFAULT 0x08

#define LPT_TimeOut 0x01

void OutByte(ULONG dataport, BYTE databyte) {
#if x86
_asm {
mov dx, word ptr [dataport]
mov al, byte ptr [databyte]
out dx, al
out dx, al
add dx, 2
in al, dx
and al, LPT_CLEAR_MASK
mov cl, al
or al, LPT_STROBE_HI
out dx, al
out dx, al
out dx, al
out dx, al
or cl, LPT_STROBE_LO
mov al, cl
out dx, al
}
#else


WRITE_PORT_UCHAR((PUCHAR)dataport,databyte);

dataport+=2;
databyte = (READ_PORT_UCHAR((PUCHAR)dataport) & LPT_CLEAR_MASK)
| LPT_STROBE_HI;
WRITE_PORT_UCHAR((PUCHAR)dataport,databyte);

databyte = (READ_PORT_UCHAR((PUCHAR)dataport) & LPT_CLEAR_MASK)
| LPT_STROBE_LO;
WRITE_PORT_UCHAR((PUCHAR)dataport,databyte);

#endif
}

// 此段代碼為讀取打印機(jī)當(dāng)前狀態(tài)。
BYTE CheckStatus(unsigned port) {
BYTE bRet;

#if x86
_asm {
mov dx, word ptr[port]
Checkme:
in al, dx
mov ah, al
nop
nop
in al, dx
cmp al, ah
jnz Checkme
and ah, LPT_STATUS_BITS
xor ah, LPT_BITS_INVERT
test ah, LPT_PAPEROUT or LPT_NFAULT
jnz CS_HasError
test ah, LPT_SELECT
jz CS_HasError
and ah, LPT_NOTBUSY
jz CS_HasError
xor eax, eax
CS_HasError:
mov [bRet],al
}
#else

BYTE bStatus;
do {
bRet= bStatus= READ_PORT_UCHAR((PUCHAR)port);
} while (bStatus != READ_PORT_UCHAR((PUCHAR)port));
bStatus&= LPT_STATUS_BITS;
bStatus^= LPT_BITS_INVERT;

if (!(bStatus & (LPT_PAPEROUT | LPT_NFAULT)) &&
(bStatus & LPT_SELECT) && (bStatus & LPT_NOTBUSY))
bRet=0;
#endif
return bRet;
}

// The End

總結(jié)

以上是生活随笔為你收集整理的转:并口编程参考资料的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。