infosystems
12.02.2006, 21:08
Hallo,
ich versuche mich auch gerade in das Bascom einzuarbeiten.
Nun wollte ich an den Ports für eine 7 Segment LED Anzeige den CODE direkt schreiben da ich mir die Decodier IC-s "BCD zu 7 Segment" sparen wollte.
Ich habe da auch irgendwo einen Code gefunden, doch leider funktioniert bei mir die Portausgabe nicht.
Habt Ihr eine Ahnung woran das liegen könnte?
Wo ist da der Fehler???
Warscheindlich übergebe ich das nicht richtig an die Ports.
Da wo ich es an die RS232 übergebe, da funktioniert es noch... Hab ich auch so übernommen, doch meine Ausgabe funktioniert nicht.
Portd = Segment(1)
Portc = Segment(2)
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600
' BASCOM
' 7-Segment Multiplexer
Const Dekaden = 2 ' Anzahl der Anzeigen (dekaden)
Const Pulsdauer = 10000 ' Dauer eines Impulses
Declare Function Segmentdecoder(byval C As String) As Byte
Declare Sub Selector(byval Wert As Integer)
Dim Segment(dekaden) As Byte ' Array für die Fertig berecheten Segmente
Dim Demo As Byte
Config Portc = Output 'Port C wird als Output configuriert
Config Portd = Output
' Hauptprogramm
' -----------------------------------------------------------------------------
Call Selector(22) ' Berechnet die Segmente der einzelnen Dekaden
' und legt diese im Array Segment() ab.
' Die folgenden Zeilen Zeigen Dir was rauskommt und können gelöscht werden.
For Demo = 1 To Dekaden
Print Bin(segment(demo))
Next Demo
' Ein bisschen darfst Du auch naoch was tun... Schaffe ich auch nicht....
' Jetzt muß noch die Ausgabe erfolgen.
' Frage das Array ab, weise dem Port den Wert Zu
' z.B. Portb = segment(1)
' pulseout portd, 1 pulsdauer
' Portb = segment(2)
' pulseout portd, 2 pulsdauer
' usw.
Portd = Segment(1)
Portc = Segment(2)
End 'end program
' -----------------------------------------------------------------------------
' -----------------------------------------------------------------------------
Sub Selector(byval Wert As Integer)
Dim S As String * Dekaden ' Stringvariable Länge = Anzeige
Dim L As Byte ' Variable für Länge des Strings
Dim X As Byte ' Zählervariable
Dim Pos As Byte ' Variable für MID Funktion
Dim Z As String * 1
Dim Segcode As Byte
S = Str(wert) ' Wandle Wert in String
L = Len(s) ' ermittle Länge des Strings
If L > Dekaden Then L = Dekaden ' Verhindern dass mehr Anzeigen berechent werden
' als definiert und vorhanden sind.
For X = 1 To L
Pos = L - X
Pos = Pos + 1 ' Beginne mit den Einer Stellen (rechts)
Z = Mid(s , Pos , 1) ' Picke eine einzelnes Zeichen heraus
Segcode = Segmentdecoder(z) ' Ermittle den Portcode für die Segmente
Segment(x) = Segmentdecoder(z)
Next X
End Sub
' -----------------------------------------------------------------------------
Function Segmentdecoder(byval C As String) As Byte
Select Case C
Case "0" : Segmentdecoder = &B00111111 ' Bit 0 = Segment A
Case "1" : Segmentdecoder = &B00000110 ' Bit 1 = Segment B
Case "2" : Segmentdecoder = &B01011011 ' Bit 2 = Segment C
Case "3" : Segmentdecoder = &B01001111 ' Bit 3 = Segment D
Case "4" : Segmentdecoder = &B01100110 ' Bit 4 = Segment E
Case "5" : Segmentdecoder = &B01101101 ' Bit 5 = Segment F
Case "6" : Segmentdecoder = &B01111101 ' Bit 6 = Segment G
Case "7" : Segmentdecoder = &B00000111 ' Bit 7 = Segment dp
Case "8" : Segmentdecoder = &B01111111
Case "9" : Segmentdecoder = &B01101111
Case "." : Segmentdecoder = &B10000000
Case Else : Segmentdecoder = &B000000000 ' unerwartes Zeichen keine Ausgabe
End Select
'Bit Segmente
' || G | F | E | D | C | B | A |
' --||---+---+---+---+---+---+---|
' 0 || 0 | 1 | 1 | 1 | 1 | 1 | 1 |
' 1 || 0 | 0 | 0 | 0 | 1 | 1 | 0 |
' 2 || 1 | 0 | 1 | 1 | 0 | 1 | 1 |
' 3 || 1 | 0 | 0 | 1 | 1 | 1 | 1 |
' 4 || 1 | 1 | 0 | 0 | 1 | 1 | 0 |
' 5 || 1 | 1 | 0 | 1 | 1 | 0 | 1 |
' 6 || 1 | 1 | 1 | 1 | 1 | 0 | 1 |
' 7 || 0 | 0 | 0 | 0 | 1 | 1 | 1 |
' 8 || 0 | 1 | 1 | 1 | 1 | 1 | 1 |
' 9 || 1 | 1 | 0 | 1 | 1 | 1 | 1 |
End Function
' -----------------------------------------------------------------------------
End
ich versuche mich auch gerade in das Bascom einzuarbeiten.
Nun wollte ich an den Ports für eine 7 Segment LED Anzeige den CODE direkt schreiben da ich mir die Decodier IC-s "BCD zu 7 Segment" sparen wollte.
Ich habe da auch irgendwo einen Code gefunden, doch leider funktioniert bei mir die Portausgabe nicht.
Habt Ihr eine Ahnung woran das liegen könnte?
Wo ist da der Fehler???
Warscheindlich übergebe ich das nicht richtig an die Ports.
Da wo ich es an die RS232 übergebe, da funktioniert es noch... Hab ich auch so übernommen, doch meine Ausgabe funktioniert nicht.
Portd = Segment(1)
Portc = Segment(2)
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600
' BASCOM
' 7-Segment Multiplexer
Const Dekaden = 2 ' Anzahl der Anzeigen (dekaden)
Const Pulsdauer = 10000 ' Dauer eines Impulses
Declare Function Segmentdecoder(byval C As String) As Byte
Declare Sub Selector(byval Wert As Integer)
Dim Segment(dekaden) As Byte ' Array für die Fertig berecheten Segmente
Dim Demo As Byte
Config Portc = Output 'Port C wird als Output configuriert
Config Portd = Output
' Hauptprogramm
' -----------------------------------------------------------------------------
Call Selector(22) ' Berechnet die Segmente der einzelnen Dekaden
' und legt diese im Array Segment() ab.
' Die folgenden Zeilen Zeigen Dir was rauskommt und können gelöscht werden.
For Demo = 1 To Dekaden
Print Bin(segment(demo))
Next Demo
' Ein bisschen darfst Du auch naoch was tun... Schaffe ich auch nicht....
' Jetzt muß noch die Ausgabe erfolgen.
' Frage das Array ab, weise dem Port den Wert Zu
' z.B. Portb = segment(1)
' pulseout portd, 1 pulsdauer
' Portb = segment(2)
' pulseout portd, 2 pulsdauer
' usw.
Portd = Segment(1)
Portc = Segment(2)
End 'end program
' -----------------------------------------------------------------------------
' -----------------------------------------------------------------------------
Sub Selector(byval Wert As Integer)
Dim S As String * Dekaden ' Stringvariable Länge = Anzeige
Dim L As Byte ' Variable für Länge des Strings
Dim X As Byte ' Zählervariable
Dim Pos As Byte ' Variable für MID Funktion
Dim Z As String * 1
Dim Segcode As Byte
S = Str(wert) ' Wandle Wert in String
L = Len(s) ' ermittle Länge des Strings
If L > Dekaden Then L = Dekaden ' Verhindern dass mehr Anzeigen berechent werden
' als definiert und vorhanden sind.
For X = 1 To L
Pos = L - X
Pos = Pos + 1 ' Beginne mit den Einer Stellen (rechts)
Z = Mid(s , Pos , 1) ' Picke eine einzelnes Zeichen heraus
Segcode = Segmentdecoder(z) ' Ermittle den Portcode für die Segmente
Segment(x) = Segmentdecoder(z)
Next X
End Sub
' -----------------------------------------------------------------------------
Function Segmentdecoder(byval C As String) As Byte
Select Case C
Case "0" : Segmentdecoder = &B00111111 ' Bit 0 = Segment A
Case "1" : Segmentdecoder = &B00000110 ' Bit 1 = Segment B
Case "2" : Segmentdecoder = &B01011011 ' Bit 2 = Segment C
Case "3" : Segmentdecoder = &B01001111 ' Bit 3 = Segment D
Case "4" : Segmentdecoder = &B01100110 ' Bit 4 = Segment E
Case "5" : Segmentdecoder = &B01101101 ' Bit 5 = Segment F
Case "6" : Segmentdecoder = &B01111101 ' Bit 6 = Segment G
Case "7" : Segmentdecoder = &B00000111 ' Bit 7 = Segment dp
Case "8" : Segmentdecoder = &B01111111
Case "9" : Segmentdecoder = &B01101111
Case "." : Segmentdecoder = &B10000000
Case Else : Segmentdecoder = &B000000000 ' unerwartes Zeichen keine Ausgabe
End Select
'Bit Segmente
' || G | F | E | D | C | B | A |
' --||---+---+---+---+---+---+---|
' 0 || 0 | 1 | 1 | 1 | 1 | 1 | 1 |
' 1 || 0 | 0 | 0 | 0 | 1 | 1 | 0 |
' 2 || 1 | 0 | 1 | 1 | 0 | 1 | 1 |
' 3 || 1 | 0 | 0 | 1 | 1 | 1 | 1 |
' 4 || 1 | 1 | 0 | 0 | 1 | 1 | 0 |
' 5 || 1 | 1 | 0 | 1 | 1 | 0 | 1 |
' 6 || 1 | 1 | 1 | 1 | 1 | 0 | 1 |
' 7 || 0 | 0 | 0 | 0 | 1 | 1 | 1 |
' 8 || 0 | 1 | 1 | 1 | 1 | 1 | 1 |
' 9 || 1 | 1 | 0 | 1 | 1 | 1 | 1 |
End Function
' -----------------------------------------------------------------------------
End