Habe ich das richtig verstanden, das du jede Ziffer in einer Schleife einzeln durchgehst? (Also nicht alles auf einmal darstellst, sondern jede Ziffer hinter einander)
Kommt es da nicht zu einem sichtabaren Flimmern? :-s
Druckbare Version
Habe ich das richtig verstanden, das du jede Ziffer in einer Schleife einzeln durchgehst? (Also nicht alles auf einmal darstellst, sondern jede Ziffer hinter einander)
Kommt es da nicht zu einem sichtabaren Flimmern? :-s
Das ist die Technik vom Multiplexen, das geht nicht anders und ist auch so im Sinne des Erfinders.
Und Flimmern, mehr oder weniger, kommt auf die Frequenz sowie Ti/Tp an.
Fernsehr, Kino, Anzeigen von DVD oder Vidreorecorder, ja sogar die Ledrücklichter der neueren PKW's arbeiten so.
Jetz bist du Baff was?
Erkennen kann man das eigentlich nur mit einem Trick (verrat ich nich).
Zitat:
ja sogar die Ledrücklichter der neueren PKW's arbeiten so.
Das kann man aber gut sehen, das erste mal, wo ich so ein Auto vor der Nase hatte, dachte ich, daß ich zum Augenarzt muß, man sollte es verbieten!
Gruß Sebastian
Also das hat mir jetzt keine Ruhe gelassen
Hier der Source:
Dann noch der Schaltplan für Dein ICCode:' 4-Digit Multipexed Display an Port C
' PortC.4 = 1er
' PortC.5 = 10er
' PortC.6 = 100er
' PortC.7 = 1000er
' Portc.0 bis Portc.3 = BCD Code der Zahl &H00 bis &HFF
' Hierzu einen 7-Segmentdecoder (74LS48) zwischen PortC(0..3) und den Segmenten schalten
' Nicht vergessen die Treibersegmentausgänge mit 470R PullUp zu schalten.
' Der Baustein 74LS48 kann nur Zahlen (0-9) darstellen heine Hex Codes (ABCDEF)
' Falsche Werte (>9) (>&H09) (>&B00001001) führen zu Anzeigefehlern.
$regfile = "m32def.dat" ' AT Mega 32
$crystal = 16000000 ' 16 MHz
$baud = 19200 ' Serielle Schittstelle einrichten
Anzeigeport Alias Portc ' Hier einstellen an welchem Port
' das Display angeshclossen wird
Config Anzeigeport = Output ' Direction einstellen
Declare Function Anzeige(byval B_speed As Byte) As Integer
Dim X As Integer ' Variable für For Scheife
Dim Y As Integer ' Variable für For Scheife
Dim B_ar_zahl(4) As Byte
Portc = 0 ' Port C initialisieren
' Die Anzeige soll "4321" darstellen
B_ar_zahl(1) = 1 ' Hier die 1er Zahlen der Anzeige
B_ar_zahl(2) = 2 ' Hier die 10er Zahlen der Anzeige
B_ar_zahl(3) = 3 ' Hier die 100er Zahlen der Anzeige
B_ar_zahl(4) = 4 ' Hier die 1000er Zahlen der Anzeige
Do
For Y = 0 To 9
X = Anzeige(5)
Next Y
Loop
End 'end program
' ******************************************************************************
Function Anzeige(byval B_speed As Byte) As Integer
Dim B_x As Byte ' Schleifen Variable
Dim B_decade As Byte ' Aktivierung der Decade
Dim B_select As Byte
For B_x = 4 To 7 ' Schleife für Decaden
' Bit 4 bis 7 sind Decaden
B_decade = 2 ^ B_x ' Bitmuster für Decade berechnen
B_select = B_x - 3 ' Feld des Array's bestimmen
Anzeigeport = B_decade ' Nur Decade aktivieren
Anzeigeport = Anzeigeport Or B_ar_zahl(b_select)
' Decade + Anzeigewert aktivieren
' Hiermit wird auch das Anzeigetiming
' realisiert
Waitms B_speed ' Anzeigedauer der einzelnen Decade
Next B_x
Anzeige = 0 ' Rükgabewert 0 = ok
End Function
' ******************************************************************************
End 'end program
und der Beweis dass es geht....
So, durch den ersten Tipp von PicNick bin ich zumindest bei der Segmentansteuerung sehr kompakt fertig.
Nun hängt es noch bei der Dezimalstellenauswahl. Ich möchte eine vierstellige Variabel stellenweise aufsplitten, versuche dafür den "Mid"-Befehl - aber (mal wieder) komme ich mit den Variablenarten nicht richtig klar.
Vereinfacht (und völlig erfolglos) versuche ich gerade :
Code:x=3465 (anzuzeigende zahl)
do
y=mid(x,3,1) (rechte Ziffer, einer/5, soll selektiert werden)
pin1=1 kathode einer ein
zeige segmente
y=mid(x,2,1) (zehner/6 soll selektiert werden)
pin2=1 kathode zehner ein
zeige segmente
y=mid(x,1,1) (hunderter/4)
pin3=1
zeige segmente
y=mid(x,0,1) (tausender/3, linke linke Ziffer)
pin4=1
zeige segmente
loop
Vom Wald sieht' man nix, überall stehen Bäume rum !
Also, sagen wir mal: (ich weiß nicht, ob das jetzt mit deinen Pins so stimmt)
Code:1. MID is nicht so gut, weil da ja wieder ein string rauskommt. Besser is:
dim Instring as string * 4
dim onechar(4) as byte at Instring overlay
2. Isses so ?
PORTD --> Segmente
PORTB.0 --> Einer ' ?
PORTB.1 --> zehner
PORTB.2 --> hundert
PORTB.3 --> tausend
3. Geht aber besser mit Maske als über Pin-Nummer
dim charmsk as byte
4. Arbeiten geht besser von tausend-->einer (dadurch kannst du später mal auch führende Nullen unterdrücken)
dim charidx as byte ' von 1 - 4
5. Hilfsbyte
dim E as byte ' das aktuelle Zeichen
Auf geht's:
'-----------------------------------------------------------------
Instring = "3465"
charmsk = 8 '(= pin.3)
for charidx = 1 to 4
PORTD = charmsk ' kathode aufdrehen
E = onechar(charidx) ' ~ mid(instring, chardx, 1)
E = E AND &H0F ' Reduzieren auf 0-9
on e gosub 0,1,2,....... ' kennst du schon
shift charmsk, right, 1 ' nächste Kathode
next