LCD + PULSADOR

Buenas tardes, estoy en un bucle y no doy salido de él, tengo un código para hacerlo siguiente:

con un pulsador, si no está activado al principio que me ponga una frase, si le doy al botón y lo mantengo que me haga una cuenta de tanto por ciento y si lo suelto que me ponga descarga fallida y con un delay se vuelva al principio. no sé si me he explicado, pero os dejo el código a ver si me podeis echar una mano. un saludo y muchas graciasde antemano.

#include <LiquidCrystal.h>


LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int boton = 8;
const int ledPin = 13;
int valor;
int contador = 0;
int estadoanteriorboton = 0;
int validarPar = contador % 2;
int i = 1;

void setup() {
 Serial.begin(9600);
 lcd.begin(16, 2);
 pinMode(ledPin, OUTPUT);
 pinMode(boton, INPUT);
 lcd.print("Central de Datos");
 lcd.setCursor(0, 1);
 lcd.print("Pulsar para Descargar");
}

void loop() {
 valor = digitalRead(boton);
 
 if ((valor == HIGH) && (estadoanteriorboton == HIGH)) {
   contador++;
   lcd.clear();
   lcd.setCursor(5 , 0);
   lcd.print(i++);
   lcd.print("%");
   Serial.print("yo");
   delay(1000);
 }
 estadoanteriorboton = valor;
 if ((valor == LOW) && (estadoanteriorboton == HIGH)) {
   int i = 1;
   Serial.print("yoyo");
   lcd.clear();
   lcd.print("descarga fallida");
   delay(1000);
   asm("jmp 0x0000");
 }

otro.ino (933 Bytes)