In Deiner routine kannst Du die Tasten genau in dem Moment erkennen, wenn gerade das Zeichen gesendet wurde, und noch nicht wieder auf ein Zeichen gewartet wird.

Wenn Du also mal testweise die serielle Kommunikation in main() auskommentierst, wird es schon besser funktionieren. Zum Testen würde ich auch um mehr als 1 in-/dekrementieren, ansonsten musst Du zu oft den Taster drücken.

Da Du Dich wahrscheinlich fragst, wie man beides - serielle Kommunikation und Taster - vernünftig zum Laufen bekommt: Mindestens eine dieser beiden Funktionen sollten über eine Interrupt-Routine gelöst werden.