Problema programmazione pulsante

Salve a tutti,
ho un problema con la programmaziona di un pulsante: in pratica quando premo un bottone e questo rimane premuto non devo svolgere niente fin quando il pulsante non viene rilasciato.
Ho scritto questa parte di codice e prima di provarlo volevo vedere se ci fosse qualcosa di sbagliato.

//codice
int val;
int button;

void setup(){
//codice
pinMode(9,INPUT);
}

void loop(){
val=digitalRead(9);
  if(val==HIGH){
    button=1;
  }
  else{
    button=0;
  }
  if(button==1){
    val=digitalRead(9);
  }
  else if(button==0){ 
    //codice da eseguire
   }
}

Hai correttamente intuito che ti serve una variabile per determinare se il pulsante è stato premuto ma il codice così come l'hai sctirro non fa quello che dichiari di voler ottenere, ti indico una possibile traccia a te trasformarla in codice:
Se il pulsante è premuto attivo il semaforo (nel tuo caso la variabile button) altrimenti controllo se il semaforo è attivo eseguo il codice e disattivo il semaforo altrimenti non faccio nulla.
Alcune proposte di miglioria per una "buona" programmazione:
Ottimizza sempre le variabili, in entrambe i casi hai definito variabili di tipo int, in questo caso è un inutile spreco di risorse (int occupa due byte) e è fuorviante, potevi definirle di tipo byte che appunto accupa un solo byte, ma ancora meglio essendo una un semaforo ed una la lettura di un pin che può valero solo HIGH e LOW (true e false) sarebbe meglio definirle booleane.
Inoltre la variabile val puoi farne a meno ottimizzando ancora di più il codice, ma se questo ti risultasse ostico puoi sfruttarla nella prossima stesura del codice e poi ottimizzare in seguito

Altra cosa per far si che il tutto funzioni come descritto devi dotare il pulsante di debounce hardware (che è comunque sempre preferibile), se tu volessi implementarlo software dovresti complicare il codice ma come detto se possibile è sempre meglio hardware (resistenza+condensatore nella versione più semplice possibile)