Mi técnica es hacer una rutina principal corta que llame a subrutinas y luego regrese a esa rutina principal; nunca he visto que se bloquee o falle inesperadamente ... solo cuando hay alguna variación brusca en la alimentación.
Programo en modo monotarea y hasta ahora funciona bien. Creo que si necesitas que un botón no rebote, pues en ese momento no necesitas nada mas, asi que por eso uso delays todos los que necesite.
Seguramente en algunos casos esto no se debe hacer, pero si sabes darle un orden a cada cosa en el programa, los delay no deberían ser problema pues igual hacen parte de todos los lenguajes de programación.
El programa mas largo que he hecho es uno para controlar un procesador de audio ... ya saben todas esas cosas como: controlar volumen, selección de entradas, on-off, retardo de salidas, control remoto etc. Todo es monotarea y usa delays y hasta ahora funciona perfecto. No uso ninguna interrupción y el sistema debe apagarse si un pin cambia de estado porque algo fallo en el amplificador; lo hace sin problemas.
Quizás la protección deba esperar máximo 200ms, por si algo falla mientras espera que un botón no rebote. Pero con lo leído aquí, llenare esos 200ms diciéndole al programa que revise el pin de protección ... antes no sabia que hacer en ese tiempo. Dejo de ejemplo la rutina principal (en Proton), desde donde llamo todo a ver que opinan!. Gracias.
'*****TECLADO LOCAL Y CONTROL REMOTO*******************
POWER:
While 1 = 1
Repeat
SONYIN_WORD = SonyIn
If ONOFF = 0 And FLAG = 0 Then GoSub ENCENDER
If ONOFF = 0 And FLAG = 1 Then GoSub APAGAR
If INPUTS = 0 And FLAG = 1 Then GoSub ENTRADA1
If UP = 0 And FLAG = 1 Then GoTo VOLUP
If DOWN = 0 And FLAG = 1 Then GoTo VOLDOWN
If PROT = 0 And FLAG = 1 Then GoTo PROTECT
If SONY = 21 And FLAG = 0 Then GoSub ENCENDER
If SONY = 21 And FLAG = 1 Then GoSub APAGAR
If SONY = 18 And FLAG = 1 Then GoTo VOLUP
If SONY = 19 And FLAG = 1 Then GoTo VOLDOWN
If SONY = 20 And FLAGM = 0 Then GoSub MUTEON
If SONY = 20 And FLAGM = 1 Then GoSub MUTEOFF
If SONY = 37 Then GoSub ENTRADA1
If SONY = 9 And FLAGL = 0 Then GoSub LOUDON
If SONY = 9 And FLAGL = 1 Then GoSub LOUDOFF
Until SONY <> 255
Wend
****************************************