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
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.