若在應用程序中只是簡單地讀寫端口,利用DLL編程實現較為簡便。從http://personal.vsnl.com/sr網站可下載一個免費的32位VBIO.DLL,該連接庫允許在VB4、5或6中使用,共有七個函數和過程,分別為:
AnjanDLL的解鎖過程
Inp端口讀字節函數
Inpw端口讀字函數
Out端口寫字節過程
Outw端口寫字過程
GetLptBaseAddr獲取並口基地址的函數
GetComBaseAddr獲取串口基地址的函數
一個發聲示例程序的窗體,在輸入框中鍵入一頻率值並按SoundOn鈕,則在PC機的揚聲器中發出指定頻率音調,程序中對音調的變化、聲音的開關是用VBIO.DLL的過程和函數訪問發聲系統的定時器/計數器和控制端口實現的。編程要點:
1.應在Form_Load中加入Anjan解鎖過程。
2.若在模塊中聲明函數和過程,應去掉private或用Public替代。
3.VBIO.DLL應拷貝到windowssystem子目錄下。
程序清單:
OptionExplicit
PrivateDeclareSubAnjanLib
“vbio.dll"()
PrivateDeclareFunctionInpLib
“vbio.dll"(ByValport&)AsInteger
PrivateDeclareFunctionInpwLib
“vbio.dll"(ByValport&)AsLong
PrivateDeclareSubOutLib
“vbio.dll"(ByValport&,ByValbyt%)
PrivateDeclareSubOutwLib
“vbio.dll"(ByValport&,ByValwrd&)
PrivateDeclareFunctionGetLptBaseAddrLib
“vbio.dll"(ByVallpt&)AsInteger
PrivateDeclareFunctionGetComBaseAddrLib
“vbio.dll"(ByValcom&)AsInteger
PublicSubSetFreq(soundHzAsInteger)設置頻率
IfsoundHzThen
DimdivisorAsLong
divisor=1193180/soundHz計算時間常數
Out&H42,&HB6
8253-5通道2設置為方式3
Out&H42,divisorMod256送時間常數
Out&H42,divisor256
SpeakerTrue
Else
SpeakerFalse
EndIf
EndSub
PublicSubSpeaker(sOnAsBoolean)開關聲音
DimportValAsInteger
portVal=Inp(&H61)
IfsOnThen
portVal=portVr3
低位為通道2的門控信號
Else次低位為整形與門控制信號
portVal=portValAnd(Not3)
EndIf
Out&H61,portVal
EndSub
PrivateSubForm_Load()
Anjan軟件解鎖
EndSub
PrivateSubSoundOff_Click()
SpeakerFalse
EndSub
PrivateSubSoundOn_Click()
SetFreqVal(TextHz)
EndSub
二、利用ActiveX處理硬件中斷
在應用程序中如果需要訪問存儲單元、端口以及處理硬件中斷,使用TVicHW32ActiveX控件是一很好的選擇,該控件是一個共享軟件,支持Windows95/98/NT,可從http://www.entechtaiwan.com/tools.htm處下載。該控件除具備直接訪問存儲單元和端口的功能外,還提供了豐富的處理並口的屬性和方法,以及處理硬件中斷的屬性、方法和事件,極大地拓展了VB對低層硬件的訪問控制。下面通過一個顯示鍵盤中斷次數和按鍵掃描碼的示例介紹控件的使用過程。
下載TVicHW32壓縮軟件包並解壓到一個目錄中,如HW。把driver子目錄下的vichw00.vxd文件拷貝到windowssystem子目錄下,該文件是控件訪問硬件的驅動程序,使用控件前先用OpenDriver打開,最後用Close_Driver方法關閉。
把ocx子目錄下的tvichw32.ocx拷貝到windowssystem子目錄下,並在DOS命令行狀態下鍵入以下命令進行注冊:
regsvr32tvichw32.ocx
在VB環境下通過菜單工程--部件--控件並選擇TVicHW32ActiveXControlModule將控件添加到工具箱中。
相關的屬性、方法及事件
方法OpenDriver打開支持訪問硬件
的驅動程序vichw.vxd(windows95下)
方法CloseDriver關閉驅動程序
屬性ActiveHWAsBool驅動程序打開
則為True;關閉為False
中斷事件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)。
程序清單:
PublicSubShowButtons()
Open_Driver.Enabled=NotHwCtrl.ActiveHW
Close_Driver.Enabled=HwCtrl.ActiveHW
B_Unmask.Enabled=HwCtrl.ActiveHW
EndSub
PrivateSubForm_Load()
ShowButtons
EndSub
PrivateSubOpen_Driver_Click()
HwCtrl.OpenDriver打開驅動程序
IfNotHwCtrl.ActiveHWThen
MsgBox(“ThedriverVICHWxxnotfound")
Else:
HwCtrl.IRQNumber=1中斷號為1,鍵盤中斷
EndIf
ShowButtons
EndSub
PrivateSubClose_Driver_Click()
HwCtrl.CloseDriver關閉驅動程序
B_Unmask.Value=0
ShowButtons
EndSub
PrivateSubB_Unmask_Click()
IfB_Unmask.Value=0Then
HwCtrl.IRQMasked=True
Else
EndSub