GRJ,
I think it's easy to use just software in this situation because I am only trying to detect when a button is pressed or an isolated rail has been triggered. I only want to throw a switch and change the indicator light when a signal is first received. Nothing else happens until a signal is received to switch the turnout in the opposite direction. My only debounce is to require that a signal is present for 10 consecutive loops of the code before it is considered good. I picked 10 randomly, but it seems to work well. It is short enough that I don't notice the delay when I push a button.