Hi Paul,
thanks for replying so quickly - I'm sure I'll get to the bottom of this in no time with your help!
You're quite right about serial.print() printing only from SRAM, which is exactly what this line addresses:
strcpy_P(cLCDBuffer, (char*)pgm_read_word(&(options[iCurMenu][iCurOption][0])));
...it reads the text string out of the options array and places it in a buffer (cLCDBuffer) in SRAM - I then either LCD.print or Serial.print the buffer.
There were two reasons I moved all the strings in the options menu into PROGMEM individually and then put the pointers in the options array; firstly, I'd tried just moving the array of strings into PROGMEM and kept getting the error variable options must be constant to be moved into PROGMEM or something roughly like that - I can't remember the exact wording. This was despite the options array being declared constant, so I assumed there was some sort of non-obvious error with the way I was doing it. Secondly, the PROGMEM language reference page I then followed does it this way, so I assumed this was the way you had to do it - it certainly works for the LCD.print routine.
Thanks for your continued help with this ![]()