LCD character display problem

Hello, can anyone help me with my LCD printing issue? The LCD is a SainSmart LCD2004. I have it working ALMOST the way I want to. Basically, I wish to display EVERY keypad press on the LCD. Currently, it is only displaying the character I press, and then overwriting it when I press another. Any help would be greatly appreciated. Thank you.

#include <LiquidCrystal.h>
#include <Servo.h>
String keys="123A456B789C*0#D";
int key;
boolean key_lockout=false;
int button1 = 7;
int press1 = 0;
int pos = 90;
int led = 8;
int led2 = 9;

#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>

#define I2C_ADDR    0x27  // Define I2C Address where the PCF8574A is
#define BACKLIGHT_PIN     3
#define En_pin  2
#define Rw_pin  1
#define Rs_pin  0
#define D4_pin  4
#define D5_pin  5
#define D6_pin  6
#define D7_pin  7

int n = 1;

LiquidCrystal_I2C	lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);

Servo servo1;
void setup()
{
  Serial.begin(9600);
lcd.begin (20,4);
lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
  lcd.setBacklight(HIGH);
  lcd.home ();
   lcd.print("     Joey's Room");  
  lcd.setCursor ( 0, 1 );        // go to the 2nd line
  lcd.print("Please Enter Passkey");


  pinMode(button1, INPUT);
  pinMode(led, OUTPUT);
  pinMode(led, OUTPUT);
  servo1.attach(13);
  digitalWrite(7, HIGH);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
}

char password[]={"1234"}; //change password here
char enteredString[9]={""}; //5 is default
int stringPos=0;


void loop(){

  key=getKeypad();
  if( (key>-1) && (keys[key]!='*') && (keys[key]!='#') )
  {
   //save current char
   enteredString[stringPos++]=keys[key];
   //terminate string
   enteredString[stringPos]=0;
   //prevent writing past end of string
   stringPos -= (stringPos > 9); //3 is default
   Serial.print(keys[key]);
   lcd.setCursor ( 8, 2 );        // go to the third line
   lcd.print(keys[key]);

   delay(10);
  }
  
 
 
 
  if (keys[key] =='#')
  {//reset ready for next attempt
    Serial.println("");
    
    stringPos=0;
    if ( strcmp(enteredString, password)==0) 
      {digitalWrite(led, HIGH);
        Serial.println("Quick, it's open");
        lcd.setCursor (0, 3 );
        lcd.print("   ACCESS GRANTED");
       servo1.write(0);
       delay(5000);
       servo1.write(90);
       digitalWrite(led, LOW);
       digitalWrite(led2, HIGH);
    delay(1000);
    digitalWrite(led2, LOW);
    lcd.setCursor (0, 3 );
    lcd.print("                  ");
      }
    else
    {
    digitalWrite(led2, HIGH);
      Serial.println("GO AWAY!");
      lcd.setCursor (0, 3 );
        lcd.print("  ERROR! TRY AGAIN");
      delay(1000);
      digitalWrite(led2, LOW);
      lcd.setCursor (0, 3 );
        lcd.print("                    ");
    }
    enteredString[0]=0;
  }
    press1 = digitalRead(button1);
    if (press1==LOW)
    {
    digitalWrite(led, HIGH);
    servo1.write(0);
    delay(5000);
    servo1.write(90);
    digitalWrite(led, LOW);
    digitalWrite(led2, HIGH);
    delay(1000);
    digitalWrite(led2, LOW);
  }
      
}

int getKeypad(){
  int ret=-1;
  boolean reset_lockout=false;
  if(analogRead(A0)<7)
    key_lockout=false;
  else if(!key_lockout){
    delay(20);
    ret=15-(log((analogRead(A0)-183.9)/58.24)/0.1623)+0.5;
    key_lockout=true;
  }
  return ret;
}

I do not see it immediately, I expect one of teh LCD .setCursor() resets it unintentionally

try to strip the code to the minimum (keypad only) that still shows the problem, that make is often easier.

    lcd.setCursor ( 8, 2 );        // go to the third line
    lcd.print(keys[key]);

Each time through loop() you move the LCD cursor to the same position before printing the character so each one overwrites the previous one displayed. Put the cursor in position just once before accepting any input and you should be OK.

I cannot figure out how to implement that. I moved it out of the loop, it starts good, but then goes to other lines. How do I stop that from happening?

Do this before you start accepting and displaying keys entered from the keypad and if the user password input is invalid or the user decides to start over.

   lcd.setCursor ( 8, 2 );        // go to the third line

Do not do it before showing each character entered or they will all appear in the same place because you move the cursor there.

If you are determined to move the cursor before or after displaying each character input then you need to keep a count of characters entered and use it in the lcd.setCursor() comman as in

   lcd.setCursor ( 8 + numberOfCharactersEntered, 2 );        // go to the third line

But there really is no need to do that.

You will also need to clear characters previously entered when you do this

  if (keys[key] =='#')
  {//reset ready for next attempt
    Serial.println("");

It would also be good practice to remove input from the screen if the user is successful.