Generally, you don't want your interrupts to do much except setting a flag in a global variable and then exit and let main() handle what needs to be done. It is very important to set all such global variables to "volatile", otherwise the compiler might optimize them away, because it believes that the variable is only used in main(). You will get strange, random errors which are very hard to track down.
For cases where you need to execute things directly from the interrupt, a good advise is to disable the specific interrupt temporary the first thing you do, then clear the "i" bit in the CCR to allow other interrupts to occur. When you have finished your task, enable the interrupt source again.
And of course, in every isr you should clear the interrupt source in the corresponding flag register before you leave the isr.
In case of debouncing, you probably just want to save a timer value, then compare it with the value you get next time you enter the isr. The HCS12 timer port is very suitable for this, since it allows a lot of flexibility in the hardware.