ich beschäftige mich hauptsächlich mit der Ansteuerung von PIO – und CTC Schaltkreisen.
Beim Umstieg von PowerBasic (MS – DOS) auf PureBasic habe ich festgestellt das es an Befehlen zur direkten Hardwareansteuerung mangelt. Dieses Problem konnte ich mit der ‚InpOut32.dll’ einwandfrei lösen. Das nächste Problem war, wenn ich ein Byte ausgelesen habe, ein einzelnes Bit zu erkennen. Um dieses zu lösen, habe ich mich entschlossen den ‚Windows Dll Salat’ zu erweitern und eine von mir so genannte ‚8bit_ident.dll’ geschrieben. Mit der Übergabe eines Byte und Aufruf einer von 8 Prozeduren gibt die Dll den Wert eines Bit zurück. Ich habe diese Dll seit ca. 5 Monaten bei vielen Steuerprogrammen ohne Probleme im Einsatz.
Die Dll muss natürlich kompiliert und ins ‚System’ Verzeichnis kopiert werden.
Für Interessenten ist hier der Quellcode der Dll und ein Testprogramm zur Darstellung der Funktion
(Testprogramm geschrieben von meinem Sohn, alias coder)
Ich würde mich über eure Kritik freuen.
Dll Quellcode:
Code: Alles auswählen
;___________________________________________________________________________
;
; rp 05.2005
;
;DLL Name : 8Bit_ident.dll
;DLL,ermittelt den Wert der einzelnen Bit eines Byte
; aufgerufen wird die Prozedur für das zu ermittelnde Bit (Bit0...7)
; Rückgegeben wird immer "Bitwert" als Ergebnis, 0 oder 1
;
;___________________________________________________________________________
;___________________________________________________________________________
ProcedureDLL Bit7(Bytewert) ;Bit7=128
If Bytewert<128
Bitwert=0
EndIf
If Bytewert>127
Bitwert=1
EndIf
ProcedureReturn Bitwert
EndProcedure
;___________________________________________________________________________
ProcedureDLL Bit6(Bytewert) ;Bit6=64
A=Bytewert/2
B=A/2
C=B/2
D=C/2
E=D/2
F=E/2
Bitwert= F % 2
ProcedureReturn Bitwert
EndProcedure
;___________________________________________________________________________
ProcedureDLL Bit5(Bytewert) ;Bit5=32
A=Bytewert/2
B=A/2
C=B/2
D=C/2
E=D/2
Bitwert= E % 2
ProcedureReturn Bitwert
EndProcedure
;___________________________________________________________________________
ProcedureDLL Bit4(Bytewert) ;Bit4=16
A=Bytewert/2
B=A/2
C=B/2
D=C/2
Bitwert= D % 2
ProcedureReturn Bitwert
EndProcedure
;___________________________________________________________________________
ProcedureDLL Bit3(Bytewert) ;Bit3=8
A=Bytewert/2
B=A/2
C=B/2
Bitwert= C % 2
ProcedureReturn Bitwert
EndProcedure
;___________________________________________________________________________
ProcedureDLL Bit2(Bytewert) ;Bit2=4
A=Bytewert/2
B=A/2
Bitwert= B % 2
ProcedureReturn Bitwert
EndProcedure
;___________________________________________________________________________
ProcedureDLL Bit1(Bytewert) ;Bit1=2
A=Bytewert/2
Bitwert= A % 2
ProcedureReturn Bitwert
EndProcedure
;___________________________________________________________________________
ProcedureDLL Bit0(Bytewert) ;Bit0=Wert 1
Bitwert=Bytewert % 2
ProcedureReturn Bitwert ;entscheidend für Rückgabe des Ergebnis
EndProcedure
;___________________________________________________________________________
;_____________________________________________________rp ©2005______________
Code: Alles auswählen
; ******************************************
; *|--------------------------------------|*
; *|Testprogramm für DLL : 8Bit_ident.dll|*
; *|--------------------------------------|*
; ******************************************
OpenWindow(0, 0, 0, 400, 300, #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget, "8-bit Erkennung"); Window erstellen
If OpenLibrary(0, "8bit_ident.DLL") ;Programmbibliothek '8bit_ident.DLL' laden
Bit7 = IsFunction (0,"Bit7") ;Test der einzelnen Funktionen
Bit6 = IsFunction (0,"Bit6")
Bit5 = IsFunction (0,"Bit5")
Bit4 = IsFunction (0,"Bit4")
Bit3 = IsFunction (0,"Bit3")
Bit2 = IsFunction (0,"Bit2")
Bit1 = IsFunction (0,"Bit1")
Bit0 = IsFunction (0,"Bit0")
If Bit7 And Bit6 And Bit5 And Bit4 And Bit3 And Bit2 And Bit1 And Bit0
DLL_ok=1 ;=1 heißt Funktionen i.o.
Else
MessageRequester("Softwarefehler","Bibliothek '8bit_ident.dll' wurde geladen, ist aber beschädigt.",#PB_MessageRequester_Ok)
CloseLibrary(0)
End
EndIf
Else
MessageRequester("Softwarefehler", "Bibliothek '8bit_indent.dll' konnte nicht geladen werden.")
End
EndIf
;Oberfläche erstellen
If CreateGadgetList(WindowID(0))
StringGadget(0, 15, 15, 80, 20, "", #PB_String_Numeric)
ButtonGadget(1, 120, 15, 100, 30, "Status ermitteln")
ListIconGadget(2, 15, 80, 200, 200, "Bit", 80)
AddGadgetColumn(2, 1, "Bitwert", 80)
ButtonGadget(3, 240, 15, 100, 30, "Exit")
EndIf
Repeat
Select WindowEvent()
Case #PB_Event_CloseWindow:CloseLibrary(0):End
Case #PB_EventGadget
Select EventGadgetID()
Case 1
ClearGadgetItemList(2)
Gosub Ubernahme
Case 3
End
CloseLibrary(0)
EndSelect
EndSelect
ForEver
End
Ubernahme:
bytewert$ = GetGadgetText(0)
Bytewert = Val(bytewert$)
If bytewert > -1 And bytewert < 256
;Hier wird die Dll benutzt
Bitwert=CallFunctionFast (Bit0,Bytewert) ;Bit0 wird ermittelt
ergebnis$ = Str(Bitwert)
AddGadgetItem(2,-1,"Bit 0"+Chr(10)+ergebnis$)
Bitwert=CallFunctionFast (Bit1,Bytewert) ;Bit1 wird ermittelt
ergebnis$ = Str(Bitwert)
AddGadgetItem(2,-1,"Bit 1"+Chr(10)+ergebnis$)
Bitwert=CallFunctionFast (Bit2,Bytewert) ;Bit2 wird ermittelt
ergebnis$ = Str(Bitwert)
AddGadgetItem(2,-1,"Bit 2"+Chr(10)+ergebnis$)
Bitwert=CallFunctionFast (Bit3,Bytewert) ;Bit3 wird ermittelt
ergebnis$ = Str(Bitwert)
AddGadgetItem(2,-1,"Bit 3"+Chr(10)+ergebnis$)
Bitwert=CallFunctionFast (Bit4,Bytewert) ;Bit4 wird ermittelt
ergebnis$ = Str(Bitwert)
AddGadgetItem(2,-1,"Bit 4"+Chr(10)+ergebnis$)
Bitwert=CallFunctionFast (Bit5,Bytewert) ;Bit5 wird ermittelt
ergebnis$ = Str(Bitwert)
AddGadgetItem(2,-1,"Bit 5"+Chr(10)+ergebnis$)
Bitwert=CallFunctionFast (Bit6,Bytewert) ;Bit6 wird ermittelt
ergebnis$ = Str(Bitwert)
AddGadgetItem(2,-1,"Bit 6"+Chr(10)+ergebnis$)
Bitwert=CallFunctionFast (Bit7,Bytewert) ;Bit7 wird ermittelt
ergebnis$ = Str(Bitwert)
AddGadgetItem(2,-1,"Bit 7"+Chr(10)+ergebnis$)
Else
MessageRequester("Eingabefehler", "Es werden nur Werte zwischen 0...255 akzeptiert.")
EndIf
Return