Buenas! Hice un intento de resolver el problema, pero mi solucion es un poco diferente a la propuesta. Intente encontrarle algun error grave, pero hasta ahora nada. Si alguien es tan amable le agradeceria lo viche...quedo un poco largo, pero la logica se repite bastante. Es solo para ver si hay algun error importante.
Gracias de antemano, acaba el codigo:
#define MAX_PASOS ...
unsigned char teclaP;
int muestroTecla;
int main(){
//deshabilito interrupciones
//instalo rutinas
//habilito interrupciones
int Paso = 1;
int iterator= 0;
int secuencia[MAX_PASOS];
while(true){
teclaP = IN(RANDOM);
secuencia[Paso-1] = teclaP; // ingreso secuencia
tics = 0;
//Muestro la secuencia, iluminando adecuadamente las teclas
iterator = 0;
while(iterator<Paso){
teclaP = secuencia[iterator];
if(teclaP ==0){
OUT(LUCES,0x01);
while(tics<=1000); //permaneces prendida durante 1 seg
OUT(LUCES,0x00);
}else if(teclaP == 1){
OUT(LUCES,0x02);
while(tics<=1000);
OUT(LUCES,0x02);
}else if(teclaP == 2){
OUT(LUCES,0x08);
while(tics<=1000);
OUT(LUCES,0x08);
}else{
OUT(LUCES,0x08)
while(tics<=1000)
OUT(LUCES,0x08);
}
tics = 0;
while(tics<=100);//espero 0.1 seg antes de mostrar la siguiente tecla
}
teclaP = -1;
iterator = 0;
while(tics<=Paso*1000&&iterator<Paso&& !error){ // si todavia no ingrese toda la secuencia, no se me acabo el tiempo y no le erre
muestroTecla=0;
if(teclaP ==0){
if(secuencia[iterator]==teclaP)
iterator++;
else error = true;
OUT(LUCES,0x01);
while(muestroTecla<=500);
OUT(LUCES,0x00);
}else if(teclaP == 1){
if(secuencia[iterator]==teclaP)
iterator++;
else error = true;
OUT(LUCES,0x02);
while(muestroTecla<=500);
OUT(LUCES,0x00);
}else if(teclaP == 2){
if(secuencia[iterator]==teclaP)
iterator++;
else error = true;
OUT(LUCES,0x04);
while(muestroTecla<=500);
OUT(LUCES,0x00);
}else if(teclaP==3){
if(secuencia[iterator]==teclaP)
iterator++;
else error = true;
OUT(LUCES,0x08);
while(muestroTecla<=500);
OUT(LUCES,0x00);
}
teclaP = -1;
}
if((iterator == Paso )&& !error){ // si logre completar la secuencia y no erre
//gano
Alt = 0;
tics = 0;
while(tics<=1000){ // por un segundo muestro alternados los colores
OUT(LUCES,0x05);
while(Alt<=100);
OUT(LUCES,0x00);
Alt = 0;
OUT(LUCES,0x09);
while(Alt<=100);
OUT(LUCES;0x00);
Alt=0;
}
tics = 0;
while(tics<=500);
Paso++; //aumento tamaño secuencia
}else{
//perdio
tics = 0;
OUT(LUCES,0x0F);
while(tics<=1000);
OUT(LUCES,0x00);
tics = 0;
while(tics<=500);
Paso = 1; // secuencia vuelve a 1
}
}
void interrupt intTecla(){
unsigned char boton = IN(TECLADO);
if(teclaP==-1){
if(boton&0x01)
teclaP = 0
else if(boton&0x02)
teclaP = 1
else if(boton&0x04)
teclaP = 2
else if(boton&0x08)
teclaP = 3
}
}
void interrupt timer(){
tics++;
muestroTecla++;
}