-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 19

Thema: 7 Segmentanzeige führende Nullen ausblenden

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627

    7 Segmentanzeige führende Nullen ausblenden

    Anzeige

    Hallo,
    ich habe eine 7 Segmentanzeige mit 5 Stellen (also 0-99999) im Multiplexbetrieb(softwaremultiplex über AT-MEGA.

    Nun möchte ich die führenden Nullen ausblenden also nicht "00123" sondern nur " 123".

    mein Versuch war:

    ganz links angefangen: wenn da eine "0" ist einfach den Transistor für die gemeinsame Anode abschalten - fertig (funktioniert!)

    nun die 2. Zahl von links: wenn 1. & 2. Zahl = "0" dann auch diese gemeinsame Anode abschalten. Leider klappt das wegen dem Multiplexbetrieb nicht: es leuchtet ja genaugenommen immer nur eine "Ziffer".
    Also habe ich das mit Merkern versucht: wenn Ziffer gleich 0 gem.Anode abschalten und Merker (Digi1) auf 1 setzen... funktioniert aber auch nicht in allen Fällen...

    Aber ich glaube das Programm sagt mehr....

    Code:
    '-------------------------------------------------------------------------------
    7seganzeige:
    ' Code 7 Segmentanzeige:
    '-------------------------------------------------------------------------------
    
    
    
       'Formatiere das Display
       Wertstr = Str(wert)
       Fivedigitdisplay = Format(wertstr , "00000")             'Nullen geben die Anzahl der Stellen an, damit die Stellen richtig gesetzt werden
    
    
       ' jeder Lauf durch die Hauptschleife zeigt ein anderes Digit
       Incr Digit
       
       Portb = 0                                                'Ghosting vermeiden
        If Digit = 5 Then                                       'mache das , bis 5 erreicht ist
       Digit = 0
    
       End If
    
       ' addiere 1 zum Digitcounter, weil MID 1-basiert ist
       Y = Digit + 1
       ' und hol das Digit, das wir brauchen
       Wertstr = Mid(fivedigitdisplay , Y , 1)
    
    
       'Anzeige auswählen
       Tempbyte = 2 ^ Digit                                     'Tempbyte = 1,2,4,8,16
    
       'Digitansteuerung auf portC: PC1-5
        Umdreh = Tempbyte * 2                                   'Umdreh   = 2,4,8,16,32
         'Ansteuerung umdrehen für gemeinsame Anoden
        Portc = Umdreh                                          'Port für die Stellen auswahl
    
    
    
    'Führende Nullen entfernen:
    
    'INFO:
    'wertstr hat immer nur eine Ziffer und wechselt also nacheinander alle 5 Stellen durch!
    'wenn wertstr = 0 ist dann wird nachgesehen, in welchem Digit (Stelle) wir uns befinden.
    'wenn Digit = 0 -also die ganz linke Stelle- dann auf jeden Fall Portc.1 = 0 (Transistor der Stelle) abschalten
    'Digit0 = 0   -> ist nur ein Merker für die folgenden Stellen d.h.
    
    'wenn wertstr=0 dann fragen ob Digit=1 (also 2te Stelle von links) UND der Merker Digit0=0
    'dann Transistor abschalten und weiteren Merker für diese Stelle setzen
    
    'ZehnTausenderstelle
    If Val(wertstr) = 0 Then                                    'Führende Null wegblenden
       If Digit = 0 Then : Portc.1 = 0 : Digit0 = 0             'C.1=Digit Transistor
       Else
       Digit0 = 1
       End If
    End If
    'Tausenderstelle
    If Val(wertstr) = 0 Then                                    'Führende Null wegblenden
       If Digit = 1 And Digit0 = 0 Then : Portc.2 = 0 : Digit1 = 0       'C.2=Digit Transistor
        Else
        Digit1 = 1
        End If
    End If
    'Hunderterstelle
    If Val(wertstr) = 0 Then                                    'Führende Null wegblenden
       If Digit = 2 And Digit0 = 0 And Digit1 = 0 Then : Portc.3 = 0 : Digit2 = 0       'C.3=Digit Transistor
        Else
        Digit2 = 1
        End If
    End If
    'Zehnerstelle
    If Val(wertstr) = 0 Then                                    'Führende Null wegblenden
       If Digit = 3 And Digit0 = 0 And Digit1 = 0 And Digit2 = 0 Then : Portc.4 = 0 : Digit3 = 0       'C.4=Digit Transistor
        Else
        Digit3 = 1
        End If
    End If
    
     'Dieser Teil erledigt die Wandlung in 7 Segment Code
    
     'Für Anzeigen mit gemeinsamer Anode
      Select Case Val(wertstr)
    
               Case 0 : Portb = 126                             'NULL
               Case 1 : Portb = 12                              'EINS
               Case 2 : Portb = 182                             'ZWEI
               Case 3 : Portb = 158                             'DREI
               Case 4 : Portb = 204                             'VIER
               Case 5 : Portb = 218                             'FÜNF
               Case 6 : Portb = 250                             'SECHS
               Case 7 : Portb = 14                              'SIEBEN
               Case 8 : Portb = 254                             'ACHT
               Case 9 : Portb = 222                             'NEUN
              'Case Else : Portb = 128                           'mittleres Segment
               Case Else : Portb = 226                          '"F"
      End Select
    
      'Komma setzen
      'If Portc = 2 Then Portb.0 = 1                             '4 Kommastellen
      'If Portc = 4 Then Portb.0 = 1                             '3 Kommastellen
      'If Portc = 8 Then Portb.0 = 1                             '2 Kommastelle
      If Portc = 16 Then Portb.0 = 1                            '1 Kommastellen
    ...

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    Ach so:

    Auf der Anzeige sollen auch negative Werte angezeicht werden können.
    Also kommt noch der Code hinzu:

    'negatives Vorzeichen setzen
    If Portc = 2 Then
    If Wert < 0 Then
    Portb = 128 'Binär 1000 0000 -> Dezimal = 128 (nur Segment G)
    End If
    End If
    ...

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.06.2004
    Ort
    Kuala Lumpur
    Alter
    56
    Beiträge
    239

    Re: 7 Segmentanzeige führende Nullen ausblenden

    Zitat Zitat von TobiasBlome
    ... wenn da eine "0" ist einfach den Transistor für die gemeinsame Anode abschalten - fertig (funktioniert!)
    ...
    Hi,
    und warum machst du den Blödsinn über die Gemeinsame Anode/Katode(oder was auch immer) abschalten?

    Bei so was lässt man einfach die Segmente aus , also wenn "0" dann alle Segment der Zahl aus und bei der "00" genauso .

    Wird zu mindest in der Hardware (FPGA) Entwicklung so gemacht

    Gruss
    Artur

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    Hallo Artur,
    ach so... na gut - aber dann bleibt natürlich mein "Grundproblem":
    was ist die Vorraussetzung, damit kein Segment gesetzt wird?
    Wie mache ich das Programmtechnisch?

    Tobias
    ...

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Du arbeitest hier sowieso mit Strings, dann formatier die Zahl nicht mit "00000" sondern mit "____0" (_ = Leerzeichen), und bau in das select case den Wert für das "_" ein, das dann den Wert 0 ausgibt (Also PortB = 0 ).
    Bei Select würde ich den Wert auch nicht nochmal extra in ein Integer wandeln, sondern gleich als Text vergleich anlegen, so kann man das Leerzeichen leicht mit integrieren.

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    Hallo Linux_80:

    wie schreibe ich den Case Befehl mit dem "Leerzeichen"?
    ...

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    select case wertstr

    case " " : Portb = 0
    case "0" : Portb = 126

    usw.

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    Habe den Fehler in meinem Code gefunden:

    meine Rücksetzbedingung war an der falschen Stelle und konnte so nicht immer zurückgesetzt werden

    so war´s:
    _____________
    Wenn Wert = 0

    Wenn ganz linke Stelle aktiv & "Nullmerker"=0 DANN Stelle aus und "NullMerker"=0
    SONST "Nullmerker"=1
    End If

    End If
    ------------------

    NEU NEU NEU

    _____________
    Wenn Wert = 0

    Wenn ganz linke Stelle aktiv & "Nullmerker"=0 DANN Stelle aus und "NullMerker"=0
    End If

    SONST "Nullmerker"=1
    End If
    ------------------
    ...

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    ups das hat sich wohl etwas überschnitten...

    Bascom mag den Case nicht: case " " : Portb = 0
    source Variable does not match the target variable....

    schöner wäre es bestimmt, weil der Code kürzer ist (und der µC ist schon sehr belastet - habe noch ein LCD & Analogeingang...)
    ...

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Warum geht das nicht ? Was hast Du für 'ne Bascom Version ?
    Läuft bei mir einwandfrei, mit der 1.11.9.2. und auch vorher schon, weil ich das in älteren Programmen so öfter gemacht habe.

    Aber man könnte es dann immer noch besser mit einem Asc(wertstr) machen, und dann die Hexwerte der Zahlen beim Case angeben:

    Code:
    Dim Wertstr As String * 1
    
    Wertstr = "1"
    
    Dim Bytewert As Byte
    
    Bytewert = Asc(wertstr)
    
    Select Case Bytewert
    
        Case &H20 : Portb = 0
        Case &H30 : Portb = 126   ' 0
        Case &H31 : Portb = 12     ' 1 
    ' usw. einfach zu merken 0 ist &H30 
    End Select
    
    End
    so gehts bei mir auch:
    Code:
    Select Case Wertstr
    
        Case " " : Portb = 0
        Case "0" : Portb = 126
        Case "1" : Portb = 12
    
    End Select
    
    End

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •