Combining interrupts and debouncing on a keypad
It depends if you want exclusive button reads or any combination.
You can use the data (or its inverse to trigger IRQ) then  MASK the IRQ until no button is pressed and debounce the switch in S/W.  Discrete or a 9-pin 8R-array may be used with a PISO.
I simulated a 4 kHz Clock and 250 Hz sample rate for 16 buttons. 4 may be left out.
One way is the traditional matrix read using 3 clock ports from uC and 1 serial data port.
There are ways to simplify this further, maybe.
IF you have trouble finding a non-blocking debounce routine you could always old-school put a cap across every switch with 1M*10nF=10ms that holds up more than the 5ms bounce time (typ) and then the cycle time of 4ms will capture on the 1st instant even if pressed for only 1us.  Otherwise in S/W, you are just looking for 2 consecutive states to validate the change... More if you want to slow down the response time for changes. But n-key rollover is possible. Make or IRQ service routine as short as possible.