Autor Tema: Juego de simon by BIOT  (Leído 2042 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Diego_arrow

  • PIC10
  • *
  • Mensajes: 29
Juego de simon by BIOT
« en: 07 de Abril de 2005, 02:42:00 »
hola a todos:

estoy muy interesado en construirme ese ejemplo. el problema que tengo esque ningun compilador en c me deja convertirlo en hex.

el problema esta en mi ordenador supongo, ya que no se que programa es el idoneso para ese trabajo. el ccs el hpdpic. no se que pasa ni como hacer que4 funcionen correctamente.

/******************* SIMON *********************
                  *                                             *
                  *                  By Biot                    *
                  *                 S.I.T.T.M                   *
                  *                                             *
                  ***********************************************/

/******************************** ESPECIFICACIONES *****************************

 El dispositivo físico consta de cuatro leds (rojo,verde,amarillo y azul)
 conectados a RA0,RA1,RA2 y RA3 (en ese orden),de un altavoz conectado a RB3
 y de cinco pulsadores.
 Un pulsador está conectado a RB0 (para generar el color aleatorio) y los otros
 cuatro,que corresponden a cada uno de los leds,están conectados a RB4,RB5,RB6
 y RB7.Tanto los leds como los pulsadores son activos a nivel alto.

*******************************************************************************/



/*******************
*   PREPROCESADO   *
********************/

#include <16F84.h>
#use delay(clock=4000000)
#use fast_io(A)
#use fast_io(B)
#fuses XT,NOWDT,NOPUT

/****************************************
*  DEFINICIÓN DE ETIQUETAS Y VARIABLES  *
*****************************************/

#byte   PORTA = 0x05      // Puerto A

#byte   PORTB = 0x06      // Puerto B y bits utilizados
#bit  RB3 = 0x06.3
#bit  RB4 = 0x06.4
#bit  RB5 = 0x06.5
#bit  RB6 = 0x06.6
#bit  RB7 = 0x06.7

#byte   INTCON = 0x0B

int aleatorio,dir_lectura,dir_escritura,color_leido,leido,color_pulsado,nivel;
short fin_juego;


/***************
*  SUBRUTINAS  *
****************/


void retardo(int latencia)
   {
   switch(latencia)
      {
      case 1: delay_ms(200);       // Correspondiente al nivel 1
      break;
      case 2: delay_ms(100);       // Nivel 2
      break;
      case 3: delay_ms(50);        // Nivel 3
      break;
      case 4: delay_ms(15);        // Nivel 4
      break;
      default:
      break;
      }
   }


void altavoz(int tono)  // Para generar un sonido diferente para cada color
   {
   int i,j;
   for(i=0; i<=40; i++)
     {
     for(j=0; j<=4; j++)
       {
       output_high(PIN_B3);      // La distancia entre pulso y pulso viene determinada
       delay_us(300*(6-tono));   //  por el parámetro tono
       output_low(PIN_B3);
       delay_us(300*(6-tono));
       }
     }
   }


void antirebote()
   {
   delay_ms(30);
   while(PORTB != 0) {}  // No progresamos hasta que ningún pulsador esté activo
   delay_ms(30);
   }


void comprueba()
   {
   leido = read_eeprom(dir_lectura);  // Leemos la dirección eeprom correspondiente.
   if(leido != color_pulsado)         // Si la pulsación no ha sido correcta,acaba el
    {                                 //  juego y volvemos al principio del programa
    fin_juego = true;
    }
   }


void enciende_led(int color)  // Enciende el led correspondiente
   {
   switch(color)
      {
      case 1: output_high(PIN_A0);     // Led rojo
      break;
      case 2: output_high(PIN_A1);     // Led verde
      break;
      case 3: output_high(PIN_A2);     // Led amarillo
      break;
      case 4: output_high(PIN_A3);     // Led azul
      break;
      default: PORTA = 15;             // Los 4 leds
      break;
      }
   }
   
   
void genera_aleatorio()  
   {                      
   if(aleatorio == 4)         // 1 -> ROJO
    {                         // 2 -> VERDE
    aleatorio = 1;            // 3 -> AMARILLO
    }else {                   // 4 -> AZUL
    aleatorio++;
    }
   }
   
   
void guarda_color()
   {
   write_eeprom(dir_escritura,aleatorio);  // Guardamos el color generado y apuntamos a
   dir_escritura++;                        //  la siguiente dirección para una próxima
   }                                       //  escritura


void escoge_nivel()      // El led que se mantiene encendido corresponde al nivel elegido
   {
   boolean sale = FALSE;
   nivel = 1;
   PORTA = 0;
   output_high(PIN_A0);  // Por defecto,encendemos el led rojo (nivel 1).
   aleatorio = 1;
   while(!sale)              
      {
      genera_aleatorio();            
      if(RB4)
       {
       nivel = 1;
       PORTA = 0;
       output_high(PIN_A0);      // Nivel 1 - > led rojo encendido
       sale = true;
       antirebote();
       }else if(RB5) {
        nivel = 2;
        PORTA = 0;
        output_high(PIN_A1);     // Nivel 2 - > led verde encendido
        sale = true;
        antirebote();
       }else if(RB6) {
        nivel = 3;
        PORTA = 0;
        output_high(PIN_A2);     // Nivel 3 - > led amarillo encendido
        sale = true;
        antirebote();
       }else if(RB7) {
        nivel = 4;
        PORTA = 0;
        output_high(PIN_A3);     // Nivel 4 - > led azul encendido
        sale = true;
        antirebote();
       }else {
        sale = false;
       }
      }
   PORTA = 15;            // Una vez hemos escogido nivel,se encienden los 4 leds
   delay_ms(1000);        //  para indicar que podemos empezar a jugar
   PORTA = 0;
   delay_ms(500);
   }


void has_fallado(int tono)     // Si entramos aquí es que hemos pulsado incorrectamente
   {
   int i,j;
   enciende_led(color_pulsado);
   for(i=0; i<=100; i++)          // Generamos tono de error (más grave)
     {
     for(j=0; j<=4; j++)
       {
       output_high(PIN_B3);
       delay_ms(1*(6-tono));
       output_low(PIN_B3);
       delay_ms(1*(6-tono));
       }
     }
   delay_ms(1000);
   }


void muestra_colores()
   {
// Desde el primero hasta el último que se ha guardado en memoria,los vamos mostrando
//  con una rapidez que vendrá determinada por el nivel de dificultad elegido al principio.
   for(dir_lectura = 0; dir_lectura < dir_escritura; dir_lectura++)
      {
      color_leido = read_eeprom(dir_lectura);   // Lectura eeprom
      enciende_led(color_leido);                // Enciende led correspondiente
      altavoz(color_leido);                     // Emite tono
      retardo(nivel);                           // Retardo según nivel de dificultad
      PORTA = 0;                                // Apaga led
      retardo(nivel);                           // Retardo según nivel de dificultad
      }
   }


void pulsa_secuencia()
   {
   short sal;
   dir_lectura = 0;
   aleatorio = 1;
// Recogemos las pulsaciones y se va comprobando si son correctas hasta que
//  alguna no lo sea o hasta que hayamos acertado todos los colores guardados
//  hasta el momento.
// dir_escritura contiene la dirección eeprom siguiente al último color guardado
//  y dir_lectura la usamos para ir consultando cada posición de memoria y comprobar
//  si la pulsación ha sido correcta.En el momento en que fallemos alguna,fin_juego toma
//  el valor TRUE.
// Durante la ejecución del bucle,aleatorio irá cambiando de valor,hasta que pulsemos el
//  último color,momento en el cual salimos del bucle y guardamos aleatorio en memoria.
   while((dir_lectura < dir_escritura) && (!fin_juego))
      {
      sal = false;
      while(!sal)  // Mientras no haya pulsación nos mantenemos dentro del bucle
         {
         genera_aleatorio();           // Para conseguir aleatoriedad en los colores guardados
         if(input(PIN_B4))             // Se ha pulsado el rojo,salimos del bucle
          {
          color_pulsado = 1;
          sal = true;
          }else if(input(PIN_B5)) {    // Se ha pulsado el verde,salimos del bucle
          color_pulsado = 2;
          sal = true;
          }else if(input(PIN_B6)) {    // Se ha pulsado el amarillo,salimos del bucle
          color_pulsado = 3;
          sal = true;
          }else if(input(PIN_B7)) {    // Se ha pulsado el azul,salimos del bucle
          color_pulsado = 4;
          sal = true;
          }else {                      // No se ha pulsado ninguno,continuamos
          sal = false;                 //  dentro del bucle
          }
         }
      comprueba();   // Algoritmo que comprueba si la pulsación ha sido correcta
      enciende_led(color_pulsado);  // Enciende el led del color que hemos pulsado
      altavoz(color_pulsado);       // Genera el tono del color que hemos pulsado
      antirebote();                 // No comment
      PORTA = 0;                    // Apagamos led
      dir_lectura++;                // Para comprobar la siguiente dirección eeprom
      }
   }


/*********************
* PROGRAMA PRINCIPAL *
**********************/


void main()
   {
// Inicialización periféricos
   set_tris_B(0b11110000);    // RB4,RB5,RB6 y RB7 entradas --- RB0,RB1,RB2 Y RB3 salidas
   set_tris_A(0b00000000);    // Todo salidas
   output_low(PIN_B0);               // RB0 no la usamos
   output_low(PIN_B1);               // RB1 no la usamos
   output_low(PIN_B2);               // RB2 no la usamos
   output_low(PIN_B3);               // RB3 conectado al altavoz
   INTCON=0;
   enable_interrupts(INT_EEPROM); // Unica interrupción habilitada durante toda la ejecución
   enable_interrupts(GLOBAL);     // Habilitador general de interrupciones

// Bucle principal (Se ejecuta de forma indefinida)
   for(;Giño
     {
     dir_escritura = dir_lectura = color_leido = leido = color_pulsado = 0;  // Inicializamos variables
     fin_juego = false;
     aleatorio = 1;
     escoge_nivel();          // Para escoger entre 4 niveles de dificultad
     guarda_color();          // Guardamos en en memoria el valor que tenga aleatorio
     while(!fin_juego)
        {
        muestra_colores();       // Mostramos colores guardados hasta el momento
        pulsa_secuencia();       // Recogemos pulsaciones
        guarda_color();          // Guardamos color en memoria el valor de aleatorio
        if(!fin_juego)        // Cada vez que acertamos una secuencia completa,encendemos
         {                    //  los 4 leds y generamos tres tonos musicales
         enciende_led(5);     //
         altavoz(1);          //
         altavoz(2);          //
         altavoz(4);          //
         PORTA = 0;           //
         delay_ms(1000);      //
         }                  
        }
     has_fallado(4);     // Si hemos salido del bucle anterior es porque hemos fallado,de
     }                   //  aquí volvemos al principio del bucle principal.
   }


haber si alguien me puede ayudar

Adios!

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
RE: Juego de simon by BIOT
« Respuesta #1 en: 07 de Abril de 2005, 05:01:00 »
este código es para CCS... comenta que errores te da al intentar compilar

saludos!

Desconectado Diego_arrow

  • PIC10
  • *
  • Mensajes: 29
RE: Juego de simon by BIOT
« Respuesta #2 en: 07 de Abril de 2005, 15:36:00 »
Hola:

Ningun problema, era una tonteria, pero bueno espero que me perdoneis ya que acabo de empezar en esto hace un mes y la unica referencia que tenia era del mplab y el ensamblador,   de lenguaje c nidea, pero bueno ahora que ya consigo crear los archivos en HEX ya no tengo ningun problema con picc compiler  

gracias a todos igualmente

Unsaludo!

Desconectado ArielVaskinelis

  • PIC10
  • *
  • Mensajes: 1
Re:Juego de simon by BIOT
« Respuesta #3 en: 20 de Octubre de 2015, 16:19:34 »
Hola, yo tengo que programar el juego con XC8 MPLAB X en el PIC16F84A pero no tengo mucha idea, si me podrías ayudar, estaría genial! Si queres te paso mi código, así podes ver cómo lo estoy programando al juego


 

anything