Creo que todos sabemos que no te lo dejaron de un día para otro XD, en fin, todos hemos pasado alguna vez por eso.
Solo te pido que por favor escribas correctamente, para que la comunicación sea más clara.
Como que hay unos puntos que no se entienden muy bien, ¿tienes que controlar 2 motores?, si as así, ¿Cada uno tiene que ir en un sentido diferente?, ¿De qué tipo de motores hablas?, ¿de corriente directa?, ¿a pasos?, ¿ya tienes los drivers para controlarlos?.
Por lo que entendí necesitas algo así como una máquina de estados, que dependiendo tus entradas, sean los pasos a seguir.
Suponiendo que ya tienes los drivers de los motores, y que estos solo necesitan 2 pines para su control, que serían paso y dirección, puedes hacerlo asi:
#define IZQUIERDA 01000000 // Primera posición en el dip de 2
#define DERECHA 10000000 // Segunda posicion en el dip
#define BOTON PIN_C0 // El pin donde está tu botón
#define SENTIDO PIN_C1 // Pin de control para el sentido
#define ON_OFF PIN_C2 // Pin para encender-apagar el motor
int1 boton_flag=0; // Bandera para saber si se presionó el botón
int8 boton_level=0; // Variable para saber cuantas pulsaciones lleva
int8 sentido_dip; // Variable para capturar el valor del Dipswitch de posicion
int8 dip_no_vueltas; // Variable para capturar el estado del dip de 8
int8 no_vueltas; // Variable para decirle a los motores el no. de vueltas
// Con esta parte no te puedo ayudar mucho, ya que solo tu sabes de que forma funcionan tus motores
// y sabes con cuantos pulsos dan una revolución completa, asi que por ejemplo, si tu motor es a pasos
// y da una revolución con 200 pulsos, solo multiplicas el valor de esta variable por 200 y tendras
// tus revoluciones que quieras.
void main()
{
while(TRUE) //Ciclo infinito
{
if(BOTON==1&&flag_boton==0) // Testea el estado del boton y ve que la bandera este desactivada
{
delay_ms(50); // Retardo antirebotes
if(BOTON==1) // Confirma que fue una pulsación firme
{
flag_boton=1; // Pone en alto la bandera para hacer la acción una sola vez al presionar el boton
switch(boton_level)
{
case 0: // Primera pulsacion - determinar el sentido de giro
sentido_dip=(input_C()&11000000); // Suponiendo que el Dipswitch de dos posiciones lo tienes
// conectado a los pines C7 y C6, haces una operacion
// booleana "AND" con el puerto C completo para dejar en
// la variable solamente esos dos pines.
if(sentido_dip==IZQUIERDA) output_high(SENTIDO); // Si el dip está en 01, se activa la salida
// SENTIDO, con lo cuál hiria a la izquierda
if(sentido_dip==DERECHA) output_low(SENTIDO); // Si el dip está en 10, se desactiva la salida
// SENTIDO, con lo cuál hiria a la derecha
break;
case 1: // Segunda pulsación - numero de vueltas
no_vueltas=input_B(); // Se guarda el valor del Dipswitch de 8, suponiendo que está conectado
// al puerto B, en la variable no_vueltas
switch(dip_no_vueltas) // Supongo que el Dip lo vas a tomar como que solo uno de los ocho deberá
// estar activado y será el numero de vueltas no?
{
case(00000001) // 1 vuelta
no_vueltas=1;
break;
. .
. // Aqui van las otras 5 posibles combinaciones
.
case(01000000) // 7 vueltas
no_vueltas=7;
break;
}
case 2: // Tercera pulsacion - hechar a andar el motor
output_high(ON_OFF); // Se prende el motor
// Aquí faltaría el código para que sepas cuantos pulsos es una revolución,
// Despues de terminar los pulsos, apagas el motor o simplemente dejas
output_low(ON_OFF); // de dar pulsos
boton_level=0; // Reseteas el contador de pulsos para otro ciclo
}
}
}
if(BOTON==0&&flag_boton==1) flag_boton==0; // Testea que ya se haya terminado de presionar el boton para volver a
// resetear la bandera
}
}
Esta es la forma más facil, la otra sería usando Timers e interrupciones.
Como te podrás dar cuenta va a estar muy difícil que alguien te lo haga completo, ya que solo el que tiene el Hardware, sabe los toques finales que hacen falta, pero básicamente de esta forma lo podrías hacer, espero haberte ayudado un poco.