#include <16F877.h>                       //PIC16f877//
#fuses XT,NOWDT  
#device  adc=10                         //Cristal de cuarzo, Perro guardian desactivado//
#use delay (clock=4000000)                //reloj de 4Mhz//
#include <lcd.c>
#BYTE TRISA=0X85
#BYTE PORTA=0X05
#BYTE TRISB=0x86                          //Variable definida de TRISB en 0x86
#BYTE PORTB=0x06                          //Variable definida de PORTB en 0x06
#BYTE OPTION_REG=0x81                     //OPTION_REG en 0x81//
#BYTE STATUS=0x03                         //STATUS en 0x03//
#BYTE TMR0=0x01                           //TMR0 en 0x01//

void main(){

int16 q;
int16 a;
float g;
float h;
float m;
float p;
float j;
int CONTADOR;                               //Variable definida para almacenar TMR0//
float RESULTADO;                            //Variable definida para almacenar cosfi//

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32); //Configura Timer0//
setup_adc_ports(AN0_AN1_AN2_AN3_AN4);     //Define como analogico el Puerto A//
setup_adc(ADC_CLOCK_INTERNAL);
bit_set(TRISA,2);                         //PortA como entrada//
bit_set(TRISB,0);                         //B0 como entrada//
bit_set(TRISB,1);                         //B1 como entrada//
                            
lcd_init() ;


//////////////////////Tomar datos analogicos//////////////////////////////////     
         
        WHILE (TRUE){
         
         
         set_adc_channel(0);
         delay_us(20);
         
     //////////////////////Voltaje///////////////////////////////////////////////
     
         q = read_adc(); //lee
         p = 5.0*q/1024;  //pasa a voltaje// 
         h =p ;    // valores nuestros
         
         j=p;           //lo guardo en otra variable -> J            
         ////////////////////Amperimetro///////////////////////////         
         set_adc_channel(1);
         delay_us(20);
         
         a =read_adc();
         m =5.0*a/1024;
         g= m;    // Amperimetro real
                 
         
/////////////////////////Factor de Potencia///////////////////////////////

if (input(PIN_B0)==1)           //Lee B0. B0=1?//
   {                            
   set_timer0(0);               //Resetea el Timer0//
   }
if(input(PIN_B1)==1)
   {
CONTADOR=get_timer0();                            //Almacena la cuenta del TMR0 en la variable CONTADOR//
   }

            switch (CONTADOR)
            {
            CASE 0:RESULTADO=1;
            break;
            case 1:RESULTADO=1;
            break;
            case 2:RESULTADO=1;
            break;
            case 3:RESULTADO=1;
            break;
            case 4:RESULTADO=1;
            break;
            case 5:RESULTADO=0.99;
            break;
            case 6:RESULTADO=0.99;
            break;
            case 7:RESULTADO=0,99;
            break;
            case 8:RESULTADO=0.98;
            break;
            case 9:RESULTADO=0.98;
            break;            
            case 10:RESULTADO=0,98;
            break;             
            case 11:RESULTADO=0.97;
            break;
            case 12:RESULTADO=0.97;
            break;
            case 13:RESULTADO=0.96;
            break;
            case 14:RESULTADO=0.96;
            break;
            case 15:RESULTADO=0.95;
            break;
            case 16:RESULTADO=0.95;
            break;       
            case 17:RESULTADO=0.94;
            break;
            case 18:RESULTADO=0.93;
            break;                    
            case 20:RESULTADO=0.92;
            break;        
            case 21:RESULTADO=0.91;
            break;
            case 22:RESULTADO=0.90;
            break;       
            case 23:RESULTADO=0.89;
            break;              
            case 24:RESULTADO=0.88;
            break;       
            case 25:RESULTADO=0.87;
            break;       
            case 26:RESULTADO=0.86;
            break;       
            case 27:RESULTADO=0.85;
            break;       
            case 28:RESULTADO=0.84;
            break;       
            case 29:RESULTADO=0.82;
            break;       
            case 30:RESULTADO=0.81;
            break;
            case 31:RESULTADO=0.80;
            break;
            case 32:RESULTADO=0.79;
            break;
            case 33:RESULTADO=0.78;
            break;
            case 34:RESULTADO=0.77;
            break;
            case 35:RESULTADO=0.75;
            break;       
            case 36:RESULTADO=0.74;
            break;       
            case 37:RESULTADO=0.73;
            break;       
            case 38:RESULTADO=0.72;
            break;
            case 39:RESULTADO=0.71;
            break;
            case 40:RESULTADO=0.70;
            break;
            case 41:RESULTADO=0.69;
            break;
            case 42:RESULTADO=0.68;
            break;
            case 43:RESULTADO=0.67;
            break;
            case 44:RESULTADO=0.66;
            break;
            case 45:RESULTADO=0.65;
            break;
            case 46:RESULTADO=0.63;
            break;
            case 47:RESULTADO=0.62;
            break;
            case 48:RESULTADO=0.61;
            break;
            case 49:RESULTADO=0.60;
            break;
            case 50:RESULTADO=0.58;
            break;
            case 51:RESULTADO=0.57;
            break;
            case 52:RESULTADO=0.56;
            break;
            case 53:RESULTADO=0.55;
            break;
            case 54:RESULTADO=0.54;
            break;
            case 55:RESULTADO=0.53;
            break;
            case 56:RESULTADO=0.52;
            break;
            case 57:RESULTADO=0.50;
            break;
            case 58:RESULTADO=0.49;
            break;
            case 59:RESULTADO=0.48;
            break;
            case 60:RESULTADO=0.47;
            break;
            case 61:RESULTADO=0.46;
            break;
            case 62:RESULTADO=0.45;
            break;
            case 63:RESULTADO=0.44;
            break;
            case 64:RESULTADO=0.43;
            break;
            case 65:RESULTADO=0.42;
            break;
            case 66:RESULTADO=0.41;
            break;
            case 67:RESULTADO=0.40;
            break;            
            }
     
       ////////////////////////Imprimir en display///////////////////////////////
     lcd_gotoxy(1,1);   
         printf(lcd_putc, "\f VOLT = %01.2fV  ",p);
         printf(lcd_putc, "\1 AMPERE = %1.2fA",m);   
         lcd_gotoxy(1,2);   
         printf(lcd_putc, "\Cosfi=%01.2f",RESULTADO);
         delay_ms(1000);
        
        }}


        
        
        
        

      
