Para realizar una máquina de estados no es necesario utilizar ningún timer, ni interrupciones ni nada que se lo parezca. Básicamente hay que definir los estados que queremos con la directiva #define <estado> <nº del estado>, seguidamente definimos una variable donde guardaremos el estado, como pro ejemplo vEstado, se inicializa la variable con el estado inicial y se cierra en el main en un bucle infinito que: 1º compruebe los pulsadores, 2º si se ha pulsado alguno se cambia en la variable estado el nuevo estado dependiendo del botón pulsado, 3º Se comprueba el valor de la variable estado y se llama a la función asociada con el estado. Con eso estaría implementada la máquina de estados.
Un saludo