fork download
  1. // Temporizador con PIC16F877A - MPLAB X + XC8
  2. #include <xc.h>
  3.  
  4. // CONFIGURACIÓN DEL PIC
  5. #pragma config FOSC = XT // Oscilador XT
  6. #pragma config WDTE = OFF // Watchdog Timer Desactivado
  7. #pragma config PWRTE = OFF // Power-up Timer Desactivado
  8. #pragma config BOREN = ON // Brown-out Reset Activado
  9. #pragma config LVP = OFF // Low Voltage Programming Desactivado
  10. #pragma config CPD = OFF // Protección EEPROM Desactivada
  11. #pragma config WRT = OFF // Escritura en Flash Desactivada
  12. #pragma config CP = OFF // Protección del Código Desactivada
  13.  
  14. #define _XTAL_FREQ 4000000 // Frecuencia del cristal de 4MHz
  15.  
  16. // Definición de pines para los botones y LEDs
  17. #define BTN_MIN RB0
  18. #define BTN_SEC RB1
  19. #define BTN_START RB2
  20. #define BTN_RESET RB3
  21. #define LED_ALERT RB4
  22. #define LED_RUNNING RB5
  23.  
  24. // Definición de pines para la multiplexación del display
  25. #define DIGIT1 RC0
  26. #define DIGIT2 RC1
  27. #define DIGIT3 RC2
  28. #define DIGIT4 RC3
  29.  
  30. // Variables globales
  31. unsigned char minutos = 0, segundos = 0;
  32. bit running = 0; // Estado del temporizador
  33.  
  34. // Tabla de segmentos para números 0-9 (para display de cátodo común)
  35. const unsigned char tabla7Seg[] = {
  36. 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F
  37. };
  38.  
  39. // Prototipos de funciones
  40. void mostrarTiempo();
  41. void multiplexarDisplay(unsigned char dig1, unsigned char dig2, unsigned char dig3, unsigned char dig4);
  42. void delayAntirrebote();
  43.  
  44. void main() {
  45. // Configuración de pines
  46. TRISB = 0x0F; // RB0-RB3 como entradas, RB4-RB5 como salidas
  47. TRISD = 0x00; // Puerto D como salida para los segmentos del display
  48. TRISC = 0xF0; // RC0-RC3 como salidas (control de dígitos)
  49. PORTD = 0x00;
  50. PORTC = 0x00;
  51. LED_ALERT = 0;
  52. LED_RUNNING = 0;
  53.  
  54. while(1) {
  55. // Ajuste del tiempo con botones
  56. if (BTN_MIN) { minutos = (minutos + 1) % 60; mostrarTiempo(); delayAntirrebote(); }
  57. if (BTN_SEC) { segundos = (segundos + 10) % 60; mostrarTiempo(); delayAntirrebote(); }
  58. if (BTN_START) { running = !running; delayAntirrebote(); }
  59. if (BTN_RESET) { minutos = 0; segundos = 0; running = 0; LED_ALERT = 0; LED_RUNNING = 0; mostrarTiempo(); delayAntirrebote(); }
  60.  
  61. // Lógica del temporizador
  62. if (running) {
  63. __delay_ms(1000); // Simula 1 segundo
  64. LED_RUNNING = !LED_RUNNING; // Parpadeo del LED de estado
  65.  
  66. if (segundos > 0) { segundos--; }
  67. else if (minutos > 0) { minutos--; segundos = 59; }
  68. else { running = 0; LED_ALERT = 1; LED_RUNNING = 0; } // Enciende LED de alerta
  69. mostrarTiempo();
  70. }
  71. }
  72. }
  73.  
  74. // Función para actualizar el display de 7 segmentos
  75. void mostrarTiempo() {
  76. unsigned char minDec = minutos / 10;
  77. unsigned char minUni = minutos % 10;
  78. unsigned char secDec = segundos / 10;
  79. unsigned char secUni = segundos % 10;
  80.  
  81. multiplexarDisplay(minDec, minUni, secDec, secUni);
  82. }
  83.  
  84. // Función para multiplexar el display de 7 segmentos
  85. void multiplexarDisplay(unsigned char dig1, unsigned char dig2, unsigned char dig3, unsigned char dig4) {
  86. // Mostrar primer dígito (decenas de minutos)
  87. DIGIT1 = 1;
  88. PORTD = tabla7Seg[dig1];
  89. __delay_ms(5);
  90. DIGIT1 = 0;
  91.  
  92. // Mostrar segundo dígito (unidades de minutos)
  93. DIGIT2 = 1;
  94. PORTD = tabla7Seg[dig2];
  95. __delay_ms(5);
  96. DIGIT2 = 0;
  97.  
  98. // Mostrar tercer dígito (decenas de segundos)
  99. DIGIT3 = 1;
  100. PORTD = tabla7Seg[dig3];
  101. __delay_ms(5);
  102. DIGIT3 = 0;
  103.  
  104. // Mostrar cuarto dígito (unidades de segundos)
  105. DIGIT4 = 1;
  106. PORTD = tabla7Seg[dig4];
  107. __delay_ms(5);
  108. DIGIT4 = 0;
  109. }
  110.  
  111. // Función para evitar rebotes en botones
  112. void delayAntirrebote() {
  113. __delay_ms(200);
  114. }
  115.  
Success #stdin #stdout 0.03s 25988KB
stdin
Standard input is empty
stdout
// 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);
}