Hola!
Tengo otro problema con una funcion, asi que he "resucitado" este hilo.
La idea es la siguiente: Tengo un pulsador en A0, que se pone a +V al presionarlo. Cuando esto ocurre, el programa salta a una funcion que se encarga de contar de 1 a 6 repetidamente hasta que se suelte el pulsador. Cuando esto ocurre, se muestra un valor en el PORTB, y se regresa al programa principal.
Sin embargo, he colocado algunas"señales" en el codigo para seguirle el rasto a medida que se ejecuta, y si bien salto a la funcion al presionar el pulsador, nunca entra dentro del bucle "do....while" que hay dentro de ésta.
Por supuesto, se trata de un circuito que simula un dado.El codigo esta bien comentado, y es sencillo:
#include <16f627a.h> //PIC utilizado
#fuses XT,NOWDT,NOPROTECT,PUT //Configuramos los fuses
#use delay (clock=4000000) //Oscilador a 4Mhz
#use fast_io(b) //Optimizamos E/S del PORTB
#BYTE PORTB = 0x06 //El PORTB está en 0x06
//Variables globales--------------------------------------------------
//La tabla dado tiene el valor del PORTB para cada numero posible.
int dado [6]={0x01,0x08,0x09,0x0A,0x0B,0x07};
//Prototipo de funciones ---------------------------------------------
void lanzo_dado(void);
//------Programa principal--------------------------------------------
void main(void)
{
set_tris_a(0xFF); //configuro el PORTA completo como entrada.
set_tris_b(0x00); //configuro el PORTB completo como salida.
disable_interrupts(GLOBAL); //todas las interrupciones desactivadas
do{ //bucle principal
//Apago los leds
PORTB = 0x80;
if(input(PIN_A0)){ //Si elpulsador esta en alto...
lanzo_dado(); //...lanzo el dado y muestro el resultado
}
}while(TRUE); //Repito el bucle.
}
//--------------------------------------------------------------------
//Esta funcion lanza el dado y muestra el resultado
//--------------------------------------------------------------------
void lanzo_dado(void) {
char i=0; //i contendrá el valor del dado en cada momento.
do{ //bucle principal
i++; //Sumo 1 a i
PORTB = 0x40;
if (i == 7) { //Si pasa de 6...
i = 1; //...empiezo de 1 otra vez.
}
}while(PIN_A0); //Repito el bucle hasta que se suelte el pulsador.
PORTB = 0x20;
//Ahora, muestro el valor de "i" en los LEDs:
PORTB = dado [i];
delay_ms(5); //Espero 5 segundos, y vuelvo al programa ppal.
}