// Temporizador con PIC16F877A - MPLAB X + XC8 #include <xc.h> // CONFIGURACIÓN DEL PIC #pragma config FOSC = XT // Oscilador XT #pragma config WDTE = OFF // Watchdog Timer Desactivado #pragma config PWRTE = OFF // Power-up Timer Desactivado #pragma config BOREN = ON // Brown-out Reset Activado #pragma config LVP = OFF // Low Voltage Programming Desactivado #pragma config CPD = OFF // Protección EEPROM Desactivada #pragma config WRT = OFF // Escritura en Flash Desactivada #pragma config CP = OFF // Protección del Código Desactivada #define _XTAL_FREQ 4000000 // Frecuencia del cristal de 4MHz // Definición de pines para los botones y LEDs #define BTN_MIN RB0 #define BTN_SEC RB1 #define BTN_START RB2 #define BTN_RESET RB3 #define LED_ALERT RB4 #define LED_RUNNING RB5 // Definición de pines para la multiplexación del display #define DIGIT1 RC0 #define DIGIT2 RC1 #define DIGIT3 RC2 #define DIGIT4 RC3 // Variables globales unsigned char minutos = 0, segundos = 0; bit running = 0; // Estado del temporizador // Tabla de segmentos para números 0-9 (para display de cátodo común) const unsigned char tabla7Seg[] = { 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F }; // Prototipos de funciones void mostrarTiempo(); void multiplexarDisplay(unsigned char dig1, unsigned char dig2, unsigned char dig3, unsigned char dig4); void delayAntirrebote(); void main() { // Configuración de pines TRISB = 0x0F; // RB0-RB3 como entradas, RB4-RB5 como salidas TRISD = 0x00; // Puerto D como salida para los segmentos del display TRISC = 0xF0; // RC0-RC3 como salidas (control de dígitos) PORTD = 0x00; PORTC = 0x00; LED_ALERT = 0; LED_RUNNING = 0; while(1) { // Ajuste del tiempo con botones if (BTN_MIN) { minutos = (minutos + 1) % 60; mostrarTiempo(); delayAntirrebote(); } if (BTN_SEC) { segundos = (segundos + 10) % 60; mostrarTiempo(); delayAntirrebote(); } if (BTN_START) { running = !running; delayAntirrebote(); } if (BTN_RESET) { minutos = 0; segundos = 0; running = 0; LED_ALERT = 0; LED_RUNNING = 0; mostrarTiempo(); delayAntirrebote(); } // Lógica del temporizador if (running) { __delay_ms(1000); // Simula 1 segundo LED_RUNNING = !LED_RUNNING; // Parpadeo del LED de estado if (segundos > 0) { segundos--; } else if (minutos > 0) { minutos--; segundos = 59; } else { running = 0; LED_ALERT = 1; LED_RUNNING = 0; } // Enciende LED de alerta mostrarTiempo(); } } } // Función para actualizar el display de 7 segmentos void mostrarTiempo() { unsigned char minDec = minutos / 10; unsigned char minUni = minutos % 10; unsigned char secDec = segundos / 10; unsigned char secUni = segundos % 10; multiplexarDisplay(minDec, minUni, secDec, secUni); } // Función para multiplexar el display de 7 segmentos void multiplexarDisplay(unsigned char dig1, unsigned char dig2, unsigned char dig3, unsigned char dig4) { // Mostrar primer dígito (decenas de minutos) DIGIT1 = 1; PORTD = tabla7Seg[dig1]; __delay_ms(5); DIGIT1 = 0; // Mostrar segundo dígito (unidades de minutos) DIGIT2 = 1; PORTD = tabla7Seg[dig2]; __delay_ms(5); DIGIT2 = 0; // Mostrar tercer dígito (decenas de segundos) DIGIT3 = 1; PORTD = tabla7Seg[dig3]; __delay_ms(5); DIGIT3 = 0; // Mostrar cuarto dígito (unidades de segundos) DIGIT4 = 1; PORTD = tabla7Seg[dig4]; __delay_ms(5); DIGIT4 = 0; } // Función para evitar rebotes en botones void delayAntirrebote() { __delay_ms(200); }
Standard input is empty
// Temporizador con PIC16F877A - MPLAB X + XC8 #include <xc.h> // CONFIGURACIÓN DEL PIC #pragma config FOSC = XT // Oscilador XT #pragma config WDTE = OFF // Watchdog Timer Desactivado #pragma config PWRTE = OFF // Power-up Timer Desactivado #pragma config BOREN = ON // Brown-out Reset Activado #pragma config LVP = OFF // Low Voltage Programming Desactivado #pragma config CPD = OFF // Protección EEPROM Desactivada #pragma config WRT = OFF // Escritura en Flash Desactivada #pragma config CP = OFF // Protección del Código Desactivada #define _XTAL_FREQ 4000000 // Frecuencia del cristal de 4MHz // Definición de pines para los botones y LEDs #define BTN_MIN RB0 #define BTN_SEC RB1 #define BTN_START RB2 #define BTN_RESET RB3 #define LED_ALERT RB4 #define LED_RUNNING RB5 // Definición de pines para la multiplexación del display #define DIGIT1 RC0 #define DIGIT2 RC1 #define DIGIT3 RC2 #define DIGIT4 RC3 // Variables globales unsigned char minutos = 0, segundos = 0; bit running = 0; // Estado del temporizador // Tabla de segmentos para números 0-9 (para display de cátodo común) const unsigned char tabla7Seg[] = { 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F }; // Prototipos de funciones void mostrarTiempo(); void multiplexarDisplay(unsigned char dig1, unsigned char dig2, unsigned char dig3, unsigned char dig4); void delayAntirrebote(); void main() { // Configuración de pines TRISB = 0x0F; // RB0-RB3 como entradas, RB4-RB5 como salidas TRISD = 0x00; // Puerto D como salida para los segmentos del display TRISC = 0xF0; // RC0-RC3 como salidas (control de dígitos) PORTD = 0x00; PORTC = 0x00; LED_ALERT = 0; LED_RUNNING = 0; while(1) { // Ajuste del tiempo con botones if (BTN_MIN) { minutos = (minutos + 1) % 60; mostrarTiempo(); delayAntirrebote(); } if (BTN_SEC) { segundos = (segundos + 10) % 60; mostrarTiempo(); delayAntirrebote(); } if (BTN_START) { running = !running; delayAntirrebote(); } if (BTN_RESET) { minutos = 0; segundos = 0; running = 0; LED_ALERT = 0; LED_RUNNING = 0; mostrarTiempo(); delayAntirrebote(); } // Lógica del temporizador if (running) { __delay_ms(1000); // Simula 1 segundo LED_RUNNING = !LED_RUNNING; // Parpadeo del LED de estado if (segundos > 0) { segundos--; } else if (minutos > 0) { minutos--; segundos = 59; } else { running = 0; LED_ALERT = 1; LED_RUNNING = 0; } // Enciende LED de alerta mostrarTiempo(); } } } // Función para actualizar el display de 7 segmentos void mostrarTiempo() { unsigned char minDec = minutos / 10; unsigned char minUni = minutos % 10; unsigned char secDec = segundos / 10; unsigned char secUni = segundos % 10; multiplexarDisplay(minDec, minUni, secDec, secUni); } // Función para multiplexar el display de 7 segmentos void multiplexarDisplay(unsigned char dig1, unsigned char dig2, unsigned char dig3, unsigned char dig4) { // Mostrar primer dígito (decenas de minutos) DIGIT1 = 1; PORTD = tabla7Seg[dig1]; __delay_ms(5); DIGIT1 = 0; // Mostrar segundo dígito (unidades de minutos) DIGIT2 = 1; PORTD = tabla7Seg[dig2]; __delay_ms(5); DIGIT2 = 0; // Mostrar tercer dígito (decenas de segundos) DIGIT3 = 1; PORTD = tabla7Seg[dig3]; __delay_ms(5); DIGIT3 = 0; // Mostrar cuarto dígito (unidades de segundos) DIGIT4 = 1; PORTD = tabla7Seg[dig4]; __delay_ms(5); DIGIT4 = 0; } // Función para evitar rebotes en botones void delayAntirrebote() { __delay_ms(200); }