try
lcd.print((char) key );
the compiler sees you are passing a number, not a character to the print function, so decides to call the function that prints the value of that number rather than an ASCII value. if the signature detects it's a character that is being passed, then it will print the ASCII character corresponding to the value.
a simple example to prove this
void setup() {
uint8_t c = 50; // this is the value of character '2' in ASCII
Serial.begin(115200);
Serial.println(c);
Serial.println((char)c);
}
void loop() {}
output in the console
[color=red]50[/color]
[color=blue]2[/color]
50 is the value which represents the ASCII char '2'