|
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应拷贝到windowssystem子目录下。
----程序清单:
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文件拷贝到windowssystem子目录下,该文件是控件访问硬件的驱动程序,使用控件前先用OpenDriver打开,最后用Close_Driver方法关闭。
把ocx子目录下的tvichw32.ocx拷贝到windowssystem子目录下,并在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复选框开放中断,此时每按一次键框中分别显示 |
|