mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Codevereinfachung für LCD Anzeige


Autor: Mäx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

kann mir jemand einen Tipp geben wie ich diesen Code vereinfachen kann. 
Auf einem LCD Display soll eine 2stellige Zahl per Tastendruck 
hochgezählt werden. Das es einfacher gehen muss davon bin ich überzeugt, 
aber meine C Kenntnisse sind noch begrenzt. Der Code ist selbsterklärend 
denke ich und das Programm läuft so wie es soll. Aber da es immer das 
selbe Schema bei den if-Schleifen ist gibt es doch bestimmt kürzere 
Varianten. Wer kennt eine?

int Nr;

Nr=1;

if (Switch2IsPressed())
  {
    Nr++;
  }

// Zehner ********************************************************

  while( BusyXLCD() );
  SetDDRamAddr( 7 );

  if (Nr < 10)
    {
    while( BusyXLCD() );
    putcXLCD('0');
    }
  if (20 > Nr && Nr >= 10)
    {
    while( BusyXLCD() );
    putcXLCD('1');
    }
  if (Nr >= 20)
    {
    while( BusyXLCD() );
    putcXLCD('2');
    }


// Einer ********************************************************

  while( BusyXLCD() );
  SetDDRamAddr( 8 );

  if (Nr==1 || Nr==11 || Nr==21)
    {
    while( BusyXLCD() );
    putcXLCD('1');
    }
  if (Nr==2 || Nr==12 || Nr==22)
    {
    while( BusyXLCD() );
    putcXLCD('2');
    }
  if (Nr==3 || Nr==13 || Nr==23)
    {
    while( BusyXLCD() );
    putcXLCD('3');
    }
  if (Nr==4 || Nr==14 || Nr==24)
    {
    while( BusyXLCD() );
    putcXLCD('4');
    }
  if (Nr==5 || Nr==15)
    {
    while( BusyXLCD() );
    putcXLCD('5');
    }
  if (Nr==6 || Nr==16)
    {
    while( BusyXLCD() );
    putcXLCD('6');
    }
  if (Nr==7 || Nr==17)
    {
    while( BusyXLCD() );
    putcXLCD('7');
    }
  if (Nr==8 || Nr==18)
    {
    while( BusyXLCD() );
    putcXLCD('8');
    }
  if (Nr==9 || Nr==19)
    {
    while( BusyXLCD() );
    putcXLCD('9');
    }
  if (Nr==10 || Nr==20)
    {
    while( BusyXLCD() );
    putcXLCD('0');
    }
  if (Nr==25)
    {
    Nr=1;
    }

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
moment...
EDIT

Die Ascii-Codes für 0 bis 9 sind 48 bis 57. Demnach rechnest du einfach 
die Einer (Zehner) raus (als Integer zwischen 0 und 9), addierst ihn zu 
48 und hast damit dein Ascii-Zeichen, welches du ans LCD schickst.

Außerdem reicht es, wenn du "while( BusyXLCD() );" einmal aufrufst, weil 
ja immer nur ein Fall eintritt. Du musst des nich in jeden If-Abschnitt 
nochmal reinschreiben...

Autor: Daniel P. (ppowers)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ui! :-)

Schau Dir mal die Funktion "atoi" an. Damit kannst Du eine Zahl in einen 
String, also einzelne Ziffern umwandeln. Und das mit DEUTLICH weniger 
Aufwand!
Vor 2 Tagen kam diese Frage übrigens hier schonmal auf:
Beitrag "tausender hunderter zehner aufteilen?"

gruß
daniel

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if-Schleifen gibt es nicht!

Ich würde einfach einen Zähler (z.B. int) nehmen und den über i++ bei 
jedem Tastendruck erhöhen.

Für die Darstellung im Display muss der Zähler in beide Dezimalziffern 
zerlegt werden:
i % 10 liefert die niederwertige
i / 10 die höherwertige.

Wenn's schneller gehen muss nimm je einen Zähler für beider Ziffern und 
wenn die niedrige 9 überschreitet setze sie zurück auf 0 und die 
höherwertige Ziffer erhöhst du um 1

Nur so als Anregung...

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
for (int i = 5; i > 0; --i) {
    SetDDRamAddr(3 + i)
    nrt = nr % 10;
    putcLCD(nrt + '0');
    nr /= 10;
}

Autor: Daniel P. (ppowers)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine Alternative in C ist auch immer die sprintf-Funktion (nicht 
besonders ressourcenschonend, aber für den Einstieg ganz gut)
char str[3];
sprintf(str,"%02d",Nr);

while( BusyXLCD() );
SetDDRamAddr( 7 );
putcXLCD(str[0]);

while( BusyXLCD() );
SetDDRamAddr( 8 );
putcXLCD(str[0]);


"%02d" ist dabei eine Formatangabe und besagt, dass Du die Variable "Nr" 
als Ganzzahlwert mit 2 Stellen und ggf. einer führenden Null ausgeben 
möchtest.

gruß
daniel

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohne Sonderfälle und mit aufgelöster Division ginge es z.B. auch so
// short als 16-Bit-Integer
void toStr(short n, char* str) {
    short digits = 4;
    const short val[] = { 1, 10, 100, 1000, 10000 };

    while (digits > -1) {
        *str = '0';
        while (n - val[digits] > -1) {
            *str += 1;
            n -= val[digits];
        }
        ++str;
        --digits;
    }
}

Autor: Mäx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Danke für die Vorschläge, werde jetzt mal den ein oder anderen 
Tipp umsetzen.

Gruß Mäx

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.