Hier ein komplettes Beispiel, siehe Funktion my_strcpy_P()
Wie bereits in meinen früheren Beitragen wie auch in AVR-Libc FAQ
erwähnt muss eine Funktion die ProgMem String verarbeiten will, diesen
String Zeichen für Zeichen mit dem Makro PRG_RDB auslesen.
#include <inttypes.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
const char text1[] PROGMEM = "Test1";
const char text2[] PROGMEM = "Test2";
const char text3[] PROGMEM = "Test3";
const char text4[] PROGMEM = "Test4";
PGM_P menu[4] PROGMEM = { text1, text2, text3, text4 };
static char *my_strcpy_P( char *p, const char *progmem_addr );
/* Copy SRC to DEST. (SRC = Program Memory) */
extern char *
my_strcpy_P( char *__dest, const char *__progmem_src )
{
char *d = __dest;
/* we need to copy each byte from program memory */
while ( (*d++ = PRG_RDB(__progmem_src++)) );
return __dest;
}
int main(void)
{
DDRB = 0xff;
char buffer[10];
my_strcpy_P( buffer, menu[1] );
PORTB=~buffer[4]; /* output '2' from "Test2" */
PORTB=~PRG_RDB(&menu[1][4]);
for(;;);
}