Está en la página 1de 3

/*********************************************************************

****** */
/* Voltimetro_7seg_876.c Enero 4
del 2009 */
/*--------------------------------------------------------------------
-------*/
/* Ejemplo Voltimetro 0-50Vdc con Microcontolador
Pic16F876A */
/* Con Display 7 Seg Multeplexado a traves de
RA1,RA2,RA3 */
/*--------------------------------------------------------------------
-------*/
/* Ricardo Santibaez */
/*--------------------------------------------------------------------
-------*/
/* Desarrolado con
SDCC. */
/*********************************************************************
********/

#include <pic16f876a.h>
#include <delay.h>
#include <adc.h> /*Funcion para uso ADC gracias arcachofo PIc
Linux*/



typedef unsigned int word;
word at 0x2007 CONFIG = _XT_OSC & _WDT_OFF & _PWRTE_ON &
_BODEN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF &
_DEBUG_OFF & _CP_OFF;


/* Declaracion de Variables */
char display[10]={0x01,0x4f,0x12,0x06,0x4c,0x24,0x60,0x0f,0x00,0x0c};
//Valores que representa numeros en display 7 seg.
char ingres=1;
long int digito1,digito2,digito3;
long int medida;
long int medida1;


/*Rutina de Interrupciones, en este caso por Desborde de Timer 0*/
void isr() interrupt 0 {

switch (ingres) //Selecciono que Display Activar y que valor
cargar
{
case 1:
RA3=1;
RA2=1;
RA1=0;
PORTB=display[digito1];
ingres=2;
break;
case 2:
RA3=1;
RA1=1;
RA2=0;
PORTB=display[digito2];
ingres=3;
break;
case 3:
RA2=1;
RA1=1;
RA3=0;
PORTB=display[digito3];
ingres=1;
break;
}
T0IF=0; // Borro Bandera de Desborde
TMR0=150; // cargo valor en TMR0
}

void main() {

TRISA=1; // Puerta.0 como entrada y el resto como salida
TRISB=0; // Todo el Puerto B como Salida
TMR0=150; // inicio Tmr0 =150
OPTION_REG=5; //Configuro preescaler de TMRO
T0IE=1; // activo Int. por Tmr0
GIE=1; // Habilito Interrupciones
PORTB=0; // inicio Portb
adc_init(FOSC_2, A1_R0, INT_OFF); //Uso de Rutina ADC de PIC,
iniciacion
while (1)
{
medida=adc_read(0); // Leer canal 0
medida1=((medida*500)/1023);//Escalar Variable de 0 a 500

/*Determinar Valores para cada digito del Display*/
digito1=(medida1/100);
digito2=(medida1-(digito1*100))/10;
digito3= medida1-(digito1*100+digito2*10);
delay_ms(200);

}

}

También podría gustarte