上一题下一题
跳转到
 
 
  世界如此多姿,发展如此迅速,窥一斑未必还能知全豹。但正如万花筒一样,每一个管窥都色彩斑斓。  
 
 
  知识通道 | 学习首页 | 教师首页 | PK首页 | 知识创造首页 | 企业首页 | 登录
 
本文对应知识领域
VB对低层硬件访问控制
作者:weizhi 申领版权
2010年11月15日 共有 1102 次访问 【添加到收藏夹】 【我要附加题目
受欢迎度:

    
    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 
    

    

 

相关新闻

testtest
上善制度的炼成
新时代呼唤管理理论创新——大卫�梯斯与动态能力理论
创业的不变逻辑
创新管理需要回答的5个问题
十一、弥离
十、转院
九、生机
八、传染
七、求血

您可能对这些感兴趣  

用VB做定时断线程序
VisualBasic中的界面设计原则和编程技巧
VB6.0与Windows API 间的呼叫技巧
制作可以自动隐藏的弹出式菜单
ListBox中的字符串超长显示的解决方法
VB中的Unicode 和 Ansi 格式
优化程序显示速度
Visual Basic 产生渐层的 Form 背景
用VB实现客户——服务器(TCP/IP)
用VB制作注册软件的方法

题目筛选器
日期:
类型:
状态:
得分: <=
分类:
作者:
职业:
关键字:
搜索

 
 
 
  焦点事件
 
  知识体系
 
  职业列表
 
 
  最热文章
 
 
  最多引用文章
 
 
  最新文章
 
 
 
 
网站介绍 | 广告服务 | 招聘信息 | 保护隐私权 | 免责条款 | 法律顾问 | 意见反馈
版权所有 不得转载
沪ICP备 10203777 号 联系电话:021-54428255
  帮助提示    
《我的太学》是一种全新的应用,您在操作中遇到疑问或者问题,请拨打电话13564659895,15921448526。
《我的太学》