Forum: Mikrocontroller und Digitale Elektronik Display Ansteuerung


von Rob (Gast)


Lesenswert?

Schönen guten Tag,

ich habe mir mal einen Code in C geschrieben, der auf einer 7 
Segmentanzeige  die Zahlen von 0 bis 9 hoch zählt. Das klappt auch alles 
wie es soll, aber kann man den Code irgendwie noch vereinfahcen?
z.B. die delays zusammen fassen oder so?

Hier der Code:

/* Name: main.c
 * Projekt: Display
 */

#include <avr/io.h>
#include <util/delay.h>

int main()
{
    /*
      PB0   10   ---
      PB1    2  |   |     PB5 9
      PB2    3   ---
      PB3    4  |   |     PB6 8
      PB4    5   ---  .   PB7 7

      1 & 6 = GND

        0 = PB0,PB1, PB3, PB4, PB5, PB6                 = HEX 0x7b
        1 = PB5, PB6                                    = HEX 0x60
        2 = PB0, PB2, PB3, PB4, PB5                     = HEX 0x3d
        3 = PB0, PB2, PB4, PB5, PB6                     = HEX 0x75
        4 = PB1, PB2, PB5, PB6                          = HEX 0x66
        5 = PB0, PB1, PB2, PB4, PB6                     = HEX 0x57
        6 = PB0, PB1, PB2, PB3, PB4, PB6                = HEX 0x5f
        7 = PB0, PB5, PB6                               = HEX 0x61
        8 = PB0, PB1, PB2, PB3, PB4, PB5, PB6           = HEX 0x7f
        9 = PB0, PB1, PB2, PB4, PB5, PB6                = HEX 0x77

     */
    DDRB=0xff;
    PORTB=0x00;

    while(1)
    {
        PORTB=0x7b;
        _delay_ms(1000);
        PORTB=0x60;
        _delay_ms(1000);
        PORTB=0x3d;
        _delay_ms(1000);
        PORTB=0x75;
        _delay_ms(1000);
        PORTB=0x66;
        _delay_ms(1000);
        PORTB=0x57;
        _delay_ms(1000);
        PORTB=0x5f;
        _delay_ms(1000);
        PORTB=0x61;
        _delay_ms(1000);
        PORTB=0x7f;
        _delay_ms(1000);
        PORTB=0x77;
        _delay_ms(1000);
        PORTB=0x00;
        _delay_ms(5000);

    }
    return 1;
}

Vielen dank für eure Hilfe!

von Karl H. (kbuchegg)


Lesenswert?

2 Dinge

* ja, klar kann man das noch vereinfachen.
  Ein Array, welches die Codes enthält würde sich zb anbieten

* im Endeffekt macht man aber in richtigen Programmen eine 7-Seg
  Anzeige komplett anders. Bei einer einstelligen mag das so noch
  angehen, aber spätestens bei einer mehrstelligen 7-Seg, die
  gemultiplext wird, wird das über einen Timer realisiert.
  Aber ich denke, so weit bist du noch nicht.
  Sieh erst mal zu, dass du in deinem C-Buch über Arrays nachliest.

von Rob (Gast)


Lesenswert?

Okey danke werde ich machen :).

Schönes Wochenende

von MaWin (Gast)


Lesenswert?

Sicher

digit[11]={0x7b,0x60,0x3d, .... 0x77,0x00 }
while(1)
{
    for(i=0;i<11;i++) { PORTB=digit[i]; _delay_ms(1000); }
    _delay_ms(4000);
}


Aber verabschiede dich besser gleich von so langen Wartezeiten, du 
kannst in den _delay_ms nämlich nichts anderen mehr tun.

Ein gutes Programm hat eine schnell laufende Hauptschleife und tut eben 
nur jeden x-ten Durchlauf das was dann nötig ist.

von Robin F. (gehacktes)


Lesenswert?

Vielen dank :) Ich werde das gleich mal versuchen umzusetzen und 
anschließend werde ich mich in arrays einlesen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.