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


von Mäx (Gast)


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;
    }

von Sven P. (Gast)


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...

von Daniel P. (ppowers)


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

von Kai G. (runtimeterror)


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...

von Arc N. (arc)


Lesenswert?

1
for (int i = 5; i > 0; --i) {
2
    SetDDRamAddr(3 + i)
3
    nrt = nr % 10;
4
    putcLCD(nrt + '0');
5
    nr /= 10;
6
}

von Daniel P. (ppowers)


Lesenswert?

Eine Alternative in C ist auch immer die sprintf-Funktion (nicht 
besonders ressourcenschonend, aber für den Einstieg ganz gut)
1
char str[3];
2
sprintf(str,"%02d",Nr);
3
4
while( BusyXLCD() );
5
SetDDRamAddr( 7 );
6
putcXLCD(str[0]);
7
8
while( BusyXLCD() );
9
SetDDRamAddr( 8 );
10
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

von Arc N. (arc)


Lesenswert?

Ohne Sonderfälle und mit aufgelöster Division ginge es z.B. auch so
1
// short als 16-Bit-Integer
2
void toStr(short n, char* str) {
3
    short digits = 4;
4
    const short val[] = { 1, 10, 100, 1000, 10000 };
5
6
    while (digits > -1) {
7
        *str = '0';
8
        while (n - val[digits] > -1) {
9
            *str += 1;
10
            n -= val[digits];
11
        }
12
        ++str;
13
        --digits;
14
    }
15
}

von Mäx (Gast)


Lesenswert?

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

Gruß Mäx

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.