vb基础   vb实例教程   api调用   控件使用   经验技巧   数据库操作   算法及技术   vb源码下载
您的位置:首页 >> vb教程 >> 算法及技术

vb对低层硬件访问控制
出处:网络

     VB没有提供直接访问低层硬件的控件和方法,一度给对访问硬件感兴趣的编程者带来不便。目前我们可从网上搜索到支持低层硬件访问的DLL和ActiveX控件,通过它们可读写存储器单元、端口,甚至控制硬件中断。下面通过两个利用DLL和ActiveX控件示例介绍VB对低层硬件的访问控制。

一、利用DLL读写端口

----若在应用程序中只是简单地读写端口,利用DLL编程实现较为简便。从http://personal.vsnl.com/sr网站可下载一个免费的32位VBIO.DLL,该连接库允许在VB4、5或6中使用,共有七个函数和过程,分别为:

AnjanDLL的解锁过程

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

中 断 事 件 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

[返回]

     

首页 | 设为首页 | 加入收藏 | 关于本站 | 友情链接 | 版权声明

     
 
Copyright© www.bianceng.cn Powered by 编程入门网 All Rights Reserved
吉ICP备06005558号