// MULTIMETRO
#include <xc.h>
#define _XTAL_FREQ 16000000 //Frecuencia del oscilador
#define AN0_CHANNEL 0 //Canal AN0 para el ADC
//Prototipos
void init_ADC(void);
unsigned int read_ADC(void);
void display_voltage(unsigned int value);
//Tabla de segmentos para los dígitos
const unsigned char segment[] = {0b00000011, 0b10011111, 0b00100101, 0b00001101,
0b10011001, 0b01001001, 0b01000001, 0b00011111, 0b00000001, 0b00011001};
const unsigned char uniseg[] = {0b00000010, 0b10011110, 0b00100100, 0b00001100,
0b10011000, 0b01001000, 0b01000000, 0b00011110, 0b00000000, 0b00011000};
//Configuración inicial
void init_ADC(void) {
ADCON0 = 0b00000001; //Canal AN0, encender ADC
ADCON1 = 0b00001110; //AN0 como entrada analógica
ADCON2 = 0b10101001; //Justificación derecha, FOSC/8, 2TAD
}
//Leer el valor del ADC
unsigned int read_ADC(void) {
[Link] = 1; //Iniciar conversión
while ([Link]); //Esperar a que termine la conversión
return ((ADRESH << 8) + ADRESL); //Combinar registros
}
//Mostrar el valor en el display de 7 segmentos
void display_voltage(unsigned int value) {
float voltage = (value * 4.995) / 1023; //Calcular voltaje real
voltage = voltage * 1000;
unsigned int display_val = (unsigned int)(voltage); //Escalar para mostrar
decimal
// Dividir el valor en decenas y unidades
unsigned int uni = display_val / 1000; //Parte de "volts" (unidad
completa)
unsigned int dec = (display_val / 100) % 10; //Centésimas
unsigned int cen = (display_val / 10) % 10; //Décimas
unsigned int mil = display_val % 10; //Milésimas
PORTD = segment[mil];
PORTB = 0b00001000;
__delay_ms(10);
PORTD = 0xFF;
PORTD = segment[cen];
PORTB = 0b00000100;
__delay_ms(10);
PORTD = 0xFF;
PORTD = segment[dec];
PORTB = 0b00000010;
__delay_ms(10);
PORTD = 0xFF;
PORTD = uniseg[uni];
PORTB = 0b00000001;
__delay_ms(10);
PORTD = 0xFF;
}
void main(void) {
TRISA = 0x01; //AN0 como entrada
TRISB = 0x00; //Puerto B como salida (para anodos)
TRISD = 0x00; //Puerto D como salida (para segmentos)
init_ADC(); //Inicializar el ADC
while (1) {
unsigned int adc_value = read_ADC(); // eer el ADC
display_voltage(adc_value); //Mostrar voltaje en displays
}
}