日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

转:并口编程参考资料

發布時間:2025/5/22 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 转:并口编程参考资料 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文主要介紹并行端口的結構以及簡單的對并口的讀、寫并以及如何獲得端口的狀態。???

并行接口的分類: SPP(標準并行接口) ,EPP(增強型并行接口),ECP(擴展型并行端口)

  標準并行端口(SPP)也是最早的端口定義,主要功能如下,1:并行端口提供了8個數據線以進行并行的字節傳輸,2:計算機能夠通過數據線向打印機發送選能信號,以通知打印機已經準備好接收數據,3:打印機招收到數據后,向計算機發送一個回應信號(NACK)。其各位信號線所代表的意義詳見下表。

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

? 并行接口的大致結構:
?????
并行口一般有25個引腳,其中包括8位數據線,5位打印機狀態線,4位控制線.下面將對這些引腳予以詳細說明:
? (注:1:>出,表示由計算機發向打印機;入,表示由打印機發向計算機,
????? 2:>低電平有效信號用上劃線或星號表示(如S7*),高電平有效信號則沒有上劃線或星號)
??????

引腳號

名稱

數據位 寄存器

數據方向

定義

1

/STROBE

C0*  

選通信號,低電平有效信號,表明線上有數據到達.

2

D0

 DATA_1-DATA_8

 

 

 

 

 

 

?

D1-D8

?

?

?

八位數據線,只有在SPP指令下才有能輸出數據.

?

?

?

?

3

D1

4

D2

5

D3

6

D4

7

D5

8

D6

9

D7

?

10

/ACK

 S6 Status

應答,以插入低電平的形式出現,表明最后一個字符已招收完畢。

11

BUSY

 

S7*

Status

繁忙通知,以插入高電平的方式出現,表明打印機處于忙狀態不能再接收數據。

12

PE

S5 Status

沒有打印機紙。

13

SELECT

 S4 Status

選擇輸入,以插入高電平的方式出現,表明打印機處于在線待命狀態。

14

AUTO FEED

 C1* Control

自動饋送,低電平有效信號民,通知打印機對于每遇到一個回車進行自動換行。

15

/ERROR

S3 Status

錯誤,該信號由打印機發向計算機,表明打印機處于錯誤狀態。

16

/INIT

 C2 Control

初始化,低電平有效信號,該信號用來對打印機進行復位。

17

/SELIN

 C3* Control

選擇輸入,低電平有效信號,表明已經選中的打印機。

18

GND

   

---

信號接地

19

GND

   

---

信號接地

20

GND

   

---

信號接地

21

GND

   

---

信號接地

22

GND

   

---

信號接地

23

GND

   

---

信號接地

24

GND

   

---

信號接地

25

GND

   

---

信號接地

??? 打印機常用端口: 對于LPT1:0X378 為數據發送地址,0X379為打印機狀態地址,0X37A為計算機向打印機控制地址, 通常為了使程序具有通用性我們可以從注冊表中取得這個地址,對于WINDOWS CE 而言,這個值被存儲在{HKEY_LOCAL_MACHINE//DRIVERS//BUILTIN//PARALLEL//IOBASE}.然后我們就可以通過對此三個端口進行控制達到簡單的并口編程的目的.

下面是對打印機狀態端口及打印機控制端口作一詳細解釋:

控制端口:

0x37A

1

1

輸入控制

中斷

17

16

14

1?

  這個0x37A計算機控制打印機的地址,可以產生對打印機進行控制的必要信號,可寫,兩高位(7和8)沒什么用,第6位寫1表示可以向并口輸出數據。第五位中斷信號(IRQ EN),利用此信號線,驅動程序可以在STATUS端口信號(nAck)的幫助下,使用該信號對中斷信號的產生與否進行控制。第3210位分別控制第17線,第16線,第14線和第1線。(可以控制它們的狀態)具體作用可參見前表

狀態端口:

0x379

(S7)11

(S6)10應答

(S5)12缺紙

(S4)13聯機

(S3)15 錯誤

?

S2

S1?

S0?

?

0x379為打印機狀態地址,可讀,通過個端口打印機適配器可以很方便的讀取打印機的狀態。

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

S7*(busy):打印機使用該信號表示打印機正處于忙狀態,不能再接收數據。需要強調的是,該信號通過適配器板時,進行了反相處理,因此連接器上的低電平到微處理器時就變成了高電平。

S6(nAck):當適配器發出選通信號時,打印機就會產生該信號作為響應。通常情況下,該信號是高電平,選通打印機之后,打印機首先把該信號設為低電平,然后再返回高電平。

S5(PE):當打印機缺紙時,它就會產生一個這樣的信號,通常情況下,該信號由打印機保持為低電平,打印機紙使用完之后,該信號就會變成高電平。

S4(SELECT):當打印機恢復正常操作時,它就會插入一個高電平的該信號。當打印機處于無效狀態時,訪信號就會變成低電平。

S3(NERROR):當打印機出現錯誤時就會產生這種郵錯信號。產生出錯的原因很多,如打印紙堵了或產生了內部錯誤。產生錯誤時該信號就會設置成低電平。

以下為在Windows CE 下打印機各種狀態時,所對應的狀態寄存器的(AL)的值:

1:>在沒接入打印機時寄存器AL值為127,對應二進制是:1111111
2:>打印機在缺紙燈不亮時寄存器AL值為144,對應二進制是:10010000
3:>打印機在缺紙燈亮時寄存器AL值為 119;對應二進制值是:11101111
4:>打印機在不缺紙的情況下寄存器AL值 223,對應二進制值是:11011111
5:>打印機在沒開機的情況下得到AH值為207,對應二進制值是:11001111 

下面介紹對并口的編程控制:

(編程控制示例)(為匯編代碼)
// 此段代碼為并口向打印機進行寫數據,并發送控制信息。

#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
}

// 此段代碼為讀取打印機當前狀態。
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

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。