FWIW, I spotted a minor flaw in your LCD::init() function
Code:
for(int x=0;x<8;x++)
for(int y=0;y<8;y++)
//LcdDataWrite(chars[y*8+x]); //write the character data to the character generator ram
LcdCommandWrite(0x00000001); // clear display, set cursor position to zero
The statement LcdDataWrite(...) function is commented out, so the next executable statement for the for(...) is the LcdCommandWrite(). It's in the init, so it may not matter that it happens 64 times.
Just thought you'd like to know. You may have others, this one just jumped out at me.
Anthony