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; }
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...
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
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...
1 | for (int i = 5; i > 0; --i) { |
2 | SetDDRamAddr(3 + i) |
3 | nrt = nr % 10; |
4 | putcLCD(nrt + '0'); |
5 | nr /= 10; |
6 | }
|
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
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 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.