Error en codigo y con Tone

Hola a todos.
En mi proyecto,tengo un lcd con un teclado,en el cual hay un cuenta regresiva,si se introduce el codigo correcto,la cuenta atras se para y se tendria que reiniciar,osea,volver al estado principal,y no lo hace,reconoce el codigo pero sigue la cuenta atras. me podeis ayudar??
Tambien en cada segundo va sonando un pip y al llegar el contador a cero hace otro sonido,pero si en mi codigo,quito el comentario a los tone,en el display me salen caracteres raros...a ver que se puede hacer.

dejo el codigo:

#include <Keypad.h>
#include <LiquidCrystal.h>
#define pound 14
#define LED_RED 0
#define LED_GREEN 1
#define KP_ROWS 4
#define KP_COLS 3

unsigned int timerSeconds = 300; // start with 5 minutes on the clock
byte password[4];
byte entered[4];
int currentLength = 0;
byte i = 0;

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

//Keypad
char keys[KP_ROWS][KP_COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'},
};
byte rowPins[KP_ROWS] = { 15, 2, 19, 17 }; //connect to the row pinouts of the keypad {18, 2, 14, 16}
byte colPins[KP_COLS] = { 16, 14, 18 }; //connect to the column pinouts of the keypad {17, 19, 15}
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, KP_ROWS, KP_COLS);

char key;

//LCD setup
void setup() {
	pinMode(LED_RED, OUTPUT); // sets the digital pin as output
	pinMode(LED_GREEN, OUTPUT); // sets the digital pin as output
	lcd.begin(16, 2);
	lcd.print("Entre codigo: ");
	lcd.cursor();
	lcd.setCursor(6, 1);
	while (currentLength < 4) {
		key = keypad.getKey();
		if (key != NO_KEY) {
			lcd.print(key);
			password[currentLength] = key;
			currentLength++;
			lcd.setCursor(currentLength + 6, 1);
		} else delay(100); // only sample it every 1/10 sec, no need to go apesh!t
	}
	lcd.noCursor();
	lcd.clear();
	lcd.print("A introducido: ");
	lcd.setCursor(6, 1);
	lcd.print(password[0],DEC);
	lcd.print(password[1],DEC);
	lcd.print(password[2],DEC);
	lcd.print(password[3],DEC);
	delay(2500);
	lcd.clear();
	currentLength = 0;
}

void loop() {
	lcd.clear();
	lcd.print("Entre codigo: ");
	lcd.cursor();
	key = keypad.getKey(); // get the key once per this loop
	if (key != NO_KEY) {
		lcd.setCursor(0, 1);
		lcd.print("               ");
		lcd.setCursor(6, 1);
		while (currentLength < 4) {
			// here, we take the key that broke us into this "if" statement, instead of discarding it. this also pauses the timer, effectively.
			if (key != NO_KEY) { // redundant for the first loop, but necessary for every next character
				lcd.setCursor(currentLength + 5, 1);
				lcd.print("*");
				lcd.setCursor(currentLength + 6, 1);
				lcd.print(key);
				entered[currentLength] = key;
				currentLength++;
			} else delay(100); // only sample it every 1/10 sec
			key = keypad.getKey(); // get the key every time "while" loops
		}
		if (memcmp(entered,password,4) == 0) { // shortcut to compare an array of bytes, use memcmp(A, B, length), will return 0 if match.
			lcd.noCursor();
			lcd.clear();
			lcd.print(" Desarmada ");
			lcd.setCursor(0, 1);
			lcd.print("Reseteando Bomba");
			delay(2500); // hold that on screen for 2.5 seconds
			currentLength = 0;
		} else {
			lcd.noCursor();
			lcd.clear();
			lcd.print(" Incorrecto ");
			lcd.setCursor(0, 1);
			lcd.print(" Tiempo -0:60"); // Display time penalty
			if (timerSeconds > 60) timerSeconds -= 0;
			else timerSeconds = 1; // will trigger BOOM next cycle
			currentLength = 0;
			delay(2500); // hold that on screen for 2.5 seconds
		}
	}
	timer(); // prints current time on screen, checks for "go off" time, holds loop for 1 second
}

void timer() {
	lcd.setCursor(0, 1); // sets cursor to 2nd line
	lcd.print("Tiempo: ");
	lcd.print(timerSeconds / 60); // integer number of minutes on clock
	lcd.print(":");
	lcd.print(timerSeconds % 60); // mod 60; gives us number of seconds outside of 60sec/min
	delay(950); // hold us here for 0.950 seconds
	digitalWrite(LED_GREEN,!digitalRead(LED_GREEN)); // toggle the green LED once a second
	//tone(9,784, 200); // play bleep for 50ms
	delay(50); // and there's the rest of that 1 second (not counting LCD delay)
	
	timerSeconds--;
	if (timerSeconds == 0) bombomb();
}
void bombomb() {
	// routine for making ze BOMB GOEZ OFF!!!1 :D
	lcd.noCursor();
	lcd.clear();
	lcd.print(" !BoOo0o0o0om! ");
	//tone(9,110, 200);
	digitalWrite(LED_RED, HIGH); // sets the red LED on
	delay(500); // waits half a second
	//tone(9,110, 200);
	delay(500); // waits half a second
	digitalWrite(LED_RED, LOW); // sets the red LED off
	digitalWrite(LED_GREEN, HIGH); // sets the green LED on
	//tone(9,110, 200);
	delay(500); // waits half a second
	digitalWrite(LED_RED, HIGH); // sets the red LED on
	digitalWrite(LED_GREEN, LOW); // sets the green LED off
	//tone(9,110, 200);
	delay(500); // waits half a second
	digitalWrite(LED_RED, LOW); // sets the red LED off
	digitalWrite(LED_GREEN, HIGH); // sets the green LED on
	//tone(9,110, 200);
	delay(500); // waits half a second
	digitalWrite(LED_GREEN, LOW); // sets the green LED off
	key = NO_KEY; // enter the while() loop, otherwise it'll skip. i could use do { } while();, but I'm lazy.
	while (key == NO_KEY) {
		key = keypad.getKey();
		if (key == '#') {
			lcd.clear();
			lcd.print("Reseteando Bomba");
			delay(2500); // good ole' 2.5 sec delay
			timerSeconds = 300; // put 5 minutes on the clock
			// and we break the loop and go back to timer.
		} else key = NO_KEY; // continue looking for pound key
	}
}