HOLA A TODOS:
HE AQUI UN PROGRAMA QUE PERMITE CONTROLAR UN DRIVER SERIAL MAX7221-7219 PARA DISPLAYS DE 7SEGMENTOS (HASTA 8DIGITOS) CON PIC:
PERMITE EVITAR EL OVERHEAD DEL SOFWARE, POR EJEMPLO PODRIA USARSE
PARA MOSTRAR LOS VALORES DE VOLTAJE POSITIVO Y NEGATIVO DE UNA BIPOLAR AL MISMO TIEMPO....ETC
Codigo:
////////////////////////////////////////////////////////////////////////////////
// DRIVER PARA MAX7221 - MAX7219 //
// DRIVER PARA DISPLAY DE 7 SEGMENTOS 8 DIGITOS CATCOM //
// CON INTERFAZ SERIAL //
// ANTES DE ENVIAR DATOS AL DISPLAY: //
// #include<MAX7221.h> //
// display_init() (inicializa display) // //
// write_display(digito,dato) ,muestra el dato en digito // //
// DIGITO: de 0 a 8 //
// FORMATO: //
// D15--D12 D11---D8 D7-------DO (16BITS) //
// X X digito msb DATO lsb //
// //
// //
// PCW V.3.221 fjr07@yahoo.es ing electrica U.de.A col. 26/2/2005 //
////////////////////////////////////////////////////////////////////////////////
#ifndef L_SCK // PINES A EMPLEAR
#define L_SC PIN_B1 // PIN LOAD (habilita escritura de datos)
#define L_SCK PIN_B2 // PIN DE RELOJ
#define L_DIN PIN_B3 // PIN SALIDA DE DATOS
#endif
void write_LED_byte(BYTE cmd) { // rutina que envia serialmente los bytes
BYTE i; // dezplazando este hacia la izquierda bit a bit
for(i=0;i<=7;++i) { // por cada dezplazamiento un pulso de reloj
output_bit(L_DIN, shift_left(&cmd,1,0) ); // envia los datos bit a bit
output_high(L_SCK); // salida sck en alto
output_low(L_SCK); // luego retorna a estado bajo
} // (pulso de reloj sck)
}
// ******subrutina que controla el max 7221 envia dato a mostrar en digito****
void write_led(BYTE cmd, BYTE data) {
output_low(L_SC); // habilitamos escritura ( pin load en bajo)
write_LED_byte(cmd); // enviamos primer byte (digito y control)
write_LED_byte(data); // enviamos segundo byte de datos
output_high(L_SC); // terminamos escritura (pin load en alto)
}
//****** subrutina que inicializa el max7221 para luego poder enviar*********
// datos al display
void display_init()
{
write_led(0x0b,0x07); // modo scan limit muestre (5 Digitos) num de digitos de 0-7
write_led(0x0c,0x01); // limpie displays (modo Shutdown)
write_led(0x09,0xff); // probar displays (modo Display test)
write_led(0x0a,0x00); // modo (control de intensidad )
// intensidad igual a (31/32) de la corriente pico (Iset)
} // (para mas detalles de control ver datasheets)
// la corriente de los display se regula con
// solo una resistencia externa (Iset)
Y AQUI UN PROGRAMA DE EJEMPLO:
Codigo:
/////////////////////////////////////////////////////////////////////////
//// ////
//// ////
//// ////
//// manejo de un driver serial para display MAX7221-7219 ////
//// con pic16f84 ////
//// fjrd07@yahoo.es ////
//// ////
//// ////
//// PCW C COMPILER VER 3.221 26/2/2005 ////
//// ////
/////////////////////////////////////////////////////////////////////////
#include <16F84A.h> // DISPOSITIVO A PROGRAMAR
#include <MAX7221.h> // DRIVER MAX7221
/////////////////declaracion de variables y configuracion///////////////////////
#use delay(clock=4000000) // XTAL OSCILADOR EXRTERNO 4MHZ
#fuses HS,NOWDT,NOPROTECT // FUSIBLES DE CONFIGURACION
#byte porta=5 // DIRECION DE MEMORIA DE PORTB
#byte portb=6 // DIRECION DE MEMORIA DE PORTB
signed int conta,digit;
set_tris_b(0); // puertob como salidas
set_tris_a(0); // puertoa como salidas
/////////////////////////////// PROGRAMA PRINCIPAL//////////////////////////////
void main(void)
{
digit=1; // inicializo variables
conta=9;
display_init(); // inicializo max 7221-7219 (ver archivo .h y
// datasheets) otros modos de operacion
output_high(L_SC); // hacer el pin SC del max77219 alto
output_low(L_SCK); // hacer elpin de reloj clk del max7216 bajo
// para esta conf funciona en modo scan limit
//**************ENVIA DATOS AL DISPLAY DE 7segx8dig**************************
while (true) // bucle infinito
{
write_LED(digit,conta); //digito a escribir con el dato en max7219
delay_ms(1000); //espera un aprox 1seg
digit=++digit;
conta=--conta; //decremento contador
if(conta<0) conta=9; // muestro los digitos del 9 a 0 de der a izqu
if(digit==9) digit=1; // en los 8 digitos
output_high(PIN_A0); // esto enciende y apaga un led en porta.0
delay_ms(500);
output_low(PIN_A0);
delay_ms(500);
} // vuelve a comenzar el bucle
}
FALTARIA SOLO SUBIR LA SIMULACION EN PROTEUS, PERO NO HAY ESPACIO. SI ALGUIEN LA REQUIERE LA ENVIARE POR LOS MSG PRIVADOS
SUERTE...
suerte