Max7219 driver para display 7 segmentos

publicado en: Sin Categoria | 0

max7219-driver-display-7-segmentos-2El MAX7219 (datasheet), en nuestros proyectos de electrónica es muy común utilizar display de 7 segmentos de 2, 4 y hasta 8 dígitos, estos nos ayudan a visualizar variables internas y externas para poder, así, mejorar el control de nuestros circuitos. Todos aquellos que se hayan encaminado a controlar estos display de 7 segmentos, sin ayuda de ningún driver externo y, utilizando solo un microcontrolador saben que consume varios recursos del mismo, tales como; temporizadores, memoria RAM para los dígitos, etc.

Hoy en día existe el chip MAX7219 (datasheet), este driver nos ahorra pines y tiempo de procesamiento en nuestros microcontroladores, ademas, este circuito integrado de tan solo 24 pines puede controlar hasta 8 display de 7 segmentos o una matriz de leds 8×8, este último lo veremos más adelante ya que merece su propia sección. Todo el control se realiza a través de 3 pines y utiliza del protocolo SPI.

CARACTERISTÍCAS DRIVER MAX7219

  • Interfaz SPI hasta 10Mhz
  • Control individual de hasta 64 led o segmentos
  • Decodificador BCD integrado
  • Control de brillo de 15 niveles
  • Memoria RAM de 8×8
  • Modo de bajo consumo 150µA
  • Multiplexación a 800hz de 1 hasta 8 dígitos programable

DESCRIPCIÓN MAPA DE REGISTROS DRIVER MAX7219

max7219-driver-display-7-segmentos-3

REGISTRO DECODE-MODE (ADDRESS = 0x09)

Este registro configura el decodificador BCD, (0, 1, 2…9, E, H, L, P y —), en modo display 7 segmentos. Existen 4 modos correspondientes al orden de la tabla que se muestra abajo. El primero, sin codificación para ningún dígito. El siguiente, solo se codifica el dígito 0, mientras, que los dígitos [1-7] no presentan codificación. A continuación, se codifica los dígitos del [0-3] y los demás sin codificación. Por ultimo, todos los dígitos si presentan codificación BCD.

max7219-driver-display-7-segmentos-4

REGISTRO INTENSITY (ADDRESS = 0x0A)

El registro intensity modula de forma digital el brillo de los leds a través de un modular de ancho de pulso, PWM, interno que el MAX7219 posee. Este modulador tiene una escala de corriente de 16 pasos que va desde 1/32 hasta 31/32 de cliclo de trabajo para el brillo. A continuación se muestra una tabla donde se aprecia mejor este registro.

max7219-driver-display-7-segmentos-5

REGISTRO SCAN-LIMT (ADDRESS = 0x0B)

A través del registro SCAN-LIMIT se puede configurar la cantidad de dígitos a mostrar, ya que la multiplexación interna que realiza el driver MAX7219 es de 800hz. Esto quiere decir que cuando se muestren menos dígitos, el tiempo de visualización para cada dígito aumentara y por ende le dará relativamente más brillo a cada dígito. A continuación se muestra una tabla explicando el registro en detalle.

max7219-driver-display-7-segmentos-6

REGISTRO SHUTDOWN (ADDRES = 0x0C)

Cuando el registro SHUTDOWN esta activado el oscilador se interrumpe, la fuente de corriente se anula y todos sus registros se escriben a +5Vdc, apagando todos los leds y poder asi ahorrar energía. Todo ello no afecta los resgistro y permanecen inalterados ya que se guardan en la memoria RAM. En la siguiente tabla se aprecia el registro SHUTDOWN.

max7219-driver-display-7-segmentos-7

REGISTRO TEST-DISPLAY (ADDRESS = 0x0F)

El registro TEST-DISPLAY opera de 2 modos: normal y test. En el modos normal todos los leds se encienden a sus máxima intensidad sin alterar los registros. A continuación se muestra una tabla que describe el registro.

max7219-driver-display-7-segmentos-8

CIRCUITO DE CONEXIÓN DE PIC16F1829 Y DRIVER MAX7219

max7219-driver-display-7-segmentos-9

EJEMPLO DIVER MAX7219 CON PIC16F1829

El siguiente ejemplo muestra como usar un display 7 segmentos de 8 dígitos utilizando el driver MAX7219 y controlado desde un PIC16F1829. Es sencillo, escribiremos en los 8 dígitos el mismo valor que subirá o bajará dependiendo del los 2 botones conectados en los pines RC0 y RC1 repectivamente.

Código Principal

#define _XTAL_FREQ 32000000
#include 
#include "fuses.h"
#include "max7219.h"

unsigned char cont = 0;

void main(void) {
    OSCCON = 0b11110010; // PLLEN=1(x4), IRCF=8Mhz, SCS=OSC_INTERNAL
    max7219_Config();
    TRISCbits.TRISC0 = 1;
    TRISCbits.TRISC1 = 1;
    OPTION_REGbits.nWPUEN = 0;
    WPUCbits.WPUC0 = 1;
    WPUCbits.WPUC1 = 1;
    for (char i = 0; i < 8; i++) {
        max7219_WriteDigito(i, cont);
    }
    while (1) {
        if (!PORTCbits.RC0) {
            __delay_ms(100);
            if (cont < 9) {
                cont++;
            }
            for (char i = 0; i < 8; i++) {
                max7219_WriteDigito(i, cont);
            }
        }
        if (!PORTCbits.RC1) {
            __delay_ms(100);
            if (cont > 0) {
                cont--;
            }
            for (char i = 0; i < 8; i++) {
                max7219_WriteDigito(i, cont);
            }
        }
    }
    return;
}

Librería Fuses

#ifndef FUSES_H
#define	FUSES_H

// CONFIG1
#pragma config FOSC = INTOSC    // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin)
#pragma config WDTE = OFF       // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable (PWRT disabled)
#pragma config MCLRE = OFF      // MCLR Pin Function Select (MCLR/VPP pin function is digital input)
#pragma config CP = ON          // Flash Program Memory Code Protection (Program memory code protection is enabled)
#pragma config CPD = ON         // Data Memory Code Protection (Data memory code protection is enabled)
#pragma config BOREN = ON       // Brown-out Reset Enable (Brown-out Reset enabled)
#pragma config CLKOUTEN = OFF   // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = ON        // Internal/External Switchover (Internal/External Switchover mode is enabled)
#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)

// CONFIG2
#pragma config WRT = OFF        // Flash Memory Self-Write Protection (Write protection off)
#pragma config PLLEN = ON       // PLL Enable (4x PLL enabled)
#pragma config STVREN = ON      // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
#pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LVP = ON         // Low-Voltage Programming Enable (Low-voltage programming enabled)

#endif	/* FUSES_H */

Librería MAX7219

#ifndef MAX7219_H

#define	MAX7219_H

#define pinDIN_TRIS TRISCbits.TRISC5
#define pinCLK_TRIS TRISCbits.TRISC7
#define pinLOAD_TRIS TRISCbits.TRISC6

#define pinDIN_LAT LATCbits.LATC5
#define pinCLK_LAT LATCbits.LATC7
#define pinLOAD_LAT LATCbits.LATC6

// MAX7219 Registers
#define MAX7219_NOP   0x00
#define MAX7219_DIG1  0x01
#define MAX7219_DIG2  0x02
#define MAX7219_DIG3  0x03
#define MAX7219_DIG4  0x04
#define MAX7219_DIG5  0x05
#define MAX7219_DIG6  0x06
#define MAX7219_DIG7  0x07
#define MAX7219_DIG8  0x08
#define MAX7219_DECODE      0x09
#define MAX7219_INTENSITY   0x0A
#define MAX7219_SCAN_LIMIT  0x0B
#define MAX7219_SHUTDOWN    0x0C
#define MAX7219_TEST        0x0F

static const unsigned char digitos[10] = {
    // XABCDEFG
    0b01111110, // 0
    0b00110000, // 1
    0b01101101, // 2
    0b01111001, // 3
    0b00110011, // 4
    0b01011011, // 5
    0b01011111, // 6
    0b01110000, // 7
    0b01111111, // 8
    0b01111011 // 9
};

void max7219_Config(void);
void max7219_Intensity(unsigned char);
void max7219_WriteDigito(unsigned char, unsigned char);

void max7219_WriteBits(unsigned int);
void max7219_WriteComando(unsigned char, unsigned char);

void max7219_Config(void) {
    pinDIN_TRIS = 0;
    pinCLK_TRIS = 0;
    pinLOAD_TRIS = 0;

    pinDIN_LAT = 0;
    pinCLK_LAT = 0;
    pinLOAD_LAT = 1;

    max7219_WriteComando(MAX7219_SHUTDOWN, 0x00);
    max7219_WriteComando(MAX7219_TEST, 0x00);
    max7219_WriteComando(MAX7219_INTENSITY, 0x0F);
    max7219_WriteComando(MAX7219_SCAN_LIMIT, 0x07);
    max7219_WriteComando(MAX7219_SHUTDOWN, 0x01);

}

void max7219_WriteDigito(unsigned char digito, unsigned char valorDeDigito) {
    volatile unsigned int temporal = 0;
    if (digito > 7) {
        return;
    }
    temporal = digito + 1;
    temporal = temporal << 8;
    temporal = temporal & 0x0F00;
    temporal = temporal | digitos[valorDeDigito];
    max7219_WriteBits(temporal);
}

void max7219_Intensity(unsigned char value) {
    if (value < 16) {
        max7219_WriteComando(MAX7219_INTENSITY, value);
    }
}

void max7219_WriteBits(unsigned int valor) {
    volatile unsigned int temporal = 0;
    volatile unsigned char c = 0;
    pinLOAD_LAT = 0;
    for (c = 0; c < 16; c++) {
        temporal = 1;
        temporal = (temporal << (15 - c));
        if ((temporal & valor) != 0) {
            pinDIN_LAT = 1;
        } else {
            pinDIN_LAT = 0;
        }
        pinCLK_LAT = 1;
        __delay_us(1);
        pinCLK_LAT = 0;
    }
    pinLOAD_LAT = 1;
}

void max7219_WriteComando(unsigned char comando, unsigned char valorDeComando) {
    volatile unsigned int temporal = 0;
    temporal = comando;
    temporal = temporal << 8;
    temporal = temporal & 0x0F00;
    temporal = temporal | valorDeComando;
    max7219_WriteBits(temporal);
}
#endif	/* MAX7219_H */

Deja una respuesta