VB没有提供直接访问低层硬件的控件和方法,一度给对访问硬件感兴趣的编程者带来不便。目前我们可从网上搜索到支持低层硬件访问的DLL和ActiveX控件,通过它们可读写存储器单元、端口,甚至控制硬件中断。下面通过两个利用DLL和ActiveX控件示例介绍VB对低层硬件的访问控制。
一、利用DLL读写端口
若在应用程序中只是简单地读写端口,利用DLL编程实现较为简便。从网站可下载一个免费的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处理硬件中断
在应用程序中如果需要访问存储单元、端口以及处理硬件中断,使用TVicHW32ActiveX 控件是一很好的选择,该控件是一个共享软件,支持Windows95/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环境下通过菜单工程--部件--控件并选择TVicHW32ActiveXControlModule将控 件添加到工具箱中。
相关的属性、方法及事件
方法OpenDriver打开支持访问硬件
的驱动程序vichw.vxd(windows95下)
方法CloseDriver关闭驱动程序
属性ActiveHWAsBool驱动程序打开
则为True;关闭为False
中断事件
Print OnHwInterrupt(ByValHwCounterAsLong, ByValLPT_DataRegAsInteger, ByValLPT_StatusRegAsInteger, ByValScanCodeAsInteger)
参数
HwCounter:中断次数
LPT_DataReg:如果使用IRQ7,
则为打印并口的数据
LPT_StatusReg:如果使用IRQ7,
则为打印并口的数据
ScanKode:如果使用IRQ1,
则为按键的扫描码
属性IRQNumber指定中断号,
范围IRQ1--15
属性IRQMasked中断非屏蔽则为True;
屏蔽为False。
示例的窗体,程序运行后首先按Open_Driver钮打开驱动程序,然后选择Unmarsk 复选框开放中断,此时每按一次键框中分别显示该键的扫描码和中断次数。处理其他中断只 需更改中断号即可(中断号1—15)。
代码:
Public Sub ShowButtons()
Open_Driver.Enabled = NotHwCtrl.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打开驱动程序
IfNotHwCtrl.ActiveHWThen
MsgBox ("ThedriverVICHWxxnotfound")
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
End If
End Sub