Contador PIC (16F887) para Juegos de Mesa
Escrito por Nico | 02 de Octubre de 2009   

Seguramente te haya pasado algun dia de estar jugando un juego de mesa (como el TEG o el Monopoly) donde siempre te robaban tiempo y demoraban los demás jugadores mientras uno se apuraba para terminar a tiempo, bueno... NO MAS! :P

Este simple proyecto puede servir como punto de partido en el uso de PICs. El proyecto tendrá las siguientes opciones:

  • Alimentación mediante pilas AA
  • Botones ON/OFF y posibilidad de entrar en "Sleep Mode" luego de XX min (próximamente)
  • Uso de display LCD de 16x2 con un menu donde se podrá elegir el tiempo del turno y luego una cuenta regresivo del mismo
  • Un parlante/led que nos avisará cuando el turno este llegando a su fin y comience el proximo

TEG - PIC 16F887 Contador turnos

Software utilizado:

CCS 

Proteus

Hardware utilizado:

LCD 16x2 (~9 U$D en Argentina)

PIC 16F887 (~4 U$D en Argentina)


Video de la simulación:



Codigo:

 
#include <16f887.h>
#use delay (clock=1000000)
#include <lcd.c> 

/* variables */

int contadorBoton = 0;
int estadoBotonIzq = 1;
int estadoBotonDer = 1;
int estadoBotonSelect = 1;
int estadoBotonCancelar = 1;
int estadoPrevioBotonIzq = 0;
int estadoPrevioBotonDer = 0;
int estadoPrevioBotonSelect = 0;
int estadoPrevioBotonCancelar = 0;
int minutos;
int segundos = 0;

void inicioLCD () {
   printf(lcd_putc,"Bienvenidos al..");
   delay_ms (2000);
   printf(lcd_putc,"\f");
   lcd_gotoxy(3,1);
   printf(lcd_putc,"TEGduino v.1");
   lcd_gotoxy(2,2);
   printf(lcd_putc,"ingenegros.com");
   delay_ms (3000);
}

void tiempo_decreciente() {
  segundos--;                          // cuenta regresiva
  if (segundos == -1) {                   // si los segundos se terminaron
    segundos = 59;                     // resetear segundos
    minutos--;                         // decrecen los minutos
    if (minutos == -1){                  // nos fijamos si se terminaron los minutos
      minutos = contadorBoton;                    // reseteamos los minutos
      segundos = 0;
    }
  }
 }
   
void minutoLCD () {
   label:
   lcd_putc("\f");
   printf(lcd_putc,"Tiempo de cada");
   lcd_gotoxy(1,2);
   printf(lcd_putc,"turno = ");
   
   while(1) {
   estadoBotonIzq = input(PIN_B0);
   estadoBotonDer = input(PIN_B1);
   estadoBotonSelect = input(PIN_B2);
   
   if (estadoBotonIzq != estadoPrevioBotonIzq) {
         if (estadoBotonIzq == 0) {
            contadorBoton++;
      }
      estadoPrevioBotonIzq = estadoBotonIzq;
      }
      if (estadoBotonDer != estadoPrevioBotonDer) {
         if (estadoBotonDer == 0) {
            contadorBoton--;
         }
         estadoPrevioBotonDer = estadoBotonDer;
      }
   
   if (contadorBoton < 10) {
      lcd_gotoxy(9,2);
      }
   else {
      lcd_gotoxy(8,2);
   }
   
   if (contadorBoton == -1) {
      contadorBoton = 0;
      lcd_gotoxy(9,2);
   }
   
   printf(lcd_putc," %i ",contadorBoton);
   printf(lcd_putc,"mins");

   if (estadoBotonSelect != estadoPrevioBotonSelect) {
      if (estadoBotonSelect == 0) {
         minutos = contadorBoton;
         break;
      }
      estadoPrevioBotonSelect = estadoBotonSelect;
   }
   
   delay_ms(100);
   }
   
   lcd_putc("\f");
   printf(lcd_putc,"Desea elegir el");
   lcd_gotoxy(1,2);
   printf(lcd_putc,"anterior valor?");
   delay_ms(1000);
   
   while(1) {
   estadoBotonSelect = input(PIN_B2);  
   
   if (estadoBotonSelect != estadoPrevioBotonSelect) {
      if (estadoBotonSelect == 0) {
         lcd_putc("\f");
         printf(lcd_putc,"El valor fue \n seleccionado!");
         delay_ms(1000);
         
         finturno:
         if (minutos == 0 & segundos == 0) {
            output_high(PIN_B5);
            lcd_putc("\f");
            printf(lcd_putc,"Proximo turno...");
            lcd_gotoxy(1,2);
            printf(lcd_putc,"Preparense!");
            delay_ms(2000);
            output_low(PIN_B5);
         }    
         
         lcd_putc("\f");
         printf(lcd_putc,"Tiempo restante:");
         
         lcd_gotoxy(4,2);
         lcd_putc("mins y");
         lcd_gotoxy(14,2);
         lcd_putc("seg");
                  
         while(1) {
         estadoBotonCancelar = input(PIN_B3);
         estadoBotonSelect = input(PIN_B2);
         
         output_low(PIN_B4);
         
         tiempo_decreciente();
         
         if (minutos == 1) {
            if (segundos == 0) output_HIGH(PIN_B4);
         }
         
         if (minutos == 0) {
            if (segundos == 30) output_HIGH(PIN_B4);
            if (segundos == 10) output_HIGH(PIN_B4);
            if (segundos == 5) output_HIGH(PIN_B4);
            if (segundos == 0) goto finturno;
         }
              
         if (minutos < 10) lcd_gotoxy(2,2);
         else {
         lcd_gotoxy(1,2);
         }
         printf(lcd_putc,"%i ",minutos);
         lcd_gotoxy(11,2);
         printf(lcd_putc,"%i ",segundos);
         
         if (estadoBotonSelect != estadoPrevioBotonSelect) {
            if (estadoBotonSelect == 0) {
               minutos = contadorBoton;
               segundos = 0;
               output_high(PIN_B5);
               lcd_putc("\f");
               printf(lcd_putc,"Proximo turno...");
               lcd_gotoxy(1,2);
               printf(lcd_putc,"Preparense!");
               delay_ms(2000);
               output_low(PIN_B5);
               goto finturno;
            }
         }
         
         if (estadoBotonCancelar != estadoPrevioBotonCancelar) {
            if (estadoBotonCancelar == 0) {
               segundos = 0;
               lcd_putc("\f");
               printf(lcd_putc,"El valor fue \n cancelado!");
               delay_ms(1000);
               goto label;
            }
         }
         estadoPrevioBotonCancelar = estadoBotonCancelar;
         delay_ms(100);
         }
      }
   }
   estadoPrevioBotonSelect = estadoBotonSelect;

         }
   }
   
void main() {

   lcd_init();
   inicioLCD();
   minutoLCD();
 
}

 

Espero que les sirva, y recuerden comentar! :P

Saludos! Nico.

Comentarios
¡Sólo los usuarios registrados pueden escribir comentarios!
Anónimo |2009-10-08 16:22:56
Es pec ta cu laaaaar!!!! Muy muy bueno!

!joomlacomment 4.0 Copyright (C) 2009 Compojoom.com . All rights reserved."