⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 energy meter.c

📁 this is the sample file for displaying data on lcd for energy meter for pic microcontroller
💻 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 + -