El MOD display se trata de un módulo en el que se encuentra un arreglo de 4 displays de 7 segmentos de ánodo común, que ya cuenta con los transistores para multiplexar, así como las resistencias limitadoras de corriente. Esto facilita su uso y reduce las conexiones necesarias para utilizarlo.
Declaración de pines
El MOD display es un dispositivo que cuenta con 13 pines. Uno de ellos es para la alimentación de los transistores, sin embargo, los restantes deben declarase al inicio del proyecto, y puede ser cambiados por el usuario con las siguientes líneas.
//Declaración de pines del MOD DISPLAY -- MODIFICAR AL GUSTO SI ES NECESARIO #define MILLARES LATDbits.LD7 #define CENTENAS LATDbits.LD6 #define DECENAS LATDbits.LD5 #define UNIDADES LATDbits.LD4 //Puerto para mostrar la numeracion - CAMBIAR AL GUSTO SI ES NECESARIO #define PUERTO LATB
Nota: En el programa principal deben configurarse los pines del puerto B o el utilizado como salidas digitales.
Funciones
- DISPLAY(x)
Mostrar un número entero de hasta 4 dígitos: Esta función tiene como parámetro de entrada el valor a mostrar. Para ello se hace uso de la técnica del multiplexeo, así como la separación de dígitos, permitiendo mostrar números entre 0 y 9 999, es útil para mostrar los valores medidos por algún sensor o mostrar el valor de algún contador. (Si se manda un “15” o un número que no sea de 4 cifras se completará con ceros a la izquierda y se mostrará un “0015”).
Por ejemplo:
DISPLAY(9073);
- DIGITO(x,y)
Mostrar un dígito en una posición definida. De igual manera hace uso de la técnica del multiplexeo, pero ya no se realiza la separación de dígitos, dejando esta tarea al usuario, es útil para el desarrollo de relojes con el MOD display. Esta función tiene 2 parámetros de entrada, el dígito y la posición, el dígito debe ser entre 0 y 9. Por otro lado, la posición debe ser un número entre 1 y 4 como se explica en la siguiente tabla:
Posición |
Digito |
1 |
Unidades |
2 |
Decenas |
3 |
Centenas |
4 |
Unidades de millar |
Por ejemplo:
DIGITO(9,4); DIGITO(0,3); DIGITO(7,2); DIGITO(3,1);
Conexiones (Miuva 18 / PIC 18F46K22)
Las conexiones mencionadas en la librería pueden observarse en la siguiente ilustración, pero pueden cambiarse según lo requiera el usuario. ES IMPORTANTE QUE EL PIN “A” DEL MOD DISPLAY ESTÉ CONECTADO CON EL PIN “0” DEL PUERTO UTILIZADO.
Este ejemplo está basado en la tarjeta de desarrollo Miuva 18 que cuenta con el PIC 18F46k22 pero podrá ser utilizada en cualquier otra de nuestras tarjetas de la serie Miuva.
-
Mod DISPLAY
Miuva 18
A
B0
B
B1
C
B2
D
B3
E
B4
F
B5
G
B6
DP
B7
D1
D4
D2
D5
D3
D6
D4
D7
Código de ejemplo (Miuva 18 / PIC 18F46K22)
Nota: Es importante incluir la librería después de declarar la frecuencia del oscilador en el programa principial.
#include <xc.h> //Configuracion de los fusibles #pragma config PLLDIV = 2, CPUDIV = OSC1_PLL2, USBDIV = 2 #pragma config FOSC = HSPLL_HS, FCMEN = OFF, IESO = OFF #pragma config PWRT = OFF, BOR = OFF, VREGEN = OFF #pragma config WDT = OFF #pragma config MCLRE = ON, LPT1OSC = OFF, PBADEN = OFF #pragma config STVREN = ON, LVP = OFF, ICPRT = OFF, XINST = OFF //Frecuencia del oscilador #define _XTAL_FREQ 48000000 //Librerias #include "Display_libreria.h" //Variables globales int contador = 1950; void main(void) { //Declarar pines del puerto B y puerto D como salidas digitales TRISB = 0x00; TRISD = 0x00; //Limpiar puerto B y puerto D LATD = 0x00; LATB = 0x00; //Configuramos interrupciones del PIC INTCONbits.GIE_GIEH = 0; //Deshabilitamos interrupciones globales INTCONbits.PEIE_GIEL = 0; //Deshabilitamos interrupciones periféricas RCONbits.IPEN = 0; // apagamos prioridades T0CONbits.TMR0ON = 0; //Apagamos módulo de TIMER0 //Configuramos fuentes de interrupción INTCONbits.TMR0IE = 1; //Habilitamos interrupción por desbordamiento INTCONbits.TMR0IF = 0; //Limpiamos bandera de interrupción del TMR0 //Configuramos módulo TMR0 T0CONbits.T08BIT = 0; //Seleccionamos registro de 16 bits T0CONbits.T0CS = 0; //Fuente de reloj viene de FOSC T0CONbits.PSA = 0; //Activamos preescaler T0CONbits.T0PS = 0b111; //Preescala seleccionada de 1:256 TMR0 = 28035; //Valor de inicio del timer 0 para interrupcion cada 800 ms T0CONbits.TMR0ON = 1; //Encendemos módulo de TIMER0 INTCONbits.GIE_GIEH = 1; //habilitamos interrupciones globales INTCONbits.PEIE_GIEL = 1; //habilitamos interrupciones periféricas while(1){ //Formas para mostrar un numero //CON UNA VARIABLE DISPLAY(contador); //////////PRIMERA FORMA CON LA FUNCION DISPLAY //DISPLAY(72350); ////////SEGUNDA FORMA CON LA FUNCION DIGITO //DIGITO(7,4); //DIGITO(2,3); //DIGITO(3,2); //DIGITO(5,1); } return; } void __interrupt() myISR(){ //Funcion de interrupciones, my interruption service rutine if(INTCONbits.TMR0IF == 1){ //Estructura if, preguntamos activación de la bandera del timer1 contador++; //Iniciamos el conteo ascendente if (contador > 9999) contador = 0; TMR0 = 28035; //Valor de inicio del timer 0 para interrupciones cada 800 ms INTCONbits.TMR0IF = 0; //Limpiamos bandera de interrupcion } return; }
Funcionamiento