here's a hint

define your own delay function, call it mydelay, that returns an int
break down any delay into multiple 10 msec delays using a for loop
every time you wait for 10msec you check an input, if the input has changed
you quit the for loop and return TRUE otherwise you finish off the loop and return FALSE
when you use mydelay you check the return value, if it's false you go on to the next step otherwise you break out of the animation loop
it's a bit crude but it doesnt require an interrupt and it works at a 10msec resolution
(please note that the for loop and checking the input uses a fee microseconds therefore on long delays you might need to compensate the extra time)