If you're going to do it in hardware, I think it's simpler to just use an RxC time constant followed by a Schmitt-trigger inverter like the 74HC14. Then you don't need an additional microcontroller pin to reset the 555 either.I just found a foolproof debounce technology, but it comes at a small price. I set up a 555 timer in one-shot mode, and use the pushbutton to trigger the timer. As soon as the timer output is detected on the designated Arduino input pin, I have the arduino pull the 555 reset line low, killing off the high input.
I never use software delay loops to time a debounce, as the computer can't do anything else during the delay (and interrupts can lengthen the delay period), but instead use a constant stream of interrupts from an onboard timer to increment a set of two or three bytes, and they become the time reference that you can check anytime, and will be correct regardless of other interrupts and anything else you're doing.I had a debounce problem where an interrupt could actually interrupt the debounce, causing unpredictable outcomes. The 555 solved the problem.