⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lpt_lib.bas

📁 VB控制并口
💻 BAS
字号:
Attribute VB_Name = "lpt_lib"
Option Explicit
'
' ---------------------------------------------------------------------
' File - lpt_lib.bas
'
' Library for accessing the LPT card,
' Code was generated by DriverWizard.
' The library accesses the hardware via WinDriver functions.
'
' Copyright (c) 2005 Jungo Ltd.  http://www.jungo.com
' ---------------------------------------------------------------------
'
Public LPT_ErrorString As String ' If an error occurs, this string will be set to contain a relevant error message

' Internal data structures
Type LPT_IntA_RESULT
    dwCounter As Long   ' number of interrupts received
    dwLost As Long      ' number of interrupts yet to be handled
    fStopped As Boolean     ' was interrupt disabled during wait
End Type

Global Const LPT_MODE_BYTE = 0
Global Const LPT_MODE_INTEGER = 1
Global Const LPT_MODE_LONG = 2

Global Const LPT_IO_Range1 = 0
Global Const LPT_IntA = 1

' Number of IO and memory ranges
Global Const LPT_ITEMS = 1
Global Const LPT_TOTAL_ITEMS = 2

Type LPT_IntA_INTERRUPT
    Int     As WD_INTERRUPT
    hThread As Long   ' HANDLE
    funcIntHandler As Long ' LPT_IntA_HANDLER
End Type


Type LPT_HANDLE
    hWD As Long   ' HANDLE
    IntA As LPT_IntA_INTERRUPT
    cardReg As WD_CARD_REGISTER
End Type


' IO ranges definitions
Global Const LPT_IO_Range1_ADDR = &H378&
Global Const LPT_IO_Range1_BYTES = &H8&

' Interrupts definitions
Global Const LPT_IntA_IRQ = &H7
Global Const LPT_IntA_OPTIONS = 0

' LPT register definitions
Global Const LPT_data_SPACE = LPT_IO_Range1
Global Const LPT_data_OFFSET = &H0&
Global Const LPT_status_SPACE = LPT_IO_Range1
Global Const LPT_status_OFFSET = &H1&
Global Const LPT_control_SPACE = LPT_IO_Range1
Global Const LPT_control_OFFSET = &H2&
Global Const LPT_strobe_addr_SPACE = LPT_IO_Range1
Global Const LPT_strobe_addr_OFFSET = &H3&
Global Const LPT_strobe_data_0_SPACE = LPT_IO_Range1
Global Const LPT_strobe_data_0_OFFSET = &H4&
Global Const LPT_strobe_data_1_SPACE = LPT_IO_Range1
Global Const LPT_strobe_data_1_OFFSET = &H5&
Global Const LPT_strobe_data_2_SPACE = LPT_IO_Range1
Global Const LPT_strobe_data_2_OFFSET = &H6&
Global Const LPT_strobe_data_3_SPACE = LPT_IO_Range1
Global Const LPT_strobe_data_3_OFFSET = &H7&



' Implementation

Function LPT_Open(hLPT As LPT_HANDLE) As Boolean
    Dim ver As WD_Version
    Dim dwStatus As Long

    LPT_ErrorString = ""
    hLPT.cardReg.hCard = 0

    dwStatus = LPT_RegisterWinDriver()
    If dwStatus > 0 Then
        LPT_ErrorString = "Failed registering WinDriver license"
        GoTo Finish
    End If

    hLPT.hWD = WD_Open()

    ' Verify that the handle is valid and that the version number is correct
    If hLPT.hWD = INVALID_HANDLE_VALUE Then
        LPT_ErrorString = "Failed opening WinDriver device"
        GoTo Finish
    End If

    Call WD_Version(hLPT.hWD, ver)
    If (ver.dwVer < WD_VER) Then
        LPT_ErrorString = "Incorrect WinDriver version"
        GoTo Finish
    End If

    Call LPT_SetCardElements(hLPT)
    hLPT.cardReg.fCheckLockOnly = 0
    dwStatus = WD_CardRegister(hLPT.hWD, hLPT.cardReg)
    If hLPT.cardReg.hCard = 0 Then
        LPT_ErrorString = "Failed locking device with status &H" & Hex(dwStatus) & " - " & Stat2Str(dwStatus)
        GoTo Finish
    End If

    hLPT.IntA.Int.hInterrupt = hLPT.cardReg.Card.Item(LPT_IntA).dw3
    hLPT.IntA.Int.dwOptions = hLPT.cardReg.Card.Item(LPT_IntA).dw2
    ' LPT_Open() was successful
    LPT_Open = True
    Exit Function

Finish:  ' An error occured during the execution of LPT_Open()
    If hLPT.cardReg.hCard <> 0 Then
        Call WD_CardUnregister(hLPT.hWD, hLPT.cardReg)
    End If
    If (hLPT.hWD <> INVALID_HANDLE_VALUE) Then
        WD_Close (hLPT.hWD)
    End If
    LPT_Open = False
    MsgBox LPT_ErrorString, vbCritical + vbOKOnly, "LPT"
End Function


Sub LPT_Close(hLPT As LPT_HANDLE)
    ' Disable interrupts
    If LPT_IntAIsEnabled(hLPT) Then
        Call LPT_IntADisable(hLPT)
    End If

    ' Unregister card
    If hLPT.cardReg.hCard <> 0 Then
        Call WD_CardUnregister(hLPT.hWD, hLPT.cardReg)
    End If

    ' close WinDriver
    WD_Close (hLPT.hWD)

End Sub


Function LPT_RegisterWinDriver() As Long
    Dim hWD As Long   ' HANDLE
    Dim lic As WD_License
    Dim dwStatus As Long

    hWD = WD_Open
    If hWD = INVALID_HANDLE_VALUE Then
        dwStatus = WD_INVALID_HANDLE
    Else
        lic.cLicense = "6C3CC2BFF76637EC558F0D4D088AF4534612428E.ssda" & Chr(0)
        dwStatus = WD_License(hWD, lic)
        WD_Close (hWD)
    End If
    LPT_RegisterWinDriver = dwStatus
End Function


Sub LPT_SetCardElements(hLPT As LPT_HANDLE)
    hLPT.cardReg.Card.dwItems = LPT_TOTAL_ITEMS
    '
    hLPT.cardReg.Card.Item(LPT_IO_Range1).Item = ITEM_IO
    hLPT.cardReg.Card.Item(LPT_IO_Range1).fNotSharable = 0
    hLPT.cardReg.Card.Item(LPT_IO_Range1).dw1 = LPT_IO_Range1_ADDR
    hLPT.cardReg.Card.Item(LPT_IO_Range1).dw2 = LPT_IO_Range1_BYTES

    '
     hLPT.cardReg.Card.Item(LPT_IntA).Item = ITEM_INTERRUPT
    hLPT.cardReg.Card.Item(LPT_IntA).fNotSharable = 0
    hLPT.cardReg.Card.Item(LPT_IntA).dw1 = LPT_IntA_IRQ
    hLPT.cardReg.Card.Item(LPT_IntA).dw2 = LPT_IntA_OPTIONS

End Sub


' General read/write function
Sub LPT_ReadWriteBlock(hLPT As LPT_HANDLE, addrSpace As Integer, dwOffset As Long, fRead As Boolean, buf As Long, dwBytes As Long, mode As Integer)
    Dim Trans As WD_Transfer
    Dim fMem As Boolean

    fMem = (hLPT.cardReg.Card.Item(addrSpace).Item = ITEM_MEMORY)
    If fRead Then
        Select Case mode
        Case LPT_MODE_BYTE
            If fMem Then
                Trans.cmdTrans = RM_SBYTE
            Else
                Trans.cmdTrans = RP_SBYTE
            End If
        Case LPT_MODE_INTEGER
            If (fMem) Then
                Trans.cmdTrans = RM_SWORD
            Else
                Trans.cmdTrans = RP_SWORD
            End If
        Case LPT_MODE_LONG
            If (fMem) Then
                Trans.cmdTrans = RM_SDWORD
            Else
                Trans.cmdTrans = RP_SDWORD
            End If
        End Select
    Else
        Select Case mode
        Case LPT_MODE_BYTE
            If (fMem) Then
                Trans.cmdTrans = WM_SBYTE
            Else
                Trans.cmdTrans = WP_SBYTE
            End If
        Case LPT_MODE_INTEGER
            If (fMem) Then
                Trans.cmdTrans = WM_SWORD
            Else
                Trans.cmdTrans = WP_SWORD
            End If
        Case LPT_MODE_LONG
            If (fMem) Then
                Trans.cmdTrans = WM_SDWORD
            Else
                Trans.cmdTrans = WP_SDWORD
            End If
        End Select
    End If
    If (fMem) Then
        Trans.dwPort = hLPT.cardReg.Card.Item(addrSpace).dw3 'Memory.dwTransAddr
    Else
        Trans.dwPort = hLPT.cardReg.Card.Item(addrSpace).dw1 'IO.dwAddr
    End If
    Trans.dwPort = Trans.dwPort + dwOffset

    Trans.fAutoInc = 1
    Trans.dwBytes = dwBytes
    Trans.dwOptions = 0
    Trans.dwLowDataTransfer = buf
    Trans.dwHighDataTransfer = 0
    Call WD_Transfer(hLPT.hWD, Trans)
End Sub


Function LPT_ReadByte(hLPT As LPT_HANDLE, addrSpace As Integer, dwOffset As Long) As Byte
    Dim data As Byte
    Dim pData As Long 'PBYTE

    If hLPT.cardReg.Card.Item(addrSpace).Item = ITEM_MEMORY Then
        pData = (hLPT.cardReg.Card.Item(addrSpace).dw4 + dwOffset)
        Call memcpy(VarPtr(data), pData, LenB(data)) ' read from the memory mapped range directly
    Else
        Call LPT_ReadWriteBlock(hLPT, addrSpace, dwOffset, True, VarPtr(data), 1, LPT_MODE_BYTE)
    End If
    LPT_ReadByte = data
End Function


Function LPT_ReadInteger(hLPT As LPT_HANDLE, addrSpace As Integer, dwOffset As Long) As Integer
    Dim data As Integer
    Dim pData As Long 'PINTEGER

    If hLPT.cardReg.Card.Item(addrSpace).Item = ITEM_MEMORY Then
        pData = (hLPT.cardReg.Card.Item(addrSpace).dw4 + dwOffset)
        Call memcpy(VarPtr(data), pData, LenB(data)) ' read from the memory mapped range directly
    Else
        Call LPT_ReadWriteBlock(hLPT, addrSpace, dwOffset, True, VarPtr(data), 2, LPT_MODE_INTEGER)
    End If
    LPT_ReadInteger = data
End Function


Function LPT_ReadLong(hLPT As LPT_HANDLE, addrSpace As Integer, dwOffset As Long) As Long
    Dim data As Long
    Dim pData As Long 'PLONG

    If hLPT.cardReg.Card.Item(addrSpace).Item = ITEM_MEMORY Then
        pData = (hLPT.cardReg.Card.Item(addrSpace).dw4 + dwOffset)
        Call memcpy(VarPtr(data), pData, LenB(data)) ' read from the memory mapped range directly
    Else
        Call LPT_ReadWriteBlock(hLPT, addrSpace, dwOffset, True, VarPtr(data), 4, LPT_MODE_LONG)
    End If
    LPT_ReadLong = data
End Function


Sub LPT_WriteByte(hLPT As LPT_HANDLE, addrSpace As Integer, dwOffset As Long, data As Byte)
    Dim pData As Long 'PBYTE

    If hLPT.cardReg.Card.Item(addrSpace).Item = ITEM_MEMORY Then
        pData = (hLPT.cardReg.Card.Item(addrSpace).dw4 + dwOffset)
        Call memcpy(pData, VarPtr(data), LenB(data)) ' write to the memory mapped range directly
    Else
        Call LPT_ReadWriteBlock(hLPT, addrSpace, dwOffset, False, VarPtr(data), 1, LPT_MODE_BYTE)
    End If
End Sub


Sub LPT_WriteInteger(hLPT As LPT_HANDLE, addrSpace As Integer, dwOffset As Long, data As Integer)
    Dim pData As Long 'PINTEGER

    If hLPT.cardReg.Card.Item(addrSpace).Item = ITEM_MEMORY Then
        pData = (hLPT.cardReg.Card.Item(addrSpace).dw4 + dwOffset)
        Call memcpy(pData, VarPtr(data), LenB(data)) ' write to the memory mapped range directly
    Else
        Call LPT_ReadWriteBlock(hLPT, addrSpace, dwOffset, False, VarPtr(data), 2, LPT_MODE_INTEGER)
    End If
End Sub


Sub LPT_WriteLong(hLPT As LPT_HANDLE, addrSpace As Integer, dwOffset As Long, data As Long)
    Dim pData As Long 'PLONG

    If hLPT.cardReg.Card.Item(addrSpace).Item = ITEM_MEMORY Then
        pData = (hLPT.cardReg.Card.Item(addrSpace).dw4 + dwOffset)
        Call memcpy(pData, VarPtr(data), LenB(data)) ' write to the memory mapped range directly
    Else
        Call LPT_ReadWriteBlock(hLPT, addrSpace, dwOffset, False, VarPtr(data), 4, LPT_MODE_LONG)
    End If
End Sub


Function LPT_Readdata(hLPT As LPT_HANDLE) As Byte
    LPT_Readdata = LPT_ReadByte(hLPT, CByte(LPT_data_SPACE), LPT_data_OFFSET)
End Function

Sub LPT_Writedata(hLPT As LPT_HANDLE, data As Byte)
    Call LPT_WriteByte(hLPT, CByte(LPT_data_SPACE), LPT_data_OFFSET, data)
End Sub

Function LPT_Readstatus(hLPT As LPT_HANDLE) As Byte
    LPT_Readstatus = LPT_ReadByte(hLPT, CByte(LPT_status_SPACE), LPT_status_OFFSET)
End Function

Sub LPT_Writestatus(hLPT As LPT_HANDLE, data As Byte)
    Call LPT_WriteByte(hLPT, CByte(LPT_status_SPACE), LPT_status_OFFSET, data)
End Sub

Function LPT_Readcontrol(hLPT As LPT_HANDLE) As Byte
    LPT_Readcontrol = LPT_ReadByte(hLPT, CByte(LPT_control_SPACE), LPT_control_OFFSET)
End Function

Sub LPT_Writecontrol(hLPT As LPT_HANDLE, data As Byte)
    Call LPT_WriteByte(hLPT, CByte(LPT_control_SPACE), LPT_control_OFFSET, data)
End Sub

Function LPT_Readstrobe_addr(hLPT As LPT_HANDLE) As Byte
    LPT_Readstrobe_addr = LPT_ReadByte(hLPT, CByte(LPT_strobe_addr_SPACE), LPT_strobe_addr_OFFSET)
End Function

Sub LPT_Writestrobe_addr(hLPT As LPT_HANDLE, data As Byte)
    Call LPT_WriteByte(hLPT, CByte(LPT_strobe_addr_SPACE), LPT_strobe_addr_OFFSET, data)
End Sub

Function LPT_Readstrobe_data_0(hLPT As LPT_HANDLE) As Byte
    LPT_Readstrobe_data_0 = LPT_ReadByte(hLPT, CByte(LPT_strobe_data_0_SPACE), LPT_strobe_data_0_OFFSET)
End Function

Sub LPT_Writestrobe_data_0(hLPT As LPT_HANDLE, data As Byte)
    Call LPT_WriteByte(hLPT, CByte(LPT_strobe_data_0_SPACE), LPT_strobe_data_0_OFFSET, data)
End Sub

Function LPT_Readstrobe_data_1(hLPT As LPT_HANDLE) As Byte
    LPT_Readstrobe_data_1 = LPT_ReadByte(hLPT, CByte(LPT_strobe_data_1_SPACE), LPT_strobe_data_1_OFFSET)
End Function

Sub LPT_Writestrobe_data_1(hLPT As LPT_HANDLE, data As Byte)
    Call LPT_WriteByte(hLPT, CByte(LPT_strobe_data_1_SPACE), LPT_strobe_data_1_OFFSET, data)
End Sub

Function LPT_Readstrobe_data_2(hLPT As LPT_HANDLE) As Byte
    LPT_Readstrobe_data_2 = LPT_ReadByte(hLPT, CByte(LPT_strobe_data_2_SPACE), LPT_strobe_data_2_OFFSET)
End Function

Sub LPT_Writestrobe_data_2(hLPT As LPT_HANDLE, data As Byte)
    Call LPT_WriteByte(hLPT, CByte(LPT_strobe_data_2_SPACE), LPT_strobe_data_2_OFFSET, data)
End Sub

Function LPT_Readstrobe_data_3(hLPT As LPT_HANDLE) As Byte
    LPT_Readstrobe_data_3 = LPT_ReadByte(hLPT, CByte(LPT_strobe_data_3_SPACE), LPT_strobe_data_3_OFFSET)
End Function

Sub LPT_Writestrobe_data_3(hLPT As LPT_HANDLE, data As Byte)
    Call LPT_WriteByte(hLPT, CByte(LPT_strobe_data_3_SPACE), LPT_strobe_data_3_OFFSET, data)
End Sub


Function LPT_IntAIsEnabled(hLPT As LPT_HANDLE) As Boolean
   LPT_IntAIsEnabled = True
    If hLPT.IntA.hThread = 0 Then LPT_IntAIsEnabled = False
End Function

Sub LPT_IntAHandler(pData As LPT_HANDLE)
    Dim hLPT       As LPT_HANDLE
    Dim intResult As LPT_IntA_RESULT

    hLPT = (pData)
    intResult.dwCounter = hLPT.IntA.Int.dwCounter
    intResult.dwLost = hLPT.IntA.Int.dwLost
    intResult.fStopped = (hLPT.IntA.Int.fStopped)
    'Call LPT_IntAHandlerRoutine(hLPT, intResult)
End Sub


'Function LPT_IntAEnable(hLPT As LPT_HANDLE, funcIntHandler As Long) As Boolean
 '   Dim dwStatus As Long

'        If hLPT.IntA.hThread <> 0 Then  ' check if interrupt is already enabled
 '           LPT_IntAEnable = False
  '      Else

   '         ' this calls WD_IntEnable() and creates an interrupt handler thread
    '        hLPT.IntA.funcIntHandler = funcIntHandler
     '       dwStatus = InterruptEnable(hLPT.IntA.hThread, hLPT.hWD, hLPT.IntA.Int, _
      '          AddressOf LPT_IntAHandler, VarPtr(hLPT), Form1.hWnd)
       '     If dwStatus > 0 Then
        '        LPT_ErrorString = "InterruptEnable failed with status &H" & Hex(dwStatus) & " - " & Stat2Str(dwStatus)
         '       LPT_IntAEnable = False
          '  Else
           '     LPT_IntAEnable = True
           ' End If
        'End If
'End Function


Sub LPT_IntADisable(hLPT As LPT_HANDLE)
    If hLPT.IntA.hThread <> 0 Then
        ' this calls WD_IntDisable()
        InterruptDisable (hLPT.IntA.hThread)
        hLPT.IntA.hThread = 0
    End If
End Sub



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -