Hallo zusammen, kann ich den nachfolgenden Ausdruck irgendwie innerhalb dieser Funktion so umschreiben, dass der String im Progmem abgelegt wird? (Geht um das " == Setze Uhrzeit ==") lcd_print( " == Setze Uhrzeit ==",2,5,0,Rot,Blau); Danke vorab und Gruß Frank
Hi, super danke. Habe ich glatt übersehen. Habe folgende Lösung implementiert #define lcd_print_p(__s, __a, __b, __c, __d, __e) lcd_print_P(PSTR(__s), __a, __b, __c, __d, __e) void lcd_print_P( const char* pgmString, int x,int y,int size,unsigned char fc,unsigned char bc ) { char string[40]; strcpy_P( string, pgmString ); lcd_print(string,x,y,size,fc,bc); } ... lcd_print_p( " === Neuer Timer ===",2,5,0,Rot,Blau); ... Wenn einer eine bessere Lösung kennt, immer raus damit. Wenn nicht schon mal danke Gruß Frank
Frank schrieb: > Hi, > > super danke. Habe ich glatt übersehen. Habe folgende Lösung > implementiert > > #define lcd_print_p(__s, __a, __b, __c, __d, __e) lcd_print_P(PSTR(__s), > __a, __b, __c, __d, __e) > > void lcd_print_P( const char* pgmString, int x,int y,int size,unsigned > char fc,unsigned char bc ) > { > char string[40]; > > strcpy_P( string, pgmString ); > > lcd_print(string,x,y,size,fc,bc); > > } > > ... > > lcd_print_p( " === Neuer Timer ===",2,5,0,Rot,Blau); > ... > > Wenn einer eine bessere Lösung kennt, immer raus damit. Ich fände hier besser, die Ausgabe von Flash-Strings direkt zu unterstützen in lcd_print. Die Funktion bräuchte dann allerdings nen weiteren Parameter, der angibt, ob die übergebene String-Adresse sich auf den RAM bezieht oder auf's Flash. Das würde die Rumkopiererei sparen:
1 | void lcd_print (const char * str, uint8_t in_flash, ...) |
2 | {
|
3 | char c; |
4 | ...
|
5 | if (in_flash) |
6 | c = pgm_read_byte (str++); |
7 | else
|
8 | c = *str++; |
9 | ...
|
10 | }
|
Darauf könntest du dann Makros legen, etwa
1 | #define LCD_PRINT_RAM(STR,X,Y) lcd_print (STR, 0, X, Y)
|
2 | #define LCD_PRINT_FLASH(STR,X,Y) lcd_print (PSTR(STR), 1, X, Y)
|
Ist aber auch Geschmackssache. Schliesslich böte sich noch an, ne eigene, printf-ähnliche Funktion zu schreiben, in der per %-Kommando die print-Koordinaten gesetzt werden könnten. %K würde z.B. zwei Koordinaten erfordern:
1 | lcd_printf ("%KHallo%KBingo", 0, 0, 10, 3); |
Johann
Hallo Johann, auch nicht schlecht die Idee. Ich muss aber gestehen, ich habe etwas gesucht was einfach zu ändern ist. Mir ist einfach der Speicherbedarf zu hoch gegangen. Jetzt suche ich auch noch eine einfache Möglichkeit die folgende Struktur ins Progmem zu schieben und wieder drauf zu zu greifen. typedef void FUNC(void); typedef FUNC *func; void MenuSetzeTimer( void ) { .... } struct stMenu { const char szOut[20]; func funktion; }; struct stMenu PROGMEM stMenuStart[] = { {" ===== Menu =====", NULL}, {"Timer", MenuSetzeTimer }, { "" }}; Aufruf : lcd_print_P( Menu[i].szOut,5,25,0,Blau,Gelb); <--- Geht nicht Menu[i].funktion(); <--- Geht nicht Danke und Gruß Frank
@ Frank (Gast) >typedef void FUNC(void); >typedef FUNC *func; >lcd_print_P( Menu[i].szOut,5,25,0,Blau,Gelb); <--- Geht nicht >Menu[i].funktion(); <--- Geht nicht Weil Klammern fehlen.
1 | typedef void (*state_func)(void); // define a function pointer |
MfG Falk
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.