Como dice juaperser, el while esta mal puesto. Lo que tal ves vos queres es que siga girando sin tener que tener presionado el boton. Lo cual lo de juaperser no te va a funcionar.
De todas formas si queres hacerlo con el while entonces seria algo como esto:
Esta solucion que voy a dar yo es mala, es mala por como esta diseñada la funcion ya que si o si te tenes que comer todos esos retardos de 100ms, lo cual si queres cambiar de sentido lo vas a tener que tener presionado al otro boton hasta que llegue al if, tal ves estamos hablando de 1/2 segundos
void derecha() //giro a la derecha
{
while(1)
{
output_a(0x01);
delay_ms(retardo);
output_a(0x03);
delay_ms(retardo);
output_a(0x02);
delay_ms(retardo);
output_a(0x06);
delay_ms(retardo);
output_a(0x04);
delay_ms(retardo);
output_a(0x0c);
delay_ms(retardo);
output_a(0x08);
delay_ms(retardo);
output_a(0x09);
delay_ms(retardo);
if (!input(sw2)) {break;}
}
}
void izquierda()//giro sentido a la izquierda
{
while(1)
{
output_a(0x01);
delay_ms(retardo);
output_a(0x09);
delay_ms(retardo);
output_a(0x08);
delay_ms(retardo);
output_a(0x0c);
delay_ms(retardo);
output_a(0x04);
delay_ms(retardo);
output_a(0x06);
delay_ms(retardo);
output_a(0x02);
delay_ms(retardo);
output_a(0x03);
delay_ms(retardo);
if (!input(sw1)) {break;}
}
}
Lo mejor creo que es implementar un array con los valores del puerto
puerto[8] = {0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}
Para ir para un lado solo deberias incrementar el indice, para el otro decrementar y cuando llegas a tope simplemente le asignas el valor al indice del ultimo o primer valor, segun cual necesites
int i=0;
if(input(sw1)==0){ // Si es igual a 0 entra aca y no sale hasta que se presione el otro boton
while(1)
{
output_a(puerto[i++]); // i++ para la derecha e i-- para la izquierda.
if (i == 8) {i=0;} // suponiendo que sean 8 valores, para el otro lado seria if(i==0) {i=7;}
delay_ms(retardo);
if(input(sw2)==0) break;
}
}
Eso simplificaria bastante tu programa y ademas permite que arranque con los valores que dejo cuando iba girando al lado contrario, tambien podes cambiar de giro en cualquier momento y no solo cuando termine toda la vuelta.
otra cosa solo tenes un retardo como limitante.