Codesys ST 7-Segmentanzeige FB

Craven

Level-1
Beiträge
1
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hab eine 7-Segmentanzeige in Codesys mit ST programmiert. (bin Anfänger)
Vermutlich habe ich das ein bisschen umständlich gelöst, aber es funktioniert und habe gedacht falls jemand den Code braucht lade ich ihn hier hoch. :)

Habe folgendes Video als Leitfaden genutzt.
Um diese Inhalte anzuzeigen, benötigen wir die Zustimmung zum Setzen von Drittanbieter-Cookies.
Für weitere Informationen siehe die Seite Verwendung von Cookies.

Würde mich über Verbesserungsvorschläge natürlich freuen!

Deklaration:

Code:
FUNCTION_BLOCK SevSeg
VAR_INPUT
    inVal: INT; //INPUT INT Zahl die umgewandelt wird in 7 Segmente der BCD Anzeige
    enable7Seg:BOOL; //Aktivierung des 7Segments
END_VAR
VAR_OUTPUT
   
END_VAR
VAR
    //Deklaration der 7 Segmente
    SegA:BOOL;
    SegB:BOOL;
    SegC:BOOL;
    SegD:BOOL;
    SegE:BOOL;
    SegF:BOOL;
    SegG:BOOL;
   
    //INT Zahlen die die einzelnen Bit der Input Variablen darstellen
    intA:INT;
    intB:INT;
    intC:INT;
    intD:INT;
   
    //Bit in Boolean
    A:BOOL ;
    B:BOOL ;
    C:BOOL ;
    D:BOOL ;
   
END_VAR


Ausführung:

Code:
//INT in Binärzahl, Input wird umgewandelt in Bit
intD:= inVal / 8;
intC:= (inVal-intD*8) / 4;
intB:= (inVal-intD*8-intC*4) / 2;
intA:= (inVal-intD*8-intC*4-intB*2) / 1;

//INT wird zu BOOL
D:=TO_BOOL(intD);
C:=TO_BOOL(intC);
B:=TO_BOOL(intB);
A:=TO_BOOL(intA);

//Mithilfe Boolschen Algebras, Karnaugh Vaugh Diagramm und
//Wahrheitstabelle bekommt man folgende Fälle für die 7 Segmente.

//Fälle bei der SegA leuchtet
SegA:=
B OR
D OR
(A AND C) OR
(NOT A AND NOT C);

//Fälle bei der SegB leuchtet
SegB:=
NOT C OR
(NOT A AND NOT B)OR
(A AND B);

//Fälle bei der SegC leuchtet
SegC:=
NOT B OR
C OR
A;

//Fälle bei der SegD leuchtet
SegD:=
D OR
(NOT A AND B) OR
(A AND NOT B AND C) OR
(B AND NOT C) OR
(NOT A AND NOT C);

//Fälle bei der SegE leuchtet
SegE:=
(NOT A AND NOT C) OR
(NOT A AND B);

//Fälle bei der SegF leuchtet
SegF:=
D OR
(NOT A AND C) OR
(NOT B AND C) OR
(NOT A AND NOT B);

//Fälle bei der SegG leuchtet
SegG:=
D OR
(NOT A AND B) OR
(NOT B AND C) OR
(B AND NOT C);


Hier noch meine Wahrheitstabelle und die KV-Diagramme:
7-Segment.jpg
 
Bei 7 Segmenten bietet sich an, mit einer Umcodierungs-Tabelle der Leuchtmuster mit Bytes zu arbeiten (z.B. ARRAY [0..9] OF BYTE). Dann wird es auch sehr einfach, weitere Leuchtmuster hinzuzufügen, indem man nur die Tabelle vergrößert und die zusätzlichen Muster hinterlegt. Es lassen sich auch leicht unterschiedliche Zeichensätze oder "Schriftarten" realisieren, indem nur die Tabelle der Leuchtmuster andere Werte enthält. Der Eingangswert wird als Index in die Tabelle benutzt, der Wert des adressierten Bytes wird dann in die Bits/BOOLs zerlegt.

Code:
//zusätzliche Variablen:
VAR
  Mustertabelle : ARRAY [0..15] OF BYTE := 16#3F, 16#06, 16#5B, 16#4F, 16#66, 16#6D, 16#7D, 16#07,
                                           16#7F, 16#6F, 16#40, 16#40, 16#40, 16#40, 16#40, 16#40 ;
  Muster : BYTE ;
END_VAR

IF enable7Seg THEN
  Muster := Mustertabelle[inVal];
ELSE
  Muster := 16#00;
END_IF;

SegA := Muster.0;
SegB := Muster.1;
SegC := Muster.2;
SegD := Muster.3;
SegE := Muster.4;
SegF := Muster.5;
SegG := Muster.6;
Um das Programm so zu erweitern, daß die 7-Segmentanzeige nicht nur die Dezimalziffern 0..9 anzeigt, sondern auch die Hexadezimalziffern A..F, brauchst Du nur die entsprechenden Bitmuster/Leuchtmuster in die letzten 6 Werte des Arrays eintragen (wo ich die "Fehler"-Muster 16#40 eingetragen habe).

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
PS: Anstatt der Hexadezimalziffern (oder zusätzlich) lassen sich auch leicht Sonderzeichen realisieren, ohne den eigentlichen Programmcode zu ändern. Z.B. Minus-Zeichen und Zeichen für eine 3-Striche-Balkenanzeige:
Code:
10 11 12 13 14 15

          -  -  -
 -     -  -  -
    -  -  -
 
Zurück
Oben