I did not check the logic of your project yet, but you are making two unforgivable errors.
Declaring intermediate variables that are used within an interrupt handler should be declared inside the handler when not accessed by another function. If accessed they must be declared as "volatile" or you'll run into deep troubles.
Never call delay-functions within an interrupt handler neither directly nor indirectly (LCD-functions delay!). Avoid loops. Do not wait for any event to happen.
Best (and safest) practice is
Declare a global volatile variable as an indicator (flag) for the interrupt. In interrupt handler set the flag, clear the interrupt and return.
In the main-loop: Check the flag. When set, act accordingly and reset the flag.