#include <xc.h>
#include <math.h>
#define abs(x) ( (x) >= 0 ? (x) : -(x) )
void Delay_Us(int x)
{
x>>4;
while(x--);
}
void Delay_Ms(int x)
{
while(x--) Delay_Us(1000);
}
void LCDcmd(char c)
{
unsigned char buf;
buf = c & 0xf0;
PORTB = buf;
Delay_Us(100);
RB3 = 1; // E
Delay_Us(100);
RB3 = 0; // E
buf = (c << 4) & 0xf0;
PORTB = buf;
Delay_Us(100);
RB3=1; // E
Delay_Us(100);
RB3=0; // E
}
void LCDdata(char c)
{
unsigned char buf;
buf = c & 0xf0;
PORTB = buf;
RB2 = 1; // R/S
Delay_Us(100);
RB3 = 1; // E
Delay_Us(100);
RB3 = 0; // E
buf = (c << 4) & 0xf0;
PORTB = buf;
RB2 = 1; // R/S
Delay_Us(100);
RB3=1; // E
Delay_Us(100);;
RB3 = 0; // E
}
void LCDline(char c)
{
char addr;
addr = 0x80;
if (c == 2) addr += 0x40;
Delay_Ms(1);
LCDcmd(addr);
}
void LCDgoto(char x,char y)
{
char addr;
addr = 0x80 + y;
if(x == 2) addr += 0x40;
Delay_Ms(1);
LCDcmd(addr);
}
void LCDprintC(char x,char y,const char * c)
{
LCDgoto( x, y);
while(*c != '\0')
{
Delay_Ms(1);
LCDdata(*c);
c++;
}
}
void LCDprintR(char x,char y, char * c)
{
LCDgoto( x, y);
while(*c != '\0')
{
Delay_Ms(1);
LCDdata(*c);
c++;
}
}
void LCDinit(char c)
{
PORTB = 0;
TRISB = 3;
LCDcmd(0x32);
Delay_Ms(15);
LCDcmd(0x2c);
Delay_Ms(5);
LCDcmd(0x6);
Delay_Ms(1);
LCDcmd(0xc);
Delay_Ms(1);
LCDcmd(c);
Delay_Ms(1);
}
int powerFactor()
{
int a=0,b=0,t=0,x=0;
float tm,pf;
TMR1L=0;
TMR1H=0;
do
{
if(RA0 == 1)
TMR1ON = 1;
else if(RA0 == 0 && TMR1ON == 1)
{
TMR1ON = 0;
break;
}
}while(1);
a = (TMR1L | (TMR1H<<8)) * 2;
TMR1L=0;
TMR1H=0;
do
{
if(RA0 == 1)
{
TMR1ON=1;
if(RA1 == 1)
{
TMR1ON=0;
break;
}
}
}while(1);
b = TMR1L | (TMR1H<<8);
tm = (float)b/a;
pf = cos(tm*2*3.14);
x=abs(ceil(pf*100));
return x;
}
void main()
{
char c[]="0.00";
int a,b,d,x,f,e;
float tm,pf;
LCDinit(1);
ADCON1 = 0x07; // To configure PORTA pins as digital
TRISA0 = 1; // Makes First pin of PORTA as input
TRISA1 = 1; //Makes Second pin of PORTA as input
TRISD0 = 0; //Makes Fist pin of PORTD as output
TRISD1 = 0; //Makes Second pin of PORTD as output
while(1)
{
a = powerFactor();
Delay_Us(50);
b = powerFactor();
Delay_Us(50);
d = powerFactor();
Delay_Us(50);
e = powerFactor();
Delay_Us(50);
f = powerFactor();
x = (a+b+d+f+e)/5;
c[3]=x%10 + 0x30;
x=x/10;
c[2]=x%10 + 0x30;
x=x/10;
c[0]=x%10 + 0x30;
LCDprintC(1,1,"Power Factor");
LCDprintR(2,1,c);
if(x<90)
{
RD0 = 1;
RD0 = 1;
Delay_Ms(2000);
}
else
{
RD0 = 0;
RD0 = 0;
}
Delay_Ms(250);
}
}