Electgpl

PIC - Voltimetro con display 7srg

Apr 13th, 2016
2,094
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.86 KB | None | 0 0
  1. #include <16F883.h>                         //Microcontrolador a Elegir
  2. #device adc=10                              //Resolución del ADC a 10Bit
  3. #use delay(clock=4000000)                   //Oscilador Externo a 4MHz
  4. //Vector que aloja los 10 valores numéricos para el display de 7 segmentos
  5. int8 num[10]={0b00111111,0b00000110,0b01011011,0b01001111,0b01100110,
  6.               0b01101101,0b01111101,0b00000111,0b01111111,0b01101111};
  7. #int_timer0                                 //Función del Timer0
  8. //Función que se ejecutara en paralelo al programa principal sobre el Timer0
  9. void timer0_mux(int8 dig4, int8 dig3, int8 dig2, int8 dig1){
  10.    output_c(0b00000001);                    //Selección del display 1
  11.    output_b(num[dig1]);                     //Valor tratado del dígito 1 en la salida B
  12.    output_high(PIN_B7);                     //Prendemos el punto decimal
  13.    delay_ms(2);                             //Delay de multiplexado de 2ms
  14.    output_c(0b00000010);                    //Selección del display 2
  15.    output_b(num[dig2]);                     //Valor tratado del dígito 1 en la salida B
  16.    output_low(PIN_B7);                      //Apagamos el punto decimal
  17.    delay_ms(2);                             //Delay de multiplexado de 2ms
  18.    output_c(0b00000100);                    //Selección del display 3
  19.    output_b(num[dig3]);                     //Valor tratado del dígito 1 en la salida B
  20.    output_low(PIN_B7);                      //Apagamos el punto decimal
  21.    delay_ms(2);                             //Delay de multiplexado de 2ms
  22.    output_c(0b00001000);                    //Selección del display 4
  23.    output_b(num[dig4]);                     //Valor tratado del dígito 1 en la salida B
  24.    output_low(PIN_B7);                      //Apagamos el punto decimal
  25.    delay_ms(2);                             //Delay de multiplexado de 2ms
  26.    set_timer0(0);                           //Seteo del Timer0
  27. }
  28. void convert(int16 valor){                  //Función para convertir entero en dígitos
  29. int uno, diez, cien, mil;                   //Declaración de variables de los dígitos
  30.    mil=valor/1000;                          //Operación para adquirir miles
  31.    cien=(valor/100)%10;                     //Operación para adquirir cientos
  32.    diez=(valor/10)%10;                      //Operación para adquirir decenas
  33.    uno=valor%10;                            //Operación para adquirir unidades
  34.    timer0_mux(uno,diez,cien,mil);           //Llamado a la función de multiplexado
  35. }
  36. void main(){                                //Función principal del programa
  37.    setup_adc_ports(sAN0|VSS_VDD);           //Configuración del canal del ADC
  38.    setup_adc(ADC_CLOCK_DIV_2);              //Configuración de velocidad del ADC
  39.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_8); //Configuración del divisor del Timer0
  40.    set_timer0(0);                           //Seteo del Timer0
  41.    enable_interrupts(INT_TIMER0);           //Habilitación de interrupción Timer0
  42.    enable_interrupts(GLOBAL);               //Habilitación de interrupciones
  43.    float tension, tensionAnt=0;             //Definición de variables flotantes
  44.    int16 i;                                 //Definición de entero de 16 bit
  45.    while(true){                             //Lazo repetitivo principal
  46.       set_adc_channel(0);                   //Selección del canal 0 del ADC
  47.       delay_ms(5);                          //Delay para la conversión de 5ms
  48.       tension=read_adc()*5.0/1023.0;        //Lee el ADC y convierte en valor de tensión
  49.       for(i=0;i<500;i++){                   //Lazo de 500 iteraciones para sacar promedio
  50.          tensionAnt=tension+tensionAnt;     //Suma del acumulado para sacar promedio
  51.       }        
  52.       convert((tensionAnt/500)*1000);       //Llama a la función que convierte a dígitos
  53.       tensionAnt=0;                         //Inicializa variable de promedio
  54.    }
  55. }
Advertisement
Add Comment
Please, Sign In to add comment