Interrupt e blocco CPU

metti il codice tra i tag [ code ]

cmq il problema è che dopo un pò la micros() (circa 5 minuti se ricordo bene) va in overflow.
Prima di tutto puoi usare la millis() (overflow dopo 45 gg) e poi se tu NON avessi castato lasottrazione da unsigned long a long, casualmente avresti azzeccato "l'anti oveflow", ovvero il modo per evitare l'overflow in modo del tutto trasparente:

codice ora

[...]
long debouncing_time = 500; //Debouncing Time in Milliseconds
[...]
if((long)(micros() - last_micros) >= debouncing_time * 1000) {
[...]

codice anti-overflow

[...]
unsigned long debouncing_time = 500; //Debouncing Time in Milliseconds
[...]
if(micros() - last_micros >= debouncing_time * 1000) {
[...]

x maggiori info vedi http://www.leonardomiliani.com/2012/come-gestire-loverflow-di-millis/ (in particolare ti ho suggerito la Soluzione 2)