Display Ansteuerung

Gast #2311815
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!
#2311819
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.
Gast #2311858
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren