PARA EL SISTEMA ES CAKLSDCJNJJJJJJJJJJJJJJJJJJCNCNKASMCKASMCKLASMCMKLSCMKASLCMKLJNVBLF
CSSDC
SDCSDC
SDCSD
CSD
CSD
// CONFIG
#pragma config FOSC = XT // Oscillator Selection bits (XT oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
#include <xc.h>
#define _XTAL_FREQ 20000000 // Frecuencia del oscilador (20MHz)
// Definici�n de pines
#define PIN_ENTRADA RB0 // Pin de entrada para los flancos de subida
#define PIN_PROGRAMAR RB1 // Pin de entrada para el bot�n de programaci�n
#define PIN_INICIAR RB2 // Pin de entrada para el bot�n de inicio
#define PIN_MOTOR RB3 // Pin de salida para el motor
// Mapear los segmentos del display de 7 segmentos
const char mapa_segmentos[10] = {
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01101111 // 9
};
// Variables globales
unsigned char contador = 0; // Contador de flancos de subida
unsigned char numero_programado = 0; // N�mero de flancos programado
void mostrar_digito(unsigned char digito, unsigned char display) {
if (display == 0) {
PORTD = mapa_segmentos[digito % 10]; // Mostrar d�gito en el primer display
} else if (display == 1) {
PORTC = mapa_segmentos[digito / 10]; // Mostrar d�gito en el segundo display
}
}
void main(void) {
// Configuraci�n de pines
TRISB0 = 1; // Configurar RB0 como entrada
TRISB1 = 1; // Configurar RB1 como entrada
TRISB2 = 1; // Configurar RB2 como entrada
TRISB3 = 0; // Configurar RB3 como salida
TRISD = 0; // Configurar PORTD como salida para el primer display
TRISC = 0; // Configurar PORTC como salida para el segundo display
PORTD = mapa_segmentos[0]; // Inicializar primer display con 0
PORTC = mapa_segmentos[0]; // Inicializar segundo display con 0
PORTBbits.RB3 = 0; // Inicializar el motor apagado
unsigned char estado_programar_anterior = 0; // Estado anterior del pin de programaci�n
unsigned char estado_programar_actual;
unsigned char estado_iniciar_anterior = 0; // Estado anterior del pin de inicio
unsigned char estado_iniciar_actual;
unsigned char estado_entrada_anterior = 0; // Estado anterior del pin de entrada
unsigned char estado_entrada_actual;
unsigned char modo_programacion = 1; // Variable para determinar el modo (1: programacion, 0: conteo)
while(1) {
if (modo_programacion) {
// Modo de programaci�n
estado_programar_actual = PORTBbits.RB1;
// Detectar flanco de subida en el bot�n de programaci�n
if (estado_programar_actual == 1 && estado_programar_anterior == 0) {
__delay_ms(50); // Retardo para debounce
if (PORTBbits.RB1 == 1) { // Confirmar el flanco de subida
numero_programado = (numero_programado + 1) % 100; // Incrementar n�mero programado
mostrar_digito(numero_programado, 0); // Mostrar unidades en el primer display
mostrar_digito(numero_programado, 1); // Mostrar decenas en el segundo display
}
}
estado_programar_anterior = estado_programar_actual;
// Detectar flanco de subida en el bot�n de inicio
estado_iniciar_actual = PORTBbits.RB2;
if (estado_iniciar_actual == 1 && estado_iniciar_anterior == 0) {
__delay_ms(50); // Retardo para debounce
if (PORTBbits.RB2 == 1) { // Confirmar el flanco de subida
contador = 0; // Reiniciar contador
PORTBbits.RB3 = 1; // Encender el motor
modo_programacion = 0; // Cambiar a modo de conteo
}
}
estado_iniciar_anterior = estado_iniciar_actual;
} else {
// Modo de conteo
estado_entrada_actual = PORTBbits.RB0;
// Detectar flanco de subida en la entrada
if (estado_entrada_actual == 1 && estado_entrada_anterior == 0) {
__delay_ms(50); // Retardo para debounce
if (PORTBbits.RB0 == 1) { // Confirmar el flanco de subida
contador++;
mostrar_digito(contador, 0); // Mostrar unidades en el primer display
mostrar_digito(contador, 1); // Mostrar decenas en el segundo display
}
}
estado_entrada_anterior = estado_entrada_actual;
if (contador >= numero_programado) {
PORTBbits.RB3 = 0; // Apagar el motor
modo_programacion = 1; // Volver al modo de programaci�n
contador = 0; // Reiniciar contador
}
}
}
}