#include <stdlib.h> #include <string.h> // ... #define DISPLAY_WIDTH2 12 // bei dir sollten es 20 sein void display_string(int8_t x, uint8_t y, char *s) { uint8_t col = 0; if (y == 1) lcd_gotoxy(0, 1); // Zweite Zeile else lcd_gotoxy(0, 1); // Erste Zeile // Leerzeichen vor dem String if (x>=0) { // Leerzeichen vor dem String while((col < x) && (col < (DISPLAY_WIDTH2))) { lcd_putc(' '); col++; } // Der String while ((*s) && (col < (DISPLAY_WIDTH2))) { lcd_putc(*s++); col++; } // Leerzeichen nach dem String while (col < (DISPLAY_WIDTH2)) { lcd_putc(' '); col++; } } else { if ((x+strlen(s)) <= 0) { // String links, nur Leerzeichen ausgeben while (col < (DISPLAY_WIDTH2)) { lcd_putc(' '); col++; } } else { // Der String uint8_t i = abs(x); while ((s[I]) && (col < (DISPLAY_WIDTH2))) { lcd_putc(s[i++]); col++; } // Leerzeichen nach dem String while (col < (DISPLAY_WIDTH2)) { lcd_putc(' '); col++; } } } }
int8_t x; while (1) { x = -30; do { display_string(x, 0, "Dies ist ein Test-String!"); _delay_ms(100); x++; } while (x<17); do { display_string(x, 0, "Dies ist ein Test-String!"); _delay_ms(100); x--; } while (x>-30); }
Ja, es gibst den absoluten Wert zurück ... Vorzeichen weg.Das heißt er macht einfach nur das Vorzeichen weg?
Aber, während ich diese Funktion aufrufe, kann ich ja nichts anderes machen (anzeigen)
Wo kann man das Board kaufen was du benutzt? Oder hast du dies selber gemacht?
void display_string_flash(int8_t x, uint8_t y,const char *s) { uint8_t col = 0; if (y == 1) lcd_gotoxy(0, 1); // Zweite Zeile else lcd_gotoxy(0, 1); // Erste Zeile // Leerzeichen vor dem String if (x>=0) { // Leerzeichen vor dem String while((col < x) && (col < (DISPLAY_WIDTH))) { lcd_putc(' '); col++; } // Der String while ((pgm_read_byte(s)) && (col < (DISPLAY_WIDTH))) { lcd_putc(pgm_read_byte(s++)); col++; } // Leerzeichen nach dem String while (col < (DISPLAY_WIDTH)) { lcd_putc(' '); col++; } } else { if ((x+strlen(s)) <= 0) { // String links, nur Leerzeichen ausgeben while (col < (DISPLAY_WIDTH)) { lcd_putc(' '); col++; } } else { // Der String uint8_t i = abs(x); while ((pgm_read_byte(s)) && (col < (DISPLAY_WIDTH))) { lcd_putc(pgm_read_byte(s++)); col++; } // Leerzeichen nach dem String while (col < (DISPLAY_WIDTH)) { lcd_putc(' '); col++; } } } }
Er rollt zwar die Zeichen rein (aber auch nur eine bestimmte Anzahl) und dann bleibt der unvollständige Text stehen. Aber nur bei meiner Flash Version.
if ((x+strlen(s)) <= 0)
uint8_t i = abs(x);
void display_string_flash(int8_t x, uint8_t y, const char *s) { uint8_t col = 0; if (y == 1) lcd_gotoxy(0, 1); // Zweite Zeile else lcd_gotoxy(0, 1); // Erste Zeile // Leerzeichen vor dem String if (x>=0) { // Leerzeichen vor dem String while((col < x) && (col < (DISPLAY_WIDTH))) { lcd_putc(' '); col++; } // Der String while ((pgm_read_byte(s)) && (col < (DISPLAY_WIDTH))) { lcd_putc(pgm_read_byte(s++)); col++; } // Leerzeichen nach dem String while (col < (DISPLAY_WIDTH)) { lcd_putc(' '); col++; } } else { uint8_t len = 0; while (pgm_read_byte(&s[len])) len++; if ((x+len) <= 0) { // String links, nur Leerzeichen ausgeben while (col < (DISPLAY_WIDTH)) { lcd_putc(' '); col++; } } else { // Der String uint8_t i = abs(x); while ((pgm_read_byte(&s[i])) && (col < (DISPLAY_WIDTH))) { lcd_putc(pgm_read_byte(&s[i++])); col++; } // Leerzeichen nach dem String while (col < (DISPLAY_WIDTH)) { lcd_putc(' '); col++; } } } }
Wieso ist der String im Flash größer als im SRAM?
display_string_flash(x, 0, PSTR("Dies ist ein Test-String!")); 000000fe <__c.2243>: fe: 44 69 65 73 20 69 73 74 20 65 69 6e 20 54 65 73 Dies ist ein Tes 10e: 74 2d 53 74 72 69 6e 67 21 00 t-String!.
Dafür gibt es zwei Gründe.
1.
CodeBox Cif ((x+strlen(s)) <= 0)
Du benötigst die Länge des Strings im Flash Memory, nicht die eines Strings im sram.
2.
CodeBox Cuint8_t i = abs(x);
Was passiert in deinem Code mit i?
Deine Code habe ich korrigiert.
Probleme hatte ich mit strlen_P (ermittelt Länge des Strings im Flash). Damit gibt oder gab es auch irgendein Problem. Ich habe im Moment keine Zeit danach weiter zu suchen und das manuell eingebaut.
Dirk
}[/C]
Ich habe es so verstanden, dass es einen größen Unterschied gibt
uint8_t len = 0; while (pgm_read_byte(&s[len])) len++;
Das ist klar. Der C Compiler hat hierfür diverse Macros und Funktionen. Janiiix hatte nur vergessen, auch die Länge des Strings im Flash zu ermitteln und dann war noch ein Indexierungsfehler des String-Arrays in seiner Funktion.Auf Flash Speicher muss anders zugegriffen werden wie auf den SRAM. Auch in Assembler sind es andere Befehle.
uint8_t len = 0;while (pgm_read_byte(&s[len])) len++;
Es gibt ein Stringende-"Zeichen", das ist 0.Woher weißt du wann der String zu ende ist ?
000000fe <__c.2243>:
fe: 44 69 65 73 20 69 73 74 20 65 69 6e 20 54 65 73 Dies ist ein Tes
10e: 74 2d 53 74 72 69 6e 67 21 00 t-String!.
uint8_t len = 0; while (pgm_read_byte(&s[len]) != 0) len++;