Como eu posso medir tensão com pic e max7221

Boa noite pessoal, antes de mais nada quero agradecer a ajuda que tenho recebido neste forum e que está sendo de grande importância para o meu aprendizado e os meus projetos, mais vamos lá.
Estou desenhando um voltimetro com pic e display de 7 segmentos sendo multiplexado pelo max 7221, este projeto vai ler dois canais analógicos onde será mostrado em 8 display, sendo 4 para um canal e 4 para outro canal como segue o código abaixo. Fazer com que o processador acesse o display eu consigo, mais fazer com que o mesmo mostre o valor é ai que o bicho pega.
cpp code
Estou desenhando um voltimetro com pic e display de 7 segmentos sendo multiplexado pelo max 7221, este projeto vai ler dois canais analógicos onde será mostrado em 8 display, sendo 4 para um canal e 4 para outro canal como segue o código abaixo. Fazer com que o processador acesse o display eu consigo, mais fazer com que o mesmo mostre o valor é ai que o bicho pega.
cpp code
#include <16f877.h> //Inclui arquivo header do PIC 16F877
#device ADC = 10 //Define 10 bits para o resultado da conversão AD
#include <stdio.h> // inclusão de SPRINTF
#include <string.h> // inclusão de STRLEN
#use delay (clock=20000000) /*Definição da frequência do cristal para cálculo
..dos delays*/
#fuses HS, NOWDT, PUT,BROWNOUT, NOLVP //Configuração dos bits de controle
//Definições para a comunicação serial
#use RS232 (Baud=9600, xmit = PIN_C6, rcv = PIN_C7)
//variáveis para armazenamento da conversão
int32 ad0,ADC0; // AN0
int32 ad1,ADC1; // AN1
int32 ad2,ADC2; // AN2
//int32 ad3,ADC3; // AN4
#INT_TIMER0 //Diretiva de indetificação da int. do Timer 0
void PiscaLED()
{
static boolean PiscaLed; //para piscar o led.
static int contador; //para contar o tempo de 1 segundo.
set_timer0(131-get_timer0());
contador++;
if(contador == 125) //Se contou 125 (1 segundo).
{
contador=0; //zera contagem.
PiscaLed = !PiscaLed; //Inverte bit;
output_bit(pin_C0, PiscaLed); //Liga/desliga LED.
}
}
//Formato do protocolo = AN0:0000:AN1:0000:00000000
void escreve_serial() //Função de envio do protocolo para a serial
{
printf("AN0:%04lu",ad0);//Envia dados de conversão A/D1
printf(";"); //Controle do protocolo
printf("AN1:%04lu",ad1); //Envia dados de conversão A/D2
printf(";"); //Controle do protocolo
printf("AN2:%04lu",ad2); //Envia dados de conversão A/D3
printf(";"); //Controle do protocolo
}
#define N_MAX 2
#define MAX_DIN PIN_B4
#define MAX_CS PIN_B3
#define MAX_CLK PIN_B2
#include <MAX72xx.c>
char a,b,c,d,e,f;
char g,h,i,j,k,l;
void main()
{
//Configura as entradas analógicas AN0 a AN4
SETUP_ADC_PORTS(AN0_AN1_AN2_AN4_VSS_VREF);
//Utiliza o clock interno para tempo de aquisição
SETUP_ADC(ADC_CLOCK_Internal);
//Habilita interrupção global
Enable_Interrupts(GLOBAL);
//Habilita interrupção por recepção de dados na serial
Enable_Interrupts(INT_RDA);
//Habilita interrupção pelo overflow do Timer 0
ENABLE_INTERRUPTS(INT_TIMER0);
/*Configura Timer 0 para incremento pelo ciclo de máquina Prescaler de 1:256 e
modo de operação em 8 bits*/
SETUP_TIMER_0(RTCC_INTERNAL | RTCC_DIV_256 | RTCC_8_BIT);
//Inicia o Timer 0 com o valor 61 - Interrupção a cada 25ms
SET_TIMER0(61);
Iniciar_MAX72xx(0xFF); //Ativa o decodificador
Comandos_MAX72xx(0x0A,0X08); //Itensidade minima
while(true)
{
SET_ADC_CHANNEL(0); //Configura o canal de leitura 0
delay_ms(10); //Tempo de ajuste do canal (necessário)
ad0 = READ_ADC(); //Faz a conversão AD e a salva na variável ad0
SET_ADC_CHANNEL(1); //Configura o canal de leitura 1
delay_ms(10); //Tempo de ajuste do canal (necessário)
ad1 = READ_ADC(); //Faz a conversão AD e a salva na variável ad0
SET_ADC_CHANNEL(4); //Configura o canal de leitura 1
delay_ms(10); //Tempo de ajuste do canal (necessário)
ad2 = READ_ADC(); //Faz a conversão AD e a salva na variável ad0
ADC0 = (ad0 * 500) /1023;
ADC1 = (ad1 * 500) /1023;
ADC2 = (ad2 * 500) /1023;
for(a=0;a<10;a++)
for(b=0;b<10;b++)
for(c=0;c<10;c++)
for(d=0;d<10;d++)
for(e=0;e<10;e++)
for(f=0;f<10;f++)
for(g=0;g<10;g++)
for(h=0;h<10;h++)
for(i=0;i<10;i++)
for(j=0;j<10;j++)
for(k=0;k<10;k++)
for(l=0;l<10;l++)
{
Enviar_MAX72xx(1,1,a);// Primeiro display, Posição no display, valor no display
Enviar_MAX72xx(1,2,b);
Enviar_MAX72xx(1,3,c);
Enviar_MAX72xx(1,4,d);
Enviar_MAX72xx(1,5,e);
Enviar_MAX72xx(1,6,f);
Enviar_MAX72xx(2,1,g);// Segundo display, Posição no display, valor no display
Enviar_MAX72xx(2,2,h);
Enviar_MAX72xx(2,3,i);
Enviar_MAX72xx(2,4,j);
Enviar_MAX72xx(2,5,k);
Enviar_MAX72xx(2,6,l);
delay_ms(100);
}
}
}