📄 energy meter.c
字号:
#include<lcd.h>
static volatile bit REL1 @ (unsigned)&PORTD*8+3;
static volatile bit KEY_A @ (unsigned)&PORTC*8+0;
static volatile bit KEY_B @ (unsigned)&PORTC*8+1;
static volatile bit KEY_C @ (unsigned)&PORTC*8+2;
static volatile bit KEY_D @ (unsigned)&PORTC*8+3;
static volatile bit KEY_E @ (unsigned)&PORTC*8+4;
static volatile bit KEY_F @ (unsigned)&PORTC*8+5;
unsigned int UNIT,I,V,temp[3];
unsigned char TEMP_UNIT;
unsigned long POW,CUM_POW=0;
unsigned char a[5],b[5];
unsigned int set_unit;
unsigned char set_unit_h,set_unit_l,key;
void disp_set_unit1(void);
unsigned char get_key(void);
void display_all(void);
void disp_set_unit(void);
void display_power(void);
void energy(void);
void main (void)
{
ADCON1=0x80;
TRISA=0xFF;
TRISC=0xFF;
TRISB=TRISD=0x00;
REL1=0;
lcd_init();
LCD_CLR
print_line(" DIGITAL ENERGY ",0x80);
print_line(" METER ",0xc0);
delay(100000);
/*do
{
temp[0]=take_adc(0);
temp[1]=take_adc(1);
I=(temp[0]*23)/102;
V=(temp[1]*27)/102;
POW=(I*V)/10;
display_power();
}while(1);*/ //for testing current and voltage and power
if(KEY_A==0)
{
while(KEY_A==0);
print_line(" ENTER PASSWORD ",0x80);
lcd_command(0xc0);
lcd_command(0x0f);
a[0]=get_key();
lcd_data('*');
a[1]=get_key();
lcd_data('*');
a[2]=get_key();
lcd_data('*');
a[3]=get_key();
lcd_data('*');
lcd_command(0x0c);
b[0]=EEPROM_READ(0x01);
b[1]=EEPROM_READ(0x02);
b[2]=EEPROM_READ(0x03);
b[3]=EEPROM_READ(0x04);
if((a[0]==b[0])&(a[0]==b[0])&(a[0]==b[0])&(a[0]==b[0]))
{
home: LCD_CLR
print_line("A-SET NO OF UNIT",0x80);
print_line("B-CHANGE P-WORD",0xC0);
key=get_key();
if(key=='A')
{
LCD_CLR
print_line("SET NO OF UNIT",0x80);
print_line(" KW/H",0xC0);
set_unit_h=EEPROM_READ(0x05);
set_unit_l=EEPROM_READ(0x06);
set_unit=set_unit_h;
set_unit=set_unit<<8;
set_unit=set_unit+set_unit_l;
disp_set_unit();
do
{
if(KEY_A==0)
{
if(set_unit<9999){set_unit++;}
else{set_unit=1;}
disp_set_unit();
}
if(KEY_B==0)
{
if(set_unit>1){set_unit--;}
else{set_unit=9999;}
disp_set_unit();
}
}while(KEY_C);while(KEY_C==0);
set_unit_l=set_unit;
set_unit_h=set_unit>>8;
EEPROM_WRITE(0x05,set_unit_h);
EEPROM_WRITE(0x06,set_unit_l);
EEPROM_WRITE(0x07,set_unit_h);
EEPROM_WRITE(0x08,set_unit_l);
}
if(key=='B')
{
LCD_CLR
print_line(" ENTER PASSWORD ",0x80);
lcd_command(0xc0);
lcd_command(0x0f);
a[0]=get_key();
lcd_data('*');
a[1]=get_key();
lcd_data('*');
a[2]=get_key();
lcd_data('*');
a[3]=get_key();
lcd_data('*');
lcd_command(0x0c);
b[0]=EEPROM_READ(0x01);
b[1]=EEPROM_READ(0x02);
b[2]=EEPROM_READ(0x03);
b[3]=EEPROM_READ(0x04);
if((a[0]==b[0])&(a[0]==b[0])&(a[0]==b[0])&(a[0]==b[0]))
{
LCD_CLR
print_line("ENTER NEW P-WORD",0x80);
lcd_command(0xc0);
lcd_command(0x0f);
a[0]=get_key();
lcd_data('*');
a[1]=get_key();
lcd_data('*');
a[2]=get_key();
lcd_data('*');
a[3]=get_key();
lcd_data('*');
lcd_command(0x0c);
LCD_CLR
print_line("VERIFY P-WORD",0x80);
lcd_command(0xc0);
lcd_command(0x0f);
b[0]=get_key();
lcd_data('*');
b[1]=get_key();
lcd_data('*');
b[2]=get_key();
lcd_data('*');
b[3]=get_key();
lcd_data('*');
lcd_command(0x0c);
if((a[0]==b[0])&(a[0]==b[0])&(a[0]==b[0])&(a[0]==b[0]))
{
EEPROM_WRITE(0x01,b[0]);
EEPROM_WRITE(0x02,b[1]);
EEPROM_WRITE(0x03,b[2]);
EEPROM_WRITE(0x04,b[3]);
LCD_CLR
print_line("PASSWORD CHANGED",0x80);
print_line(" SUCESSFULLY ",0xc0);
delay(100000);
goto home;
}
else
{
LCD_CLR
print_line("UNABLE TO CHANGE",0x80);
print_line(" PASSWORD ",0xc0);
delay(100000);
goto home;
}
}
else
{
LCD_CLR
print_line("!PASSWORD WRONG!",0x80);
delay(100000);
goto home;
}
}
}
}
LCD_CLR
print_line("SET: KW/H ",0x80);
print_line("BAL: KW/H ",0xc0);
set_unit_h=EEPROM_READ(0x07);
set_unit_l=EEPROM_READ(0x08);
set_unit=set_unit_h;
set_unit=set_unit<<8;
set_unit=set_unit+set_unit_l;
disp_set_unit1();
set_unit_h=EEPROM_READ(0x05);
set_unit_l=EEPROM_READ(0x06);
set_unit=set_unit_h;
set_unit=set_unit<<8;
set_unit=set_unit+set_unit_l;
normal:
LCD_CLR
print_line("NORMAL",0x80);
delay(100000);
energy();
REL1=1;
do
{
//REL1=1-REL1; //temp
temp[0]=take_adc(0);
temp[1]=take_adc(1);
I=(temp[0]*23)/102;
V=(temp[1]*27)/102;
POW=(I*V);
CUM_POW=CUM_POW+POW;
TEMP_UNIT=CUM_POW/360000;
if(TEMP_UNIT>=1)
{
set_unit=set_unit-TEMP_UNIT;
if((set_unit>9999)|(set_unit<1))set_unit=0;
set_unit_l=set_unit;
set_unit_h=set_unit>>8;
EEPROM_WRITE(0x05,set_unit_h);
EEPROM_WRITE(0x06,set_unit_l);
CUM_POW=CUM_POW%360000;
}
if((set_unit>9999)|(set_unit<1))REL1=0;
else REL1=1;
display_all();
delay(20000); //adjustable for 1 sec
if(KEY_A==0) goto demo;
}while(1);
demo:
LCD_CLR
print_line("DEMO",0x80);
delay(100000);
energy();
REL1=1;
do
{
//REL1=1-REL1; //temp
temp[0]=take_adc(0);
temp[1]=take_adc(1);
I=(temp[0]*23)/102;
V=(temp[1]*27)/102;
POW=(I*V);
CUM_POW=CUM_POW+POW;
TEMP_UNIT=CUM_POW/3600;
if(TEMP_UNIT>=1)
{
set_unit=set_unit-TEMP_UNIT;
if((set_unit>9999)|(set_unit<1))set_unit=0;
set_unit_l=set_unit;
set_unit_h=set_unit>>8;
EEPROM_WRITE(0x05,set_unit_h);
EEPROM_WRITE(0x06,set_unit_l);
CUM_POW=CUM_POW%3600;
}
if((set_unit>9999)|(set_unit<1))REL1=0;
else REL1=1;
display_all();
delay(20000); //adjustable for 1 sec
if(KEY_A==0)goto normal;
}while(1);
}
void energy(void)
{
LCD_CLR
print_line("SET: KW/H ",0x80);
print_line("BAL: KW/H ",0xc0);
set_unit_h=EEPROM_READ(0x07);
set_unit_l=EEPROM_READ(0x08);
set_unit=set_unit_h;
set_unit=set_unit<<8;
set_unit=set_unit+set_unit_l;
disp_set_unit1();
set_unit_h=EEPROM_READ(0x05);
set_unit_l=EEPROM_READ(0x06);
set_unit=set_unit_h;
set_unit=set_unit<<8;
set_unit=set_unit+set_unit_l;
}
void display_power(void)
{
unsigned char tou,hun,ten,one;
unsigned int temp;
temp=POW;
tou = temp/1000;
temp= temp%1000;
hun = temp/100;
temp= temp%100;
ten = temp/10;
one = temp%10;
lcd_command(0x80);
lcd_data(tou+0x30);
lcd_data(hun+0x30);
lcd_data(ten+0x30);
lcd_data(one+0x30);
temp= I;
hun = temp/100;
temp= temp%100;
ten = temp/10;
one = temp%10;
lcd_command(0xC0);
lcd_data(hun+0x30);
lcd_data(ten+0x30);
lcd_data(one+0x30);
temp= V;
hun = temp/100;
temp= temp%100;
ten = temp/10;
one = temp%10;
lcd_command(0xC7);
lcd_data(hun+0x30);
lcd_data(ten+0x30);
lcd_data(one+0x30);
}
void display_all(void)
{
unsigned char tou,hun,ten,one;
temp[2]=set_unit;
tou=temp[2]/1000;
temp[2]=temp[2]%1000;
hun=temp[2]/100;
temp[2]=temp[2]%100;
ten=temp[2]/10;
one=temp[2]%10;
lcd_command(0xc4);
lcd_data(tou+0x30);
lcd_data(hun+0x30);
lcd_data(ten+0x30);
lcd_data('.');
lcd_data(one+0x30);
}
unsigned char get_key(void)
{
do
{
if (KEY_A==0){while(KEY_A==0);delay(1000);return('A');}
else if(KEY_B==0){while(KEY_B==0);delay(1000);return('B');}
else if(KEY_C==0){while(KEY_C==0);delay(1000);return('C');}
else if(KEY_D==0){while(KEY_D==0);delay(1000);return('D');}
else if(KEY_E==0){while(KEY_E==0);delay(1000);return('E');}
else if(KEY_F==0){while(KEY_F==0);delay(1000);return('F');}
}while(1);
return(0);
}
void disp_set_unit(void)
{
unsigned char tou,hun,ten,one;
temp[2]=set_unit;
tou=temp[2]/1000;
temp[2]=temp[2]%1000;
hun=temp[2]/100;
temp[2]=temp[2]%100;
ten=temp[2]/10;
one=temp[2]%10;
lcd_command(0xc0);
lcd_data(tou+0x30);
lcd_data(hun+0x30);
lcd_data(ten+0x30);
lcd_data('.');
lcd_data(one+0x30);
}
void disp_set_unit1(void)
{
unsigned char tou,hun,ten,one;
temp[2]=set_unit;
tou=temp[2]/1000;
temp[2]=temp[2]%1000;
hun=temp[2]/100;
temp[2]=temp[2]%100;
ten=temp[2]/10;
one=temp[2]%10;
lcd_command(0x84);
lcd_data(tou+0x30);
lcd_data(hun+0x30);
lcd_data(ten+0x30);
lcd_data('.');
lcd_data(one+0x30);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -