Control de motores por medio de teclado 4x4 (PIC 18F4550)

#1
Bueno, la pregunta es fácil, y la respuesta se que lo será también, ya que el código en si es bastante elemental, pero aunque he buscado no logro encontrar el por qué no sirve.

La idea del código es que dependiendo de qué tecla de un teclado matricial 4x4 se presione, un determinado motor (de 4) gira en un sentido específico.

Bueno, el código es el siguiente:

Código:
#include <p18f4550.h>
#include <delays.h>

void teclado(void);
void g1i(void);
void g1d(void);
void g2i(void);
void g2d(void);
void g3i(void);
void g3d(void);
void g4i(void);
void g4d(void);

int g=0;

void main(){
	TRISB=0xF0; TRISD=0;
	ADCON1=0x0f;
	PORTD=0;PORTB=0;
	while(1){
		teclado();
/*		if(g=1){g1i();}
		else if(g=2){g1d();}
		else if(g=3){g2i();}
		else if(g=4){g2d();}
		else if(g=5){g3i();}
		else if(g=6){g3d();}
		else if(g=7){g4i();}
		else if(g=8){g4d();} */
	}
}

void teclado (void){
teclado:	
	PORTD=1;
		if(PORTDbits.RD4==1){PORTB=1;Delay10KTCYx(100);return;}
		if(PORTDbits.RD5==1){g=2;return;}
		if(PORTDbits.RD6==1){g=3;return;}
		if(PORTDbits.RD7==1){g=4;return;}
	PORTD=2;
		if(PORTDbits.RD4==1){g=5;return;}
		if(PORTDbits.RD5==1){g=6;return;}
		if(PORTDbits.RD6==1){g=7;return;}
		if(PORTDbits.RD7==1){g=8;return;}
	PORTD=4;
		if(PORTDbits.RD4==1){g1i();return;}
		if(PORTDbits.RD5==1){g=2;return;}
		if(PORTDbits.RD6==1){g=3;return;}
		if(PORTDbits.RD7==1){g=4;return;}
	PORTD=8;
		if(PORTDbits.RD4==1){g=5;return;}
		if(PORTDbits.RD5==1){g=6;return;}
		if(PORTDbits.RD6==1){g=7;return;}
		if(PORTDbits.RD7==1){g=8;return;}
	goto teclado;
}

void g1i(){
	PORTB=1;
	Delay10KTCYx(100);
}

void g1d(){
	PORTB=2;
	Delay10KTCYx(100);
}

void g2i(){
	PORTB=4;
	Delay10KTCYx(100);
}

void g2d(){
	PORTB=8;
	Delay10KTCYx(100);
}

void g3i(){
	PORTB=16;
	Delay10KTCYx(100);
}

void g3d(){
	PORTB=32;
	Delay10KTCYx(100);
}

void g4i(){
	PORTB=64;
	Delay10KTCYx(100);
}

void g4d(){
	PORTB=128;
	Delay10KTCYx(100);
}
Ahora, el problema es que al haer el barrio del teclado, ningún motor funciona.
Como se puede ver en el código, lo intenté de tres formas diferentes:

  • Dependiendo de qué tecla se presione, el programa "saltará" a una función específica.
  • Dependiendo de qué tecla se presione, se mueve cada motor de forma "directa".
  • Dependiendo de qué tecla se presione, se le asigna un valor a una variable, para luego en el "main" llamar a la función correspondiente.

No se por qué ninguna de las tres formas sirve, y no logro encontrar el problema, podrían ayudarme con esto ???
 
#2
Supongo que los motores ya funcionan correctamente si los mandas directamente sin lógica alguna.
 
Arriba