#include "pic16f819.h"
#include "xc.h"
#include "ctype.h"
#include "stdio.h"
#pragma config (WDTE=OFF,MCLRE=OFF,LVP=OFF,PWRTE=OFF,FOSC=INTOSCIO)//
#define _XTAL_FREQ 8000000
#define F  RB0
#define A  RB1
#define B  RB2
#define G  RB3
#define C  RB4
#define E  RB5
#define D  RB6
#define DP RB7
#define DIG1 RA6
#define DIG2 RA4
#define DIG3 RA5
#define DIG4 RA7
bit toggel_adc=0;//Amper<>Volt Volt=0,Amper=1   -   
bit toggel_led;//Amper<>Volt Volt=0,Amper=1    -
bit priority_a;// 
unsigned char temp[4];//     	
unsigned char V[4];//   
unsigned char Am[4];//   
unsigned int Mj_temp=1;//   
unsigned char ij_temp=0;// 
unsigned int Mj_a;//  ,   
unsigned int Mj_v;//  ,   
unsigned char ij_a=0;//   
unsigned char ij_v=0;//   
unsigned int adc;//  
unsigned int one_bit_U=401;//1  
unsigned int one_bit_A=117;//1  
unsigned int k_in_a;unsigned int k_out_a;//  
unsigned int k_in_v;unsigned int k_out_v;//  
unsigned char oversempl_a1;//     
unsigned char oversempl_v1;//     
unsigned char oversempl_a2;//     
unsigned char oversempl_v2;//     
unsigned char i_a;//-      
unsigned char i_v;//-      
unsigned char i;//    
unsigned char n=4;// 
unsigned long int Amper;// 
unsigned long int Volt;// 
unsigned long int Amper_temp;// 
unsigned long int Volt_temp;// 
unsigned long int Amper_save;// 
unsigned long int Volt_save;// 
unsigned long int data_real;// 
unsigned int adc_temp_a1;//      
unsigned int adc_temp_v1;//      
unsigned int adc_temp_a2;//      
unsigned int adc_temp_v2;//      
unsigned int timer_led=1953;//1953*2.048=4 sec       
unsigned int timer_temp;//   
void seg_led(unsigned int data,unsigned char mass);//   
void kadr(unsigned char digit,unsigned char number_digit,unsigned char point);//  
void interrupt timer_2(unsigned int temp){TMR2IF=0;//   2
                         if(ADIF==1){ADIF=0;//   
                                     adc=ADRESH;
                                //     adc=(adc<<8)+ADRESL;        ADRESL
                                                      if(toggel_adc==1){//  -,  1  ,  
                                                                        adc_temp_a1+=adc;//+        
                                                                        oversempl_a1++;//     
                                                                        ADCON0=0b01001001; //    
                                                                        toggel_adc=0; //    
                                                                  if(oversempl_a1>=4){//     ,    4,       . .
                                                                        oversempl_a2++;//    
                                                                        adc_temp_a2+=(adc_temp_a1>>1);//+           
                                                                        oversempl_a1=0;//     
                                                                        adc_temp_a1=0;//       
                                                                  if(oversempl_a2>=4){//     ,    4,       . .
                                                                        oversempl_a2=0;//     
                                                                        k_in_a=k_in_a+(adc_temp_a2>>1)-k_out_a;//  
                                                                        k_out_a=k_in_a>>4;//  
                                                                        Amper=k_out_a;//     
                                                                        Amper_temp=Amper>>2;//         . 25%      .
                                                                        adc_temp_a2=0;//       
                                                                                      }
                                                                                      }
                                                                        }
                                                                   else{//  -,  1  ,  
                                                                        adc_temp_v1+=adc;//    
                                                                        oversempl_v1++;
                                                                        ADCON0=0b01000001; //    
                                                                        toggel_adc=1;//    
                                                                  if(oversempl_v1>=4){
                                                                        oversempl_v2++;
                                                                        adc_temp_v2+=(adc_temp_v1>>1);
                                                                        oversempl_v1=0;
                                                                        adc_temp_v1=0;
                                                                  if(oversempl_v2>=4){
                                                                        oversempl_v2=0;
                                                                        k_in_v=k_in_v+(adc_temp_v2>>1)-k_out_v;
                                                                        k_out_v=k_in_v>>4;
                                                                        Volt=k_out_v;
                                                                        Volt_temp=Volt>>3;//         . 12,5%      .
                                                                        adc_temp_v2=0;
                                                                                      }
                                                                                      }
                                                                        }
									 }
   if((Volt_temp<Volt_save||Volt_temp>Volt_save)&&i==0&&priority_a==0){// ,        +-12,5%,          ,    . 
                                                        toggel_led=0;
                                                        timer_temp=0;
                                                        Volt_save=Volt_temp;
                                                        }
   if((Amper_temp<Amper_save||Amper_temp>Amper_save)&&i==0){// ,       +-25%,          ,    . 
                                                            toggel_led=1;//     
                                                            timer_temp=0;//   
                                                            Amper_save=Amper_temp;//  25%    
                                                            priority_a=1;}//   
   if(timer_temp>=timer_led&&i==0){if(toggel_led==1){//    ,      .     ,     .
                                                      toggel_led=0;}// 
                                     else{toggel_led=1;// 
                                          priority_a=0;//   
                                          }
                                          timer_temp=0;}// 
       if(toggel_led==1){n=sizeof(Am);// 1  .  .
                         kadr(Am[i],i,ij_a);// , 
	                     }
       else{n=sizeof(V);//,  
            kadr(V[i],i,ij_v);
			}
   timer_temp++;//     .
   i++;//  
   if(i>=n){i=0;}//         ,  .
   GO=1;// 
   return;
}
void main(){
INTCON=0x00; //stop interrupt
OSCCON=0b01110100;// 8 
PORTB=0x00;
TRISB=0x00;
PORTA=0x00;
TRISA=0b00001011;  // AN0 AN1 input ADC AN3 Vref
ADCON1=0b01000101;  //Fconv=Fosc/32 AN1 Hanp  AN0 Tok
ADCON0=0b01001001; // Left justify, Vref=RA3(AN3), ADC on, RA0/AN0 in
T2CON=0b00011101; //256*4*4=2.048ms
PIE1=0b00000010;//interrupt TMR2
INTCON=0b11000000;//Go Interrupt
while(1){
     seg_led(Volt,1);//    
        V[0]=temp[0];//      
        V[1]=temp[1];
        V[2]=temp[2];
        V[3]=111;
        Mj_v=Mj_temp;ij_v=ij_temp;//  
        ij_temp=0;Mj_temp=1;//  
     seg_led(Amper,2);//   
        Am[0]=temp[0];
        Am[1]=temp[1];
        Am[2]=temp[2];
        Am[3]=100;
        Mj_a=Mj_temp;ij_a=ij_temp;
        ij_temp=0;Mj_temp=1;
        __delay_ms(300);//     ,   
        }
}
void seg_led(unsigned int data,unsigned char mass){//    .   (data), (mass)    
            switch(mass){case 1:data_real=(Volt*one_bit_U)/100;//     ,      
                         break;
                         case 2:data_real=(Amper*one_bit_A)/100;//   
                         break;
                         }
//    ,   99999 ()   9.9999(9.99)   9.9999(9.99) 
// ,       203 . . 203*4=812 
// 812*401(1  )=325612.  100=3256   .
//     3256/(100*Mj_temp)=3256/(100*1)=32
//,  32  9.,  Mj_temp( 1)*10=10   ,    (32.5),    (3.25)
//3256/(100*10)=3  ,   9.      .
// 3256-(3*100*10)/(10*10)=2   .
     do{temp[0]=data_real/(100*Mj_temp);//  ,  
           if(temp[0]>9){//   . ,    10
                         Mj_temp=Mj_temp*10;
                         ij_temp++;//  
						 }
        }while(temp[0]>9);
        temp[1]=(data_real-(temp[0]*100*Mj_temp))/(10*Mj_temp);//  ,    
        temp[2]=(data_real-(temp[0]*100*Mj_temp)-(temp[1]*10*Mj_temp))/(Mj_temp);
	   					 }
void kadr(unsigned char digit,unsigned char number_digit,unsigned char point){
            switch(number_digit)//   
                          {case 0: DIG1=1,DIG2=0,DIG3=0,DIG4=0;if(point==0){DP=1;}else{DP=0;};
                           break;
                           case 1: DIG1=0,DIG2=1,DIG3=0,DIG4=0;if(point==1){DP=1;}else{DP=0;};
                           break;
                           case 2: DIG1=0,DIG2=0,DIG3=1,DIG4=0;if(point==2){DP=1;}else{DP=0;};
                           break;
                           case 3: DIG1=0,DIG2=0,DIG3=0,DIG4=1;if(point==3){DP=1;}else{DP=0;};
                           break;
                           }
            switch(digit){// 
                          case 0: A=1,B=1,C=1,D=1,E=1,F=1,G=0;
                          break;
     /////////////////////////////////////////////////////////////
                          case 1: A=0,B=1,C=1,D=0,E=0,F=0,G=0;
                          break;
     /////////////////////////////////////////////////////////////
                          case 2: A=1,B=1,C=0,D=1,E=1,F=0,G=1;
                          break;
     /////////////////////////////////////////////////////////////
                          case 3: A=1,B=1,C=1,D=1,E=0,F=0,G=1;
                          break;
     /////////////////////////////////////////////////////////////
                          case 4: A=0,B=1,C=1,D=0,E=0,F=1,G=1;
                          break;
     /////////////////////////////////////////////////////////////
                          case 5: A=1,B=0,C=1,D=1,E=0,F=1,G=1;
                          break; 
     /////////////////////////////////////////////////////////////
                          case 6: A=1,B=0,C=1,D=1,E=1,F=1,G=1;
                          break; 
     /////////////////////////////////////////////////////////////
                          case 7: A=1,B=1,C=1,D=0,E=0,F=0,G=0;
                          break; 
     /////////////////////////////////////////////////////////////
                          case 8: A=1,B=1,C=1,D=1,E=1,F=1,G=1;
                          break;
     /////////////////////////////////////////////////////////////
                          case 9: A=1,B=1,C=1,D=1,E=0,F=1,G=1;
                          break; 
     /////////////////////////////////////////////////////////////
                          case 100: A=1,B=1,C=1,D=0,E=1,F=1,G=1; // 
                          break; 
     /////////////////////////////////////////////////////////////
                          case 111: A=0,B=1,C=1,D=1,E=1,F=1,G=0; // 
                          break; 
                        }
;}