El flujo de programa solo "entra" en un bucle como:
while(lectura == HIGH)
{
digitalWrite(O5, HIGH);
}
si la condición es verdadera, en este caso si "lectura" es HIGH. Una vez atrapado dentro del bucle while, el flujo de programa solo puede escapar si "la condición" deja de ser verdadera. Esto implica que algo que se ejecute dentro del bucle while tiene que cambiar en algún momento la "verdad" de la condición o el flujo quedará atrapado para siempre en un "bucle eterno". En este caso, salvo que haya por ahí algún código invisible, como el servicio de una interrupción, el código dentro del bucle while no cambia ni el valor de "lectura", ni el valor de HIGH lo que condena al bucle a ser un bucle infinito.
El compilador debería dar un warning en este caso porque se puede determinar que este es un bucle infinito en "tiempo de compilación"
Offtopic: Las etiquetas empleadas en los #define deberían ser palabras largas e improbables, como Pin_entrada_driver_05, para evitar que puedan aparecer accidentalmente en el código. Por ejemplo: si escribimos
#define er 456
y luego en el código
Serial.print(vv);
el preprocesador del compilador nos cambiará esa linea por:
S456ial.print(vv);