Steve, "As I've explained in previous posts, the LCD is written to twice a second normally. Slowing this down significantly to refresh every 3 seconds showed that the display does not blank immediately when the
0v line is touched but will blank on the next write operation."
This is a VERY significant clue to the problem. What it tells me is that the LCD is probably fine, and the event causing the LCD to blank is external, and most likely, in the code.
To me, having read all of the above, it does seem that you've ruled out power glitches, etc... (I know, soon as I say that, some power rail problem will rear its ugly head..) :)
Here's what I would do. SLOW DOWN THE LCD TO A CRAWL. Literally. On your LCD initilization routine, add some debugging code: My thoughts:
Init the display (in 4-bit mode). Take your time doing this; there's no rush. The LCD does not care how long it takes, it just wants all of the minimum times are met. Code enough delay (at least 2 seconds per command) so LCD Timing Init is absoultely ruled out.
Then, write a test message to the screen: "LCD RESET" Then, loop a couple more seconds in code, and only then, go on to the rest of your program.
Then, while testing, if you EVER see this message again, you know without a doubt that the LCD init code has run again. And that means the problem is NOT with the LCD itself, but rather is in response to some other event affecting your program flow. Perhaps a PIC reset, but not necessarily so.
Perhaps you have already tried my suggestions until you are blue in the face, and if so, ignore the above. However, I have to tell you, from here, this problem smacks of improper init timing, and subsequent external event that is somehow re-init the LCD.
The LCD itself has to be powered up for some minimum time before you can start talking to it. (I presume you know that.)
At any rate, good luck! Sounds like an interesting challenge!!
-mpm