Вы находитесь на странице: 1из 5

001.#include <16f887.

h>
002.#use delay (clock=1000000)
003.#include <lcd.c>
004.
005./* variables */
006.
007.int contadorBoton = 0;
008.int estadoBotonIzq = 1;
009.int estadoBotonDer = 1;
010.int estadoBotonSelect = 1;
011.int estadoBotonCancelar = 1;
012.int estadoPrevioBotonIzq = 0;
013.int estadoPrevioBotonDer = 0;
014.int estadoPrevioBotonSelect = 0;
015.int estadoPrevioBotonCancelar = 0;
016.int minutos;
017.int segundos = 0;
018.
019.void inicioLCD () {
020.printf(lcd_putc,"Bienvenidos al..");
021.delay_ms (2000);
022.printf(lcd_putc,"\f");
023.lcd_gotoxy(3,1);
024.printf(lcd_putc,"TEGduino v.1");
025.lcd_gotoxy(2,2);
026.printf(lcd_putc,"ingenegros.com");
027.delay_ms (3000);
028.}
029.
030.void tiempo_decreciente() {
031.segundos--;
// cuenta regresiva
032.if (segundos == -1) {
// si los segundos se
terminaron
033.segundos = 59;
// resetear segundos
034.minutos--;
// decrecen los minutos
035.if (minutos == -1){
// nos fijamos si se terminaron
los minutos
036.minutos = contadorBoton;
// reseteamos los minutos
037.segundos = 0;
038.}
039.}
040.}
041.
042.void minutoLCD () {
043.label:
044.lcd_putc("\f");
045.printf(lcd_putc,"Tiempo de cada");
046.lcd_gotoxy(1,2);
047.printf(lcd_putc,"turno = ");
048.
049.while(1) {
050.estadoBotonIzq = input(PIN_B0);
051.estadoBotonDer = input(PIN_B1);

052.estadoBotonSelect = input(PIN_B2);
053.
054.if (estadoBotonIzq != estadoPrevioBotonIzq) {
055.if (estadoBotonIzq == 0) {
056.contadorBoton++;
057.}
058.estadoPrevioBotonIzq = estadoBotonIzq;
059.}
060.if (estadoBotonDer != estadoPrevioBotonDer) {
061.if (estadoBotonDer == 0) {
062.contadorBoton--;
063.}
064.estadoPrevioBotonDer = estadoBotonDer;
065.}
066.
067.if (contadorBoton < 10) {
068.lcd_gotoxy(9,2);
069.}
070.else {
071.lcd_gotoxy(8,2);
072.}
073.
074.if (contadorBoton == -1) {
075.contadorBoton = 0;
076.lcd_gotoxy(9,2);
077.}
078.
079.printf(lcd_putc," %i ",contadorBoton);
080.printf(lcd_putc,"mins");
081.
082.if (estadoBotonSelect != estadoPrevioBotonSelect) {
083.if (estadoBotonSelect == 0) {
084.minutos = contadorBoton;
085.break;
086.}
087.estadoPrevioBotonSelect = estadoBotonSelect;
088.}
089.
090.delay_ms(100);
091.}
092.
093.lcd_putc("\f");
094.printf(lcd_putc,"Desea elegir el");
095.lcd_gotoxy(1,2);
096.printf(lcd_putc,"anterior valor?");
097.delay_ms(1000);
098.
099.while(1) {
100.estadoBotonSelect = input(PIN_B2);
101.
102.if (estadoBotonSelect != estadoPrevioBotonSelect) {
103.if (estadoBotonSelect == 0) {
104.lcd_putc("\f");
105.printf(lcd_putc,"El valor fue \n seleccionado!");
106.delay_ms(1000);

107.
108.finturno:
109.if (minutos == 0 & segundos == 0) {
110.output_high(PIN_B5);
111.lcd_putc("\f");
112.printf(lcd_putc,"Proximo turno...");
113.lcd_gotoxy(1,2);
114.printf(lcd_putc,"Preparense!");
115.delay_ms(2000);
116.output_low(PIN_B5);
117.}
118.
119.lcd_putc("\f");
120.printf(lcd_putc,"Tiempo restante:");
121.
122.lcd_gotoxy(4,2);
123.lcd_putc("mins y");
124.lcd_gotoxy(14,2);
125.lcd_putc("seg");
126.
127.while(1) {
128.estadoBotonCancelar = input(PIN_B3);
129.estadoBotonSelect = input(PIN_B2);
130.
131.output_low(PIN_B4);
132.
133.tiempo_decreciente();
134.
135.if (minutos == 1) {
136.if (segundos == 0) output_HIGH(PIN_B4);
137.}
138.
139.if (minutos == 0) {
140.if (segundos == 30) output_HIGH(PIN_B4);
141.if (segundos == 10) output_HIGH(PIN_B4);
142.if (segundos == 5) output_HIGH(PIN_B4);
143.if (segundos == 0) goto finturno;
144.}
145.
146.if (minutos < 10) lcd_gotoxy(2,2);
147.else {
148.lcd_gotoxy(1,2);
149.}
150.printf(lcd_putc,"%i ",minutos);
151.lcd_gotoxy(11,2);
152.printf(lcd_putc,"%i ",segundos);
153.
154.if (estadoBotonSelect != estadoPrevioBotonSelect) {
155.if (estadoBotonSelect == 0) {
156.minutos = contadorBoton;
157.segundos = 0;
158.output_high(PIN_B5);
159.lcd_putc("\f");
160.printf(lcd_putc,"Proximo turno...");

161.lcd_gotoxy(1,2);
162.printf(lcd_putc,"Preparense!");
163.delay_ms(2000);
164.output_low(PIN_B5);
165.goto finturno;
166.}
167.}
168.
169.if (estadoBotonCancelar != estadoPrevioBotonCancelar) {
170.if (estadoBotonCancelar == 0) {
171.segundos = 0;
172.lcd_putc("\f");
173.printf(lcd_putc,"El valor fue \n cancelado!");
174.delay_ms(1000);
175.goto label;
176.}
177.}
178.estadoPrevioBotonCancelar = estadoBotonCancelar;
179.delay_ms(100);
180.}
181.}
182.}
183.estadoPrevioBotonSelect = estadoBotonSelect;
184.
185.}
186.}
187.
188.void main() {
189.
190.lcd_init();
191.inicioLCD();
192.minutoLCD();

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 dems 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:

Alimentacin mediante pilas AA


Botones ON/OFF y posibilidad de entrar en "Sleep Mode" luego de XX min
(prximamente)
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 simulacin:

Вам также может понравиться