> deshalb werde ich versuchen die LCD_printf um das pgm_read_byte
> zu erweitern
Wirf die originale Funktion nicht über Bord. Du wirst sie noch brauchen!
Bei solchen Sachen hat man normalerweise immer 2 Funktionen.
Die eine will normale Pointer ins SRAM haben, die andere Pointer ins 
Flash.
So wie zb
  strcpy          ( kopiert SRAM->SRAM )
  strcpy_P        ( kopiert Flash->SRAM )
Du hast dann eben ein
  LCD_printf      String kommt aus dem SRAM
  LCD_printf_P    String kommt aus dem Flash
Es scheint sich allerdings da auch eine andere Konvention durchzusetzen:
Die Funktion kriegt hinten einen Suffix _p, würde also
   LCD_printf_p
heißen.
Die Variante mit einem großen P würde bedeutet, dass sich dieser 
'Funktionsaufruf' selber darum kümmert, dass der String im Flash landet.
  LCD_printf_P( "Hallo" );
sorgt dann dafür, dass der Text "Hallo" im Flash liegt und ein 
entsprechender Flash-Pointer an die Funktion LCD_printf_p (diesmal mit 
kleinem p) übergeben wird. Gemacht ist es so
| 1 | #define LCD_printf_P(x)   LCD_printf_p( PSTR(x) )
 | 
Das PSTR Makro sorgt dafür, dass der konstante Text im Flash bleibt.