El 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
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.
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.
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.
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.
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.
CIRCUITO DE CONEXIÓN DE PIC16F1829 Y DRIVER MAX7219
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
Lo siento, debes estar conectado para publicar un comentario.