Tu problema inmediato parece surgir de la suspensión lisButton a menos que se presione un interruptor en particular. Por lo tanto, no puede "ver" el otro interruptor mientras la subrutina está colgada en un bucle esperando un interruptor diferente.
Hay algunas maneras de abordar este problema. Uno sería escribir una subrutina que busque cualquiera de los conmutadores y devuelva un código que indique qué conmutador vio. A continuación, puede probar ese código y actuar de manera diferente para los diferentes interruptores. Este es el equivalente a patear la lata por el camino: resuelve el problema hoy, pero si necesita hacer algo más que no sea un interruptor, el problema volverá a surgir.
Otra forma es pensar en términos de eventos. El interruptor que se presiona es un evento, el interruptor que se está liberando es un evento. Los eventos se pueden detectar en una interrupción (generalmente una interrupción periódica del temporizador) y los eventos falsos como el rebote del interruptor y el ruido pueden ser rechazados. Los eventos reales verificados se pueden poner en una cola de clases (mínimo un evento, pero podría tener un número mayor en un FIFO) y el programa principal repite en espera de eventos y luego responde a cada evento. Esto le permite fácilmente (y de manera confiable) hacer cosas como crear un evento cuando se mantiene presionado un interruptor durante más de 2 segundos, o el usuario hace un doble clic.
La razón para tener una cola en lugar de solo una ubicación es que le da a su programa principal más tiempo para tratar los eventos que ocurren en una sucesión rápida, como dos pulsaciones de teclas que son casi simultáneas. Si no tienes una cola, puedes perderte uno de ellos.
Estoy de acuerdo con los comentarios de Olin con respecto a la estructura y el estilo de la programación.
A diferencia de, digamos, Python, el código de ensamblaje tiene poca estructura inherente, por lo que debe estar atento e imponer una estructura visible y salpicarla con comentarios útiles para no tener un montón de código de espagueti de solo escritura. Usar subrutinas, como lo hiciste, es un comienzo. Cosas como explicar la estructura general del código y todas las asignaciones de E / S en un encabezado de comentario exhaustivo en la parte superior del programa son rigurosas. Hace poco volví a visitar un programa de ensamblaje bastante complejo (matemáticamente y lógicamente) que escribí hace más de 16 años. El chip es obsoleto, por lo que tiene que ser portado y resulta en una arquitectura diferente. Los comentarios son muy útiles en tal situación.