25/05/2018, 00:00

Giao tiếp cổng song song

Cổng song song gồm có 4 đường điều khiển, 5 đường trạng thái và 8 đường dữ liệu bao gồm 5 chế độ hoạt động: - Chế độ tương thích (compatibility). - Chế độ nibble. - Chế độ byte. - Chế độ EPP (Enhanced ...

Cổng song song gồm có 4 đường điều khiển, 5 đường trạng thái và 8 đường dữ liệu bao gồm 5 chế độ hoạt động:

- Chế độ tương thích (compatibility).

- Chế độ nibble.

- Chế độ byte.

- Chế độ EPP (Enhanced Parallel Port).

- Chế độ ECP (Extended Capabilities Port).

3 chế độ đầu tiên sử dụng port song song chuẩn (SPP - Standard Parallel Port) trong khi đó chế độ 4, 5 cần thêm phần cứng để cho phép hoạt động ở tốc độ cao hơn. Sơ đồ chân của máy in như sau:

Cổng song song có ba thanh ghi có thể truyền dữ liệu và điều khiển máy in. Địa chỉ cơ sở của các thanh ghi cho tất cả cổng LPT (line printer) từ LPT1 đến LPT4 được lưu trữtrong vùng dữ liệu của BIOS. Thanh ghi dữ liệu được định vị ở offset 00h, thanh ghi trạng thái ở 01h, và thanh ghi điều khiển ở 02h. Thông thường, địa chỉ cơ sở của LPT1 là 378h, LPT2 là 278h, do đó địa chỉ của thanh ghi trạng thái là 379h hoặc 279h và địa chỉ thanh ghi điều khiển là 37Ah hoặc 27Ah. Tuy nhiên trong một số trường hợp, địa chỉ của cổng song song có thể khác do quá trình khởi động của BIOS. BIOS sẽ lưu trữ các địa chỉ này như sau:

Định dạng các thanh ghi như sau:

Thanh ghi dữ liệu (hai chiều):

Thanh ghi trạng thái máy in (chỉ đọc):

Thanh ghi điều khiển máy in:

x: không sử dụng

IRQ Enable: yêu cầu ngắt cứng; 1 = cho phép; 0 = không cho phép

Chân BUSY được nối với cổng đảo trước khi đưa vào thanh ghi trạng thái, các bit được đưa qua cổng đảo trước khi đưa ra các chân của cổng máy in.

Thông thường tốc độ xử lý dữ liệu của các thiết bị ngoại vi như máy in chậm hơn PC nhiều nên các đường ACK¯ size 12{ {overline { ital "ACK"}} } {}, BUSY và STR STR¯ size 12{ {overline { ital "STR"}} } {} được sử dụng cho kỹ thuật bắt tay. Khởi đầu, PC đặt dữ liệu lên bus sau đó kích hoạt đường STR¯ size 12{ {overline { ital "STR"}} } {} xuống mức thấp để thông tin cho máy in biết rằng dữ liệu đã ổn định trên bus. Khi máy in xử lý xong dữ liệu, nó sẽ trả lại tín hiệu ACK¯ size 12{ {overline { ital "ACK"}} } {} xuống mức thấp để ghi nhận. PC đợi cho đến khi đường BUSY từ máy in xuống thấp (máy in không bận) thì sẽ đưa tiếp dữ liệu lên bus.

Giao tiếp với máy tính

Quá trình giao tiếp với cổng song song dùng 2 chế độ: chế độ chuẩn SPP và chế độ mở rộng. Việc giao tiếp ở chế độ chuẩn mô tả như sau:

Trao đổi dữ liệu qua cổng song song giữa 2 PC dùng chế độ chuẩn

Sơ đồ chân kết nối mô tả như sau:

Ngoài ra, việc kết nối giữa 2 máy tính sử dụng cổng song song có thể dùng chế độ mở rộng, chế độ này cho phép giao tiếp với tốc độ cao hơn.

Trao đổi dữ liệu qua cổng song song giữa 2 PC dùng chế độ mở rộng

Sơ đồ chân kết nối mô tả như sau:

Giao tiếp thiết bị khác

Quá trình giao tiếp với các thiết bị ngoại vi có thể thực hiện thông qua chế độ chuẩn. Để đọc dữ liệu, có thể dùng một IC ghép kênh 2→1 74LS257 và dùng 4 bit trạng thái của cổng song song còn xuất dữ liệu thì sử dụng 8 đường dữ liệu D0 - D7.

Mạch giao tiếp đơn giản thông qua cổng máy in

Giao diện:

Giao diện của chưnơg trình giao tiếp với cổng máy in

Chương trình giao tiếp trên VB sử dụng thư viện liên kết động để trao đổi dữ liệu với cổng máy in. Thư viện IO.DLL bao gồm các hàm sau:

- Hàm PortOut: xuất 1 byte ra cổng

Private Declare Sub PortOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Byte) 

Port: địa chỉ cổng, Data: dữ liệu xuất

- Hàm PortWordOut: xuất 1 word ra cổng

Private Declare Sub PortWordOut Lib "IO.DLL"  (ByVal 

Port As Integer, ByVal Data As Integer) 

- Hàm PortDWordOut: xuất 1 double word ra cổng

Private Declare Sub PortDWordOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Long) 

- Hàm PortIn: nhập 1 byte từ cổng, trả về giá trị nhập

Private Declare Function PortIn Lib "IO.DLL" (ByVal

Port As Integer) As Byte

- Hàm PortWordIn: nhập 1 word từ cổng

Private Declare Function PortWordIn Lib "IO.DLL" (ByVal Port As Integer) As Integer 

- Hàm PortDWordIn: nhập 1 double word từ cổng

Private Declare Function PortDWordIn Lib "IO.DLL" (ByVal Port As Integer) As Long 

Chương trình nguồn:

VERSION 5.00 

Begin VB.Form Form1 

Caption = "Printer Interface Example"

ClientHeight = 4665

ClientLeft = 60

ClientTop = 345

ClientWidth = 3585

LinkTopic = "Form1"

ScaleHeight = 4665

ScaleWidth = 3585

StartUpPosition = 3 'Windows Default

Begin VB.CommandButton cmdReceive

Caption = "Receive"

Height = 495

Left = 1200

TabIndex = 18

Top = 3960

Width = 1095

End

Begin VB.CheckBox chkSW

Height = 375

Index = 7

Left = 1800

TabIndex = 17

Top = 3480

Width = 1575

End

Begin VB.CheckBox chkSW

Height = 375

Index = 6

Left = 1800

TabIndex = 16

Top = 3000

Width = 1575

End

Begin VB.CheckBox chkSW

Height = 375

Index = 5

Left = 1800

TabIndex = 15

Top = 2520

Width = 1575

End

Begin VB.CheckBox chkSW

Height = 375

Index = 4

Left = 1800

TabIndex = 14

Top = 2040

Width = 1575

End

Begin VB.CheckBox chkSW

Height = 375

Index = 3

Left = 1800

End

Begin VB.CheckBox chkSW

Height = 375

Index = 7

Left = 1800

TabIndex = 17

Top = 3480

Width = 1575

End

Begin VB.CheckBox chkSW

Height = 375

Index = 6

Left = 1800

TabIndex = 16

Top = 3000

Width = 1575

End

Begin VB.CheckBox chkSW

Height = 375

Index = 5

Left = 1800

TabIndex = 15

Top = 2520

Width = 1575

End

Begin VB.CheckBox chkSW

Height = 375

Index = 4

Left = 1800

TabIndex = 14

Top = 2040

Width = 1575

End

Begin VB.CheckBox chkSW

Height = 375

Index = 3

Left = 1800

TabIndex = 13

Top = 1560

Width = 1575

End

Begin VB.CheckBox chkSW

Height = 375

Index = 2

Left = 1800

TabIndex = 12

Top = 1080

Width = 1575

End

Begin VB.CheckBox chkSW

Height = 375

Index = 1

Left = 1800

TabIndex = 11

Top = 600

Width = 1575

End

Begin VB.CheckBox chkSW

Height = 375

Index = 0

Left = 1800

TabIndex = 10

Top = 120

Width = 1575

End

Begin VB.CommandButton cmdExit

Caption = "Exit"

Height = 495

Left = 2400

TabIndex = 9

Top = 3960

Width = 975

End

Begin VB.CommandButton cmdSend

Caption = "Send"

Height = 495

Left = 0

TabIndex = 8

Top = 3960

Width = 1095

End

Begin VB.Label lblLED

BackStyle = 0 'Transparent

Caption = "LED7"

Height = 375

Index = 7

Left = 240

TabIndex = 7

Top = 3480

Width = 1095

End

Begin VB.Label lblLED

BackStyle = 0 'Transparent

Caption = "LED6"

Height = 375

Index = 6

Left = 240

TabIndex = 6

Top = 3000

Width = 975

End

Begin VB.Label lblLED

BackStyle = 0 'Transparent

Caption = "LED5"

Height = 375

Index = 5

Left = 240

TabIndex = 5

Top = 2520

Width = 975

End

Begin VB.Label lblLED

BackStyle = 0 'Transparent

Caption = "LED4"

Height = 375

Index = 4

Left = 240

TabIndex = 4

Top = 2040

Width = 975

End

Begin VB.Label lblLED

BackStyle = 0 'Transparent

Caption = "LED3"

Height = 375

Index = 3

Left = 240

TabIndex = 3

Top = 1560

Width = 975

End

Begin VB.Label lblLED

BackStyle = 0 'Transparent

Caption = "LED2"

Height = 375

Index = 2

Left = 240

TabIndex = 2

Top = 1080

Width = 975

End

Begin VB.Label lblLED

BackStyle = 0 'Transparent

Caption = "LED1"

Height = 375

Index = 1

Left = 240

TabIndex = 1

Top = 600

Width = 975

End

Begin VB.Label lblLED

BackStyle = 0 'Transparent

Caption = "LED0"

Height = 375

Index = 0

Left = 240

TabIndex = 0

Top = 120

Width = 975

End

Begin VB.Shape shpLED

BorderColor = &H000000FF&

FillColor = &H000000FF&

FillStyle = 0 'Solid

Height = 375

Index = 7

Left = 840

Shape = 3 'Circle

Top = 3480

Width = 375

End

Begin VB.Shape shpLED

BorderColor = &H000000FF&

FillColor = &H000000FF&

FillStyle = 0 'Solid

Height = 375

Index = 6

Left = 840

Shape = 3 'Circle

Top = 3000

Width = 375

End

Begin VB.Shape shpLED

BorderColor = &H000000FF&

FillColor = &H000000FF&

FillStyle = 0 'Solid

Height = 375

Index = 5

Left = 840

Shape = 3 'Circle

Top = 2520

Width = 375

End

Begin VB.Shape shpLED

BorderColor = &H000000FF&

FillColor = &H000000FF&

FillStyle = 0 'Solid

Height = 375

Index = 4

Left = 840

Shape = 3 'Circle

Top = 2040

Width = 375

End

Begin VB.Shape shpLED

BorderColor = &H000000FF&

FillColor = &H000000FF&

FillStyle = 0 'Solid

Height = 375

Index = 3

Left = 840

Shape = 3 'Circle

Top = 1560

Width = 375

End

Begin VB.Shape shpLED

BorderColor = &H000000FF&

FillColor = &H000000FF&

FillStyle = 0 'Solid

Height = 375

Index = 2

Left = 840

Shape = 3 'Circle

Top = 1080

Width = 375

End

Begin VB.Shape shpLED

BorderColor = &H000000FF&

FillColor = &H000000FF&

FillStyle = 0 'Solid

Height = 375

Index = 1

Left = 840

Shape = 3 'Circle

Top = 600

Width = 375

End

Begin VB.Shape shpLED

BorderColor = &H000000FF&

FillColor = &H000000FF&

FillStyle = 0 'Solid

Height = 375

Index = 0

Left = 840

Shape = 3 'Circle

Top = 120

Width = 375

End End 

Attribute VB_Name = "Form1" 

Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = False Attribute VB_PredeclaredId = True Attribute VB_Exposed = False 'IO.DLL 

Private Declare Sub PortOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Byte) 

Private Declare Function PortIn Lib "IO.DLL"(ByVal

Port As Integer) As Byte

'Variable 

Private BA_LPT As Integer 

Private Sub 
          cmdExit_Click()
          End 

End Sub 

Private Sub 
          cmdReceive_Click()

Dim n As Integer 

Dim n1 As Integer Dim i As Integer 

PortOut BA_LPT + 2, &H8 'SELECTIN = 1 PortOut BA_LPT + 2, 0 'SELECTIN = 0 n1 = PortIn(BA_LPT + 1) 'Doc 4 bit thap 

n1 = n1 / &H10 'Dich phai 4 bit

PortOut BA_LPT + 2, 2 'AUTOFEED=1 

n = PortIn(BA_LPT + 1) 'Doc 4 bit cao n = n And &HF0 

n = n + n1 

For i = 0 To 7

chkSW(i).Value = n Mod 2 

If chkSW(i).Value = 0 Then

chkSW(i).Caption="Switch " & Str(i) & "off "

Else

chkSW(i).Caption="Switch " & Str(i) & " on"

End If

n = Fix(n / 2)

Next i

End Sub

Private Sub 
          cmdSend_Click()

Dim t As Integer

Dim i As Integer

Dim s As String t = 0 

For i = 0 To 7 

t = t + (2 ^ i) * (1 - shpLED(i).FillStyle) Next i 

PortOut BA_LPT, t 

PortOut BA_LPT, 1 'STROBE = 1 PortOut BA_LPT, 0 'STROBE = 0

End Sub 

Private Sub 
          Form_Load()

BA_LPT = &H378 

PortOut BA_LPT + 2, 0

End Sub 

Private Sub 
          lblLED_Click(Index As Integer)

shpLED(Index).FillStyle=1- shpLED(Index).FillStyle

End Sub
0