Codevereinfachung für LCD Anzeige

Gast #822401
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;
    }
Gast #822406
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...
#822417
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...
#822420
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
#822452
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
}

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