Seguramente hay otra forma de hacer lo mismo que yo pero mas optimizado y mas claro pero por ahora esta es la forma en que me salio a mi.
#include <pr13 secuencia prog.h>
#byte portb=6
long tiempo = 400 ;
long tiempo2 = 500 ;
int8 byte01 ;
int8 byte02 ;
int8 byte03 ;
int8 byte04 ;
short us01 ;
short us02 ;
short us03 ;
short us04 ;
void mostrar(void);
void programar(void);
void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);
setup_comparator(NC_NC_NC_NC);
//TODO: User Code
do{
set_tris_a(0b00000111); ////////////// habilito algunas patas para pulsador
if(input(pin_a0)==1) ///////////// si el pin A0 esta en 1, se va al ciclo eterno de "programar"
programar();
else
mostrar(); /////////////// si al contrario esta a 0, se va al ciclo eterno de "mostrar" , la unica forma de salir del ciclo eterno es con un reset y
//////////////// cambiando el pin A0.
}while(true);
}
void mostrar(void) /////////// por puerto B sale los 8 bits del byte01. Un retardo y sale los 8 bits siguientes del byte02. Luego muestra byte03 y 04.
{
set_tris_b(0);
portb=0;
do{
if(us01==1) ////////// este registro "us01" es un flag. inicialmente todos los byteXX y usXX estan en cero. si byte01 esta acompañado
////////// por su flag "us01" en 1, sale por portb los 8 bits del byte01. Si us01 esta en cero quiere decir que aun no se le
///////// asigno ningun valor al byte01, en ese caso se ignora.
{
portb=byte01;
delay_ms(tiempo);
}
if(us02==1) /////////// resumiendo, los unicos bytesXX que se muestra en la secuencia de leds son los que tienen su flag en 1.
/////////// esto es para poder hacer secuencias menores a lo maximo que se puede. Osea hacer secuencias de 2 bytes a 100 bytes.
{ /////////// los bytesXX que no se usan se ignoran y no se muestran.
portb=byte02;
delay_ms(tiempo);
}
if(us03==1)
{
portb=byte03;
delay_ms(tiempo);
}
if(us04==1)
{
portb=byte04;
delay_ms(tiempo);
}
}while(true);
}
void programar(void) //////////// en esta seccion es para asignarle valores a mis registros bytesXX usando llaves y un pulsador.
{
set_tris_b(0);
portb=255;
delay_ms(tiempo); //// parpadea todas las luces para saber que entre a modo programacion
portb=0;
delay_ms(tiempo);
portb=255;
delay_ms(tiempo);
portb=0;
delay_ms(tiempo);
set_tris_b(255);
do{
if(us01==0) //////////// lo que hace aca es leer el puerto B y guardarlo en byte01. El programa se queda aca hasta que aprete el pulsador A1.
do{ //////////// Cuando apreto el pulsador A1, a este byte01 se lo acompaña con un flag para saber que ya no es
//////////// mas el valor inicial, sino el valor de la lectura del portb.
byte01=input_b();
if(input(pin_a1)==1)
us01=1;
}while(input(pin_a1)==0); /////////// una ves asignado el valor del primer byte hace lo mismo con el resto, los bytes no asignados se ignoran en la rutina "mostrar"
delay_ms(tiempo2);
if(us02==0)
do{
byte02=input_b();
if(input(pin_a1)==1)
us02=1;
}while(input(pin_a1)==0);
delay_ms(tiempo2);
if(us03==0)
do{
byte03=input_b();
if(input(pin_a1)==1)
us03=1;
}while(input(pin_a1)==0);
delay_ms(tiempo2);
if(us04==0)
do{
byte04=input_b();
if(input(pin_a1)==1)
us04=1;
}while(input(pin_a1)==0);
delay_ms(tiempo2);
}while(true);
}
/////////////////////////////////////////////////
Estoy teniendo problemas por ahora para asignarle valores a mis registros "bytes" usando mis 8 llaves. A veces programa y otras veces no lo hace. Programo 4 bytes y me programa 2 o 3 o a veces 1 solo byte.
Alguien tiene una mejor idea para reemplazar mi rutina de "programar"? Si el programa sigue sin entenderse voy a tratar de explicarlo mejor.
####################################################################
####################################################################
####################################################################
Me edito. Ya tengo el proyecto (casi) terminado. Faltaría probarlo en una protoboard para ver si funciona como en la simulación. Si todo va bien voy a agregar algo para poder variar el tiempo de la secuencia y tambien conectarlo con una eeprom externa.
Grabe la simulacion en un AVI de 1 min, si lo miran sabrán que es lo que intente hacer durante todo el dia. Comprimido pesa 150kb
Changos que comprime jeje.
Saludos!!!