Contador de dos dígitos LED, multiplexión

Contador de dos dígitos LED, multiplexión

En este ejemplo el microcontrolador funciona como un contador de dos dígitos. La variable i se incrementa (suficiente lentamente para ser visible) y su valor se visualiza en un visualizador de dos dígitos LED (99-0). El punto es habilitar una conversión de un número binario en un decimal y partirlo en dos dígitos (en decenas y unidades). Como los segmentos del visualizador LED se conectan en paralelo, es necesario asegurar que alternen rápidamente para tener una impresión de que emiten la luz simultáneamente (multiplexión por división en tiempo).
En este ejemplo, el temporizador TMR0 está encargado de la multiplexión por división en tiempo, mientras que la función mask convierte un número binario a formato decimal.
Ejemplo 9
/*Cabecera******************************************************/

unsigned short mask(unsigned short num);
unsigned short digit_no, digit10, digit1, digit, i;

void interrupt() {
  if (digit_no == 0) {
    PORTA = 0;       // Apagar ambos visualizadores
    PORTD = digit1;  // Colocar máscara para visualizar unidades en el
 
    // puerto PORTD
    PORTA = 1;       // Encender el visualizador para las unidades (LSD)
    digit_no = 1;
  }else{
    PORTA = 0;       // Apagar ambos visualizadores
    PORTD = digit10; // Colocar máscara para visualizar decenas en el
 
    // puerto PORTD
    PORTA = 2;       // Encender el visualizador para las decenas (MSD)
    digit_no = 0;
  }
  
  TMR0 = 0;          // Reiniciar el contador TMRO
  INTCON = 0x20;     // Bit T0IF=0, T0IE=1
}

void main() {
  OPTION_REG = 0x80; // Ajustar el temporizador TMR0
  TMR0 = 0;
  INTCON = 0xA0;     // Deshabilitar las interrupciones PEIE,INTE,RBIE,T0IE
  PORTA = 0;         // Apagar ambos visualizadores
  TRISA = 0;         // Todos los pines del puerto PORTA se configuran
  
  // como salidas
  PORTD = 0;         // Apagar todos los segmentos del visualizador
  TRISD = 0;         // Todos los pines del puerto PORTD se configuran
  
  // como salidas
  do {
    for (i = 0; i<=99; i++) { // Contar de 0 a 99
      digit = i % 10u;
      digit1 = mask(digit);   // Preparar la máscara para visualizar unidades
      digit = (char)(i / 10u) % 10u;
      digit10 = mask(digit);  // Preparar la máscara para visualizar decenas
      Delay_ms(1000);
    }
  } while (1);                // Bucle infinito
}
mask.c
/*Cabecera******************************************************/

unsigned short mask(unsigned short num) {
  switch (num) {
    case 0 : return 0x3F;
    case 1 : return 0x06;
    case 2 : return 0x5B;
    case 3 : return 0x4F;
    case 4 : return 0x66;
    case 5 : return 0x6D;
    case 6 : return 0x7D;
    case 7 : return 0x07;
    case 8 : return 0x7F;
    case 9 : return 0x6F;
  }
}
Para que este ejemplo funcione apropiadamente, es necesario incluir el archivo mask.c en el proyecto (aparte del archivo example9.c) en la ventana Project Manager antes de compilar el programa:
Example9.mcppi - Sources - Add File To Project
  • mask.c
  • example9.c

No response to “Contador de dos dígitos LED, multiplexión”