I need to do a timer with 2 buttons(the first to run and pause, and the second to reset), and LCD 16x2

Your code is too complex and doesn't work because in your while loops you do not re-read the buttons.

You can simplify the code greatly if you just let the loop() function do the looping. Also, you only care about when the button BECOMES pressed and not that it IS pressed. This is explained in the tutorial StateChangeDetection. You must also account for button debounce. I will give the beginning of a simple implementation and you can fill in the rest.

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 4, 5, 6, 7);
const int botao1 = 8;
const int botao2 = 9;
int sec, min, hora;
unsigned long zero;

void setup() {
  Serial.begin(9600);
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("Cronometro do");
  delay(200);
  lcd.setCursor(1, 1);
  lcd.print("Ian Rapini ._.");
  delay(800);
  lcd.clear();

  pinMode(botao1, INPUT);
  pinMode(botao2, INPUT);
  sec = 0;
  min = 0;
  hora = 0;
  zero = millis();
}

void loop() {
  static bool runClock = false;
  static int lastStateBotao2 = digitalRead(botao2);
  static int lastStateBotao1 = digitalRead(botao1);
  int stateBotao2 = digitalRead(botao2);
  int stateBotao1 = digitalRead(botao1);

  if (stateBotao1 != lastStateBotao1)
  {
    delay(50); // debounce
    if (stateBotao1 == LOW)
    {
      runClock = !runClock;
    }
    lastStateBotao1 = stateBotao1;
  }

  if (stateBotao2 != lastStateBotao2)
  {
    delay(50); // debounce
    if (stateBotao1 == LOW)
    {
      lcd.setCursor(2, 0);
      lcd.print("  ");
      lcd.setCursor(0, 1);
      lcd.print("  ");
      lcd.setCursor(5, 1);
      lcd.print("  ");
      sec = 0;
      min = 0;
      hora = 0;
      zero = millis();
    }
    lastStateBotao2 = stateBotao2;
  }

  if (runClock)
  {
        // you fill in the rest
  }
}