Arduino hardware interrupt to control servo motor

Currently am working on project to open a door with access code using arduino UNO and a servo motor. Normal operation requires entering access code using keypad which is working fine. Another option requires pressing a button that causes an interrupt to rotate the servo motor. My problem is my interrupt only works once and never works again. Plus how do i put the for-loop to rotate the servo motor inside the interrupt function with a delay. I know that is not possible but am calling another function that has the delayMicroseconds but all this is not working. Below is my implementation please help

#include <Keypad.h>
#include <LiquidCrystal.h>
#include <Servo.h>

const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
    {'1','2','3'},
    {'4','5','6'},
    {'7','8','9'},
    {'*','0','#'}
};
 
byte rowPins[ROWS] = {10, 9, 8, 7}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {13, 12, 11}; //connect to the column pinouts of the keypad
 
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(A0, A1, A2, A3, A4, A5);
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
char holdKeys[] = {};
int i = 0;
int j = 0;
char accessCode[6];
char holdMaskedCode[6];
char holdMaskedNumber[10];
char studentNumber[10];
String accessCodeString;
Servo servo;


const int openButtonPin = 2;
volatile int openButtonState = LOW;


void setup() {
  // put your setup code here, to run once:

  servo.attach(5);
  lcd.begin(16, 4);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Welcome");
  lcd.setCursor(0,0);
  pinMode(4, OUTPUT);
 //pinMode(openButtonPin, INPUT);
 attachInterrupt(0, enforceOpenAccess, HIGH); // PIN 2
   
 lcd.clear();
 lcd.print("Student Number");
  //keypad.addEventListener(getAccessCode);

}


void(* resetFunc)(void) = 0;

void loop()
{

  if(openButtonState == HIGH)
  {
       for(int k =0; k<=180; k+=2)
       {  
          servo.write(k);
          delay(30);
       }

       openButtonState = LOW;
  }
  char key = keypad.getKey();
  if(key)
  {   

    if(j < 10)
      {
      
        studentNumber[j] = key;
        //holdMaskedNumber[j] = '*';
        lcd.setCursor(0,2);
        lcd.print(String(studentNumber));

        if(j == 9)
        {
          studentNumber[9] = '\0';
          //holdMaskedNumber[9] = 0;
          lcd.clear();
          //String number = String(studentNumber);
          //lcd.print(number);

          //delay(1000);
          //lcd.clear();
          lcd.print("Access Code");
         
        }

        j++;
      }
    
   
    else
    {
       if(i < 5)
    {
      accessCode[i] = key;
      holdMaskedCode[i] = '*';
      lcd.setCursor(1,2);
      lcd.print(String(holdMaskedCode));
      if(i == 4)
      {
        holdMaskedCode[5] = '\0';
        accessCode[5] = '\0';
        //lcd.clear();
        //lcd.setCursor(0,0);
        //accessCodeString = String(accessCode);
        //lcd.print(accessCodeString);
        //delay(1000);
        lcd.clear();


     for(int i =0; i<6; i++)
          {
            lcd.print("Please wait.");
            delay(500);
            lcd.clear();
            lcd.print("Please wait..");
            delay(500);
            lcd.clear();
            lcd.print("Please wait...");
            delay(500);
            lcd.clear();
           
          }
          digitalWrite(4, HIGH);
          lcd.print("Access Granted"); 
          for(int k =0; k<=180; k+=2)
          {  
            servo.write(k);
            delay(30);
          }
          resetFunc();
        
      }
    
      i++;
    } 
    }  
  }
}

void enforceOpenAccess()
{
   openButtonState = !openButtonState;
   
}


The ISR is only running once and never runs again

Another option requires pressing a button that causes an interrupt

Nonsense. A human pressing a switch does NOT require nano-second accuracy in processing the switch press.

char holdKeys[] = {};

If you can't determine the appropriate size of the array, the compiler will by counting the number of initializers. A zero element array is worse than useless, because it leads you to believe that you can store data in it. You can NOT store anything in this array. It's a good thing you don't try. Get rid of this unused array!

 attachInterrupt(0, enforceOpenAccess, HIGH); // PIN 2

Normally, you want to react to RISING, FALLING, or CHANGE. HIGH is an option ONLY on the Due.

void(* resetFunc)(void) = 0;

Get rid of this. If you think you need this, you are wrong. You have some other flaw in your code that needs to be addressed.

void loop()
{

  if(openButtonState == HIGH)

If loop() iterated often enough, you would not need interrupts.

       for(int k =0; k<=180; k+=2)
       { 
          servo.write(k);
          delay(30);
       }

If the servo is opening a door lock, why does it need to do so ssslllooowwwlllyyy?

        lcd.print(String(studentNumber));

Pissing away resources uselessly AND INCORRECTLY, I see. When passing a character array to the String constructor, the char array MUST be a string. A string is a NULL terminated array of chars. Your char array is not NULL terminated, so it is not a string, so it should NOT be passed to a function that expects a string. Even if the array was a string, wrapping the string in a String so that print() has to unwrap the string to print it, after the instance is constructed and then destroyed after printing is stupid.

And, no I will not apologize for calling this code stupid!

          resetFunc();

Why? There is no earthly reason for doing this.