puente grua con dos motores

Quiero que un puente grúa (con dos motores uno para subir y otro para desplazar de derecha a izquierda y viceversa) de la figura, realice el diagrama de etapas indicado, atendiendo al estado que presentan los cuatro finales de carrera “A”, “B”, “C” y “D” y un pulsador “P”. Se asignaran cuatro salidas del microcontrolador, para los desplazamientos “derecha” e “izquierda”, sobre el motor de movimiento horizontal junto con “subir” y “bajar”, sobre el motor de movimiento vertical.

Me hace todo la secuencia menos cuando llega al final de carrera A que no baja el motor. ¿Porqué que está mal en el código?
Os dejo una imagen para entender el funcionamiento.

boolean A = 0; //Declaro la variable A (final de carrera subida Motor1) asociado al pin 6
boolean B = 0; //Declaro la variable B (final de carrera derecha Motor2) asociado al pin 7
boolean C = 0; //Declaro la variable C (final de carrera bajada Motor1) asociado al pin 8
boolean D = 0; //Declaro la variable D (final de carrera izquierda Motor2) asociado al pin 9
boolean P = 0; //Declaro la variable P inicio de motor
boolean S = 0; //Declaro la variable J para saber si es el ciclo de ida o de vuelta (1 para la ida 0 para la vuelta)

void setup() {

pinMode (2, INPUT); //Asocio el pin 2 a una entrada, a la vez asociada a la variable P
pinMode (3, INPUT); //Asocio el pin 3 a una entrada, a la vez asociada a la variable A
pinMode (4, INPUT); //Asocio el pin 4 a una entrada, a la vez asociada a la variable B
pinMode (5, INPUT); //Asocio el pin 5 a una entrada, a la vez asociada a la variable c
pinMode (6, INPUT); //Asocio el pin 6 a una entrada, a la vez asociada a la variable D

pinMode (13, OUTPUT); //Asocio el pin 13 a EN2 del segundo motor
pinMode (12, OUTPUT); //Asocio el pin 12 a EN1 del primer motor
pinMode (11, OUTPUT); //Asocio el pin 5 a una salida, a la vez asociada a la variable ParadaMotor1
pinMode (10,OUTPUT); //Asocio el pin 4 a una salida, a la vez asociada a la variable SubirMotor1
pinMode (9, OUTPUT); //Asocio el pin 3 a una salida, a la vez asociada a la variable ParadaMotor2
pinMode (8, OUTPUT); //Asocio el pin 2 a una salida, a la vez asociada a la variable IzquierdaMotor2

}

void loop() {

A=digitalRead(3);
B=digitalRead(4);
C=digitalRead(5);
D=digitalRead(6);
P=digitalRead(2);

if (S==0) {
if (P==1) {

while (C==0) {

digitalWrite (11, 1);//
digitalWrite (10, 0); // Subimos el gancho del motor1
C=digitalRead(5); // vuelvo a leer C porque sino no me puede salir del while
}

digitalWrite (11, 0);
digitalWrite (10, 0);

while (B==0) {

digitalWrite (8, 0);
digitalWrite (9, 1); //el motor2 gira hacia la derecha
B=digitalRead(4);
}

digitalWrite (8, 0); //paramos el motor2
digitalWrite (9, 0);

while (D==0) {

digitalWrite (11, 0); //Bajamos el gancho del motor1
digitalWrite (10, 1);
D=digitalRead(6);
}

digitalWrite (11, 0);//paramos el motor1
digitalWrite (10, 0);

S=1;
}

}

if (S==1) {
if (P==1) {
while (C==0) {

digitalWrite (11, 1);//
digitalWrite (10, 0); // Subimos el gancho del motor1
C=digitalRead(5); // vuelvo a leer C porque sino no me puede salir del while
}

digitalWrite (11, 0);
digitalWrite (10, 0);

while (A==0) {

digitalWrite (8, 1);
digitalWrite (9, 0); //el motor2 gira hacia la izquierda
B=digitalRead(4);
}

digitalWrite (8, 0); //paramos el motor2
digitalWrite (9, 0);

while (D==0) {

digitalWrite (11, 0); //Bajamos el gancho del motor1
digitalWrite (10, 1);
D=digitalRead(6);
}

digitalWrite (11, 0);//paramos el motor1
digitalWrite (10, 0);
S=0;

}
}
}

Tienes puesto:

           while (A==0) {

                digitalWrite (8, 1);
                digitalWrite (9, 0); //el motor2 gira hacia la izquierda
                B=digitalRead(4);
            }

Si te fijas, en el while verificas la variable A, pero al final del while estás actualizando el valor de la variable B con lo que hay en la entrada asignada a la variable B. Te has despistado con ello. Cambia B por A y el 4 por un 3. El código a de quedar tal que así:

           while (A==0) {

                digitalWrite (8, 1);
                digitalWrite (9, 0); //el motor2 gira hacia la izquierda
                A=digitalRead(3);
            }