However that cast to (char*) is a bad idea. What you should be doing is void "WriteLCDString(const char *data)"
With a C standard compliant compiler, the cast would just be redundant (not good style, though).
A string literal decays to type char* in this context; from the C99 standard, 6.4.5 String Literals:
The multibyte character sequence is then used to initialize an array of static storage duration and length just sufficient to contain the sequence. For character string literals, the array elements have type char, and are initialized with the individual bytes of the multibyte character sequence;
Of course, albeit a char*, modifying the contents is not OK:
If the program attempts to modify such an array, the behavior is undefined.
In C++ instead, string literals are actually arrays of const char: trap for young and old players...
BUT from the XC8 user manual we learn (5.4.6.3):
The type of string constants is const char * and the character that make up the string are stored in the program memory, as are all objects qualified const.

Saying that the type of string constant is const char * is
plain wrong: it's an array, and it will yield a pointer unless used as argument of & or sizeof, or used to initialize another array!

And the PICs (AFAICS, I'm definitely not into them...) have different type of pointers for code (where const are stored) and data memory.
The compiler should be able to sort it out by itself and do the magic without the user noticing, but maybe in this case (possibly due to the cast) it's not.
tl,dr: Probably brucehoult is psychic, as he gave good advice before knowing XC8 vagaries were involved...
