?? 03.txt
字號:
B對低層硬件訪問控制
VB 沒 有 提 供 直 接 訪 問 低 層 硬 件 的 控 件 和 方 法, 一 度 給 對 訪 問 硬 件 感 興 趣 的 編 程 者 帶 來 不 便。 目 前 我 們 可 從 網 上 搜 索 到 支 持 低 層 硬 件 訪 問 的DLL 和ActiveX 控 件, 通 過 它 們 可 讀 寫 存 儲 器 單 元、 端 口, 甚 至 控 制 硬 件 中 斷。 下 面 通 過 兩 個 利 用DLL 和ActiveX 控 件 示 例 介 紹VB 對 低 層 硬 件 的 訪 問 控 制。
一、 利 用DLL 讀 寫 端 口
----若 在 應 用 程 序 中 只 是 簡 單 地 讀 寫 端 口, 利 用DLL 編 程 實 現 較 為 簡 便。 從http://personal.vsnl.com/sr 網 站 可 下 載 一 個 免 費 的32 位VBIO.DLL, 該 連 接 庫 允 許 在VB4、5 或6 中 使 用, 共 有 七 個 函 數 和 過 程, 分 別 為:
Anjan DLL 的 解 鎖 過 程
Inp 端 口 讀 字 節 函 數
Inpw 端 口 讀 字 函 數
Out 端 口 寫 字 節 過 程
Outw 端 口 寫 字 過 程
GetLptBaseAddr 獲 取 并 口 基 地 址 的 函 數
GetComBaseAddr 獲 取 串 口 基 地 址 的 函 數
----圖1 是 一 個 發 聲 示 例 程 序 的 窗 體, 在 輸 入 框 中 鍵 入 一 頻 率 值 并 按SoundOn 鈕, 則 在PC 機 的 揚 聲 器 中 發 出 指 定 頻 率 音 調, 程 序 中 對 音 調 的 變 化、 聲 音 的 開 關 是 用VBIO.DLL 的 過 程 和 函 數 訪 問 發 聲 系 統 的 定 時 器/ 計 數 器 和 控 制 端 口 實 現 的。 編 程 要 點:1. 應 在Form _Load 中 加 入Anjan 解 鎖 過 程。2. 若 在 模 塊 中 聲 明 函 數 和 過 程, 應 去 掉private 或 用Public 替 代。3.VBIO.DLL 應 拷 貝 到 \windows\system 子 目 錄 下。
----程 序 清 單:
Option Explicit
Private Declare Sub Anjan Lib
“vbio.dll" ()
Private Declare Function Inp Lib
“vbio.dll" (ByVal port &) As Integer
Private Declare Function Inpw Lib
“vbio.dll" (ByVal port &) As Long
Private Declare Sub Out Lib
“vbio.dll" (ByVal port &, ByVal byt %)
Private Declare Sub Outw Lib
“vbio.dll" (ByVal port &, ByVal wrd &)
Private Declare Function GetLptBaseAddr Lib
“vbio.dll" (ByVal lpt &) As Integer
Private Declare Function GetComBaseAddr Lib
“vbio.dll" (ByVal com &) As Integer
Public Sub SetFreq(soundHz As Integer) ' 設 置 頻 率
If soundHz Then
Dim divisor As Long
divisor = 1193180 / soundHz ' 計 算 時 間 常 數
Out &H42, &HB6
'8253 -5 通 道2 設 置 為 方 式3
Out &H42, divisor Mod 256 ' 送 時 間 常 數
Out &H42, divisor \ 256 '
Speaker True
Else
Speaker False
End If
End Sub
Public Sub Speaker(sOn As Boolean) ' 開 關 聲 音
Dim portVal As Integer
portVal = Inp( &H61)
If sOn Then
portVal = portVal Or 3
' 低 位 為 通 道2 的 門 控 信 號
Else ' 次 低 位 為 整 形 與 門 控 制 信 號
portVal = portVal And (Not 3)
End If
Out &H61, portVal
End Sub
Private Sub Form_Load()
Anjan ' 軟 件 解 鎖
End Sub
Private Sub SoundOff_Click()
Speaker False
End Sub
Private Sub SoundOn_Click()
SetFreq Val(TextHz)
End Sub
二、 利 用ActiveX 處 理 硬 件 中 斷
----在 應 用 程 序 中 如 果 需 要 訪 問 存 儲 單 元、 端 口 以 及 處 理 硬 件 中 斷, 使 用TVicHW32 ActiveX 控 件 是 一 很 好 的 選 擇, 該 控 件 是 一 個 共 享 軟 件, 支 持Windows 95/98/NT, 可 從 http://www.entechtaiwan.com/tools.htm 處 下 載。 該 控 件 除 具 備 直 接 訪 問 存 儲 單 元 和 端 口 的 功 能 外, 還 提 供 了 豐 富 的 處 理 并 口 的 屬 性 和 方 法, 以 及 處 理 硬 件 中 斷 的 屬 性、 方 法 和 事 件, 極 大 地 拓 展 了VB 對 低 層 硬 件 的 訪 問 控 制。 下 面 通 過 一 個 顯 示 鍵 盤 中 斷 次 數 和 按 鍵 掃 描 碼 的 示 例 介 紹 控 件 的 使 用 過 程。
下 載TVicHW32 壓 縮 軟 件 包 并 解 壓 到 一 個 目 錄 中, 如\HW。 把 driver 子 目 錄 下 的vichw00.vxd 文 件 拷 貝 到\windows\system 子 目 錄 下, 該 文 件 是 控 件 訪 問 硬 件 的 驅 動 程 序, 使 用 控 件 前 先 用OpenDriver 打 開, 最 后 用Close_Driver 方 法 關 閉。
把ocx 子 目 錄 下 的tvichw32.ocx 拷 貝 到\windows\system 子 目 錄 下, 并 在 DOS 命 令 行 狀 態 下 鍵 入 以 下 命 令 進 行 注 冊:
----regsvr32 tvichw32.ocx
在VB 環 境 下 通 過 菜 單 工 程 - - 部 件 - - 控 件 并 選 擇TVicHW32 ActiveX Control Module 將 控 件 添 加 到 工 具 箱 中。
相 關 的 屬 性、 方 法 及 事 件
方 法 OpenDriver 打 開 支 持 訪 問 硬 件
的 驅 動 程 序vichw.vxd(windows95 下)
方 法 CloseDriver 關 閉 驅 動 程 序
屬 性 ActiveHW As Bool 驅 動 程 序 打 開
則 為True; 關 閉 為False
中 斷 事 件 OnHwInterrupt(ByVal HwCounter As Long,
ByVal LPT_DataReg As Integer,
ByVal LPT_StatusReg As Integer,
ByVal ScanCode As Integer
)
參 數
HwCounter : 中 斷 次 數
LPT_DataReg : 如 果 使 用IRQ7,
則 為 打 印 并 口 的 數 據
LPT_StatusReg : 如 果 使 用IRQ7,
則 為 打 印 并 口 的 數 據
ScanKode : 如 果 使 用IRQ1,
則 為 按 鍵 的 掃 描 碼
屬 性 IRQNumber 指 定 中 斷 號,
范 圍IRQ1 - -15
屬 性 IRQMasked 中 斷 非 屏 蔽 則 為True;
屏 蔽 為False。
----圖2 是 示 例 的 窗 體, 程 序 運 行 后 首 先 按 Open_Driver 鈕 打 開 驅 動 程 序, 然 后 選 擇Unmarsk 復 選 框 開 放 中 斷, 此 時 每 按 一 次 鍵 框 中 分 別 顯 示 該 鍵 的 掃 描 碼 和 中 斷 次 數。 處 理 其 他 中 斷 只 需 更 改 中 斷 號 即 可( 中 斷 號1 —15)。
----程 序 清 單:
Public Sub ShowButtons()
Open_Driver.Enabled = Not HwCtrl.ActiveHW
Close_Driver.Enabled = HwCtrl.ActiveHW
B_Unmask.Enabled = HwCtrl.ActiveHW
End Sub
Private Sub Form_Load()
ShowButtons
End Sub
Private Sub Open_Driver_Click()
HwCtrl.OpenDriver ' 打 開 驅 動 程 序
If Not HwCtrl.ActiveHW Then
MsgBox (“The driver VICHWxx not found")
Else:
HwCtrl.IRQNumber = 1 ' 中 斷 號 為1, 鍵 盤 中 斷
End If
ShowButtons
End Sub
Private Sub Close_Driver_Click()
HwCtrl.CloseDriver ' 關 閉 驅 動 程 序
B_Unmask.Value = 0
ShowButtons
End Sub
Private Sub B_Unmask_Click()
If B_Unmask.Value = 0 Then
HwCtrl.IRQMasked = True
Else
HwCtrl.IRQNumber = 1
Scan_Code = 0
HwCtrl.IRQMasked = False ' 開 放 中 斷
End If
End Sub
Private Sub HwCtrl_OnHwInterrupt
(ByVal HwCounter As Long, ByVal LPT_DataReg As Integer,
ByVal LPT_StatusReg As Integer, ByVal ScanCode As Integer)
Scan_Code.Caption = ScanCode
IRQC.Caption = HwCounter
End Sub
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -