convert uint8_t to String

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'