PROYECTO 1
INTRUDICCION: El proyecto consiste en una alcancía electrónica diseñada utilizando el
microcontrolador PIC16F887 y una pantalla LCD. El sistema tiene como propósito fomentar el
hábito del ahorro, mostrando un conteo regresivo cada vez que se inserta una moneda (simulada
por un fin de carrera ). Al llegar a cero o detectar la moneda, se muestra un mensaje de éxito. El
diseño incluye varios componentes, como un cristal de 20 MHz, un botón de reinicio y un ajuste de
contraste.
Componentes Principales
Microcontrolador PIC16F887: Controla la lógica del sistema.
Pantalla LCD de 16x2: Muestra el estado del ahorro y mensajes de motivación.
Botón de carrera: Detecta la inserción de una moneda (o algún objeto que simule la acción).
Cristal de 20 MHz: Proporciona la frecuencia de reloj necesaria para el microcontrolador.
Botón de reinicio: Permite restablecer el sistema manualmente.
Control de contraste: Ajusta la visibilidad de la pantalla LCD
Descripción del Funcionamiento
El sistema inicia mostrando un mensaje de motivación para ahorrar. Un contador comienza en 10
y disminuye de uno en uno cada segundo, representando el tiempo para insertar una moneda.
Modo Normal: El sistema espera a que el botón de carrera detecte una moneda (o un objeto en su
camino). Cuando esto sucede, la pantalla LCD muestra un mensaje de felicitación y el contador se
reinicia automáticamente para permitir un nuevo ciclo.
Sin Moneda Detectada: Si el contador llega a cero sin que se haya detectado una moneda, el
sistema despliega un mensaje motivacional indicando que se debe seguir intentando ahorrar.
El uso del botón de reinicio permite restablecer el contador manualmente en caso de ser
necesario.
Diagrama de Flujo del Programa
1. Inicialización: El microcontrolador configura los puertos y la pantalla LCD.
2. Mostrar mensaje inicial: Se presenta el texto "Ahorrar en:" en la primera línea de la pantalla.
3. Contador regresivo: Se inicia un ciclo de cuenta regresiva desde 10 hasta 1, actualizando la
pantalla con el valor actual del contador.
4. Verificación del botón de carrera: En cada paso del ciclo, se revisa si el sensor infrarrojo ha
detectado un objeto.
Moneda detectada: Si el botón detecta una moneda, se muestra un mensaje de éxito y se reinicia
el contador.
Moneda no detectada: Si el contador llega a 0 y no se detectó una moneda, se muestra un
mensaje para seguir ahorrando.
5. Reinicio: El sistema reinicia el ciclo de forma automática después de mostrar los mensajes.
Código #include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <xc.h>
#include "lcd.h"
#pragma config FOSC = HS
#pragma config WDTE = OFF
#pragma config PWRTE = OFF
#pragma config MCLRE = ON
#pragma config CP = OFF
#pragma config CPD = OFF
#pragma config BOREN = OFF
#pragma config IESO = OFF
#pragma config FCMEN = OFF
#pragma config LVP = OFF
#pragma config DEBUG = OFF
#define _XTAL_FREQ 20000000
// Definir el pin donde está conectado el sensor infrarrojo
#define SENSOR_PIN PORTBbits.RB0 // Cambiar a PORTCbits para lectura correcto
int main(void)
// Configurar el puerto para el sensor
ANSELH = 0x00;
PORTB = 0x00;
TRISB = 0x01;
WPUB = 0x00;
OPTION_REG = 0xFF;
IOCB = 0x00;
TRISC |= (1 << 1); // Configurar RTRISCC1 como entrada
LCD lcd = { &PORTC, 2, 3, 4, 5, 6, 7 }; // PORT, RS, EN, D4, D5, D6, D7
LCD_Init(lcd);
while (1)
// Inicializar el contador
int contador = 10;
// Mostrar el conteo inicial
LCD_Clear();
LCD_Set_Cursor(0, 0);
LCD_putrs("Ahorrar en: ");
// Usar un ciclo for para contar de 10 a 1
for (; contador > 0; contador--)
LCD_Set_Cursor(1, 0);
LCD_putc(contador + '0'); // Convertir el número a carácter para mostrar
// Verificar si se detecta un obstáculo
if (SENSOR_PIN == 0) {
// Mostrar mensaje de ahorro
LCD_Clear();
LCD_Set_Cursor(0, 0);
LCD_putrs(" Haz ahorrado! ");
LCD_Set_Cursor(1, 0);
LCD_putrs(" Felicitaciones!
// Esperar un tiempo específico (por ejemplo, 500 ms)
__delay_ms(3000); // Esperar 1s
// Reiniciar el ciclo for
PORTCbits.RC1 = 1; // Simular que el obstáculo desapareció
contador = 10; // Reiniciar el contador
break; // Salir del for para volver a empezar el while
__delay_ms(1000); // Esperar 100 ms para permitir lecturas rápidas
// Si el ciclo for termina normalmente (contador llega a 0)
if (contador == 0) {
// Si no se detectó un obstáculo antes de llegar a 0
LCD_Clear();
LCD_Set_Cursor(0, 0);
LCD_putrs(" Ahorra! ");
LCD_Set_Cursor(1, 0);
LCD_putrs("Sigue intentando!");
__delay_ms(3000); // Esperar 1 segundo antes de reiniciar
return 0;
Conclusión: Este proyecto permite crear una alcancía electrónica sencilla que promueve el ahorro
mediante una interfaz amigable en una pantalla LCD y un sistema de detección de monedas
basado en un botón de carrera.