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

📄 gd485-08.c

📁 基于ADE7166/7169的单相表程序
💻 C
📖 第 1 页 / 共 4 页
字号:
/*******************************************************
***   MULTI-FUNCTION METER  PROGRAM DESIGN           ***
***           2008.07.01                             ***
***                                                  ***
*** 功能: 完成多功能电表的脉冲计数,自检 ,断电控制 ***
***       存储,显示,RS-485数据传输(部颁标准)等功能 ***
***       增加块读24小时整点数据命令                 ***
*** 源程序文件名: GS485-08.c                            ***
*** 目标代码文件名:   校验和=               ***
***                                 ****
*******************************************************/
/****************************************************************
** 编译环境平台:PICC  8.05                       **
**               MPLAB IDE 7.22                   **
**               485_914.HEX                     **
*****************************************************************/
/*****************************************************************
*****com3 com2 com1 com0(s12-1f,s13-1a)   com3  com2  com1  com0(s19-4f,s18-4a)   
     h8    f4   g2   e1                    a     b     c     d
     a     b    c    d		           h     f     g     e
******************************************************************/

//#include<pic.h>
//__CONFIG(WDTEN & INTIO & PROTECT & PWRTEN & BOREN);
//#include<pic1677.h>
//#include<string.h>
#include ".\inc\iar7166.h"			//自己做的
#include ".\inc\mfmgd.h"
#include ".\inc\public.c"
#include ".\inc\time1.c"
#include ".\inc\i2c.c"

//unsigned char const lcdnum[14]={12,13,14,3,2,20,19,18,17,16,6,21,22,23};
void initdata(void);
void AddInt(void);
void INIT7166(void);




///////////////////////////////////////////////////////////////////////
//////////////////////////////watchdogclear////////////////////////////
//////////////////////////////////////////////////////////////////////////
void CLRWDT()
{
	IE_bit.EA=0;
	WDCON_bit.WDWR=1;
	WDCON_bit.WDE=1;
	IE_bit.EA=1;
	return;
}


uchar zhStar(uchar ss)
{ uchar ucA,ucB;
  uint  uiC;
  uchar cc[2];
  if(ss<=0xa7) ucA=(ss&0x0f)*3;
  if(ss>=0xb0) ucA=24+(ss&0x0f)*3;		//整点数据序号,0-35
  readEE24(0,LastDayAddpc,2);
  ucB=EEbuf[0];
  if(EEbuf[0]==0)                    //如果现地址在第0页   数据从0x40-0xff
  { 
    if(EEbuf[1]>0xf8)
    	 EEbuf[1]=0xf8;       
    	if((EEbuf[1]-ucA*8)>=0x40)           //如果不超出第0页
    		{
         uiC=EEbuf[1]-ucA*8;
         ucB=0;
        }
      else                               //若超出
      	{
          if(uiC=EEbuf[1]+0x80-ucA*8>=0x00)
          {
      		ucB=1;
      		uiC=EEbuf[1]+0x80-ucA*8;
          }
          else
          {
           ucB=0;
            uiC=EEbuf[1]+0x80+0x100-ucA*8;
      	} 
   }
  }
   else
   	if(EEbuf[0]==1)                     //如果现地址在第1页   数据从0x00-0xBF
    {
      if(EEbuf[1]>0xB8)
      	 EEbuf[1]=0xB8; 
      	if((EEbuf[1]-ucA*8)>=0x00)       //如果不超出第1页 
      		{
      			uiC=EEbuf[1]-ucA*8;
      			ucB=1;
      		}
      			else                          //若超出
      				{
                                  if(EEbuf[1]+0x100-ucA*8>=0x40)
                                  {
      					ucB=0;
      					uiC=EEbuf[1]+0x100-ucA*8;
                                  }
                                  else
                                  {
                                   ucB=1;
                                   uiC=EEbuf[1]+0x100+0x80-ucA*8;
      				} 
     } 
    }
cc[0]=ucB;
cc[1]=uiC;

 return *cc;
}

void zhtake(uchar zh)
{ 
 //uchar ucA,ucB;
 uchar aa[2];
  *aa=zhStar(zh);
  if(aa[0]==0)                                     
  	{
  		if(aa[1]==0x40)
  			{
  				readEE24(1,0xb0,6);
  				EEbuf[12]=EEbuf[0];
          EEbuf[13]=EEbuf[1];
          EEbuf[14]=EEbuf[2];
          EEbuf[15]=EEbuf[3];
          EEbuf[16]=EEbuf[4];
          EEbuf[17]=EEbuf[5];
          
          
          readEE24(1,0xb8,6);
          EEbuf[6]=EEbuf[0];
          EEbuf[7]=EEbuf[1];
          EEbuf[8]=EEbuf[2];
          EEbuf[9]=EEbuf[3];
          EEbuf[10]=EEbuf[4];
          EEbuf[11]=EEbuf[5];
       }
      else if(aa[1]==0x48)
      	{
      		readEE24(1,0xb8,6);
  		EEbuf[12]=EEbuf[0];
          EEbuf[13]=EEbuf[1];
          EEbuf[14]=EEbuf[2];
          EEbuf[15]=EEbuf[3];
          EEbuf[16]=EEbuf[4];
          EEbuf[17]=EEbuf[5];
          readEE24(0,0x40,6);
          EEbuf[6]=EEbuf[0];
          EEbuf[7]=EEbuf[1];
          EEbuf[8]=EEbuf[2];
          EEbuf[9]=EEbuf[3];
          EEbuf[10]=EEbuf[4];
          EEbuf[11]=EEbuf[5];     
        }
      else
      	{
      		readEE24(0,aa[1]-16,6);
  				EEbuf[12]=EEbuf[0];
          EEbuf[13]=EEbuf[1];
          EEbuf[14]=EEbuf[2];
          EEbuf[15]=EEbuf[3];
          EEbuf[16]=EEbuf[4];
          EEbuf[17]=EEbuf[5];
          readEE24(0,aa[1]-8,6);
          EEbuf[6]=EEbuf[0];
          EEbuf[7]=EEbuf[1];
          EEbuf[8]=EEbuf[2];
          EEbuf[9]=EEbuf[3]; 
          EEbuf[10]=EEbuf[4];
          EEbuf[11]=EEbuf[5];   
        }
      		  
        readEE24(aa[0],aa[1],6);
      }
    if(aa[0]==1)
      {
      	if(aa[1]==0x00)
      		{
      	 	  readEE24(0,0xf0,6);
  		 EEbuf[12]=EEbuf[0];
            EEbuf[13]=EEbuf[1];
            EEbuf[14]=EEbuf[2];
            EEbuf[15]=EEbuf[3];
            EEbuf[16]=EEbuf[4];
            EEbuf[17]=EEbuf[5];
            readEE24(0,0xf8,6);
            EEbuf[6]=EEbuf[0];
            EEbuf[7]=EEbuf[1];
            EEbuf[8]=EEbuf[2];
            EEbuf[9]=EEbuf[3];
            EEbuf[10]=EEbuf[4];
            EEbuf[11]=EEbuf[5];     
      		}
      		else 
      			if(aa[1]==0x08)
      				{
      					readEE24(0,0xf8,6);
  				      EEbuf[12]=EEbuf[0];
                EEbuf[13]=EEbuf[1];
                EEbuf[14]=EEbuf[2];
                EEbuf[15]=EEbuf[3];
                EEbuf[16]=EEbuf[4];
                EEbuf[17]=EEbuf[5];
                readEE24(1,0x00,6);
                EEbuf[6]=EEbuf[0];
                EEbuf[7]=EEbuf[1];
                EEbuf[8]=EEbuf[2];
                EEbuf[9]=EEbuf[3]; 
                EEbuf[10]=EEbuf[4];
                EEbuf[11]=EEbuf[5]; 
             }
             else
             	{
             		readEE24(1,aa[1]-16,6);
  				      EEbuf[12]=EEbuf[0];
                EEbuf[13]=EEbuf[1];
                EEbuf[14]=EEbuf[2];
                EEbuf[15]=EEbuf[3];
                EEbuf[16]=EEbuf[4];
                EEbuf[17]=EEbuf[5];
                readEE24(1,aa[1]-8,6);
                EEbuf[6]=EEbuf[0];
                EEbuf[7]=EEbuf[1];
                EEbuf[8]=EEbuf[2];
                EEbuf[9]=EEbuf[3]; 
                EEbuf[10]=EEbuf[4];
                EEbuf[11]=EEbuf[5]; 
              }
              readEE24(1,aa[1],6);
            }
}






void Delay3ms()				//10ms
{
 uchar ucA,ucB;
 
 for(ucA=0;ucA<20;ucA++) for(ucB=0;ucB<0x50;ucB++);
}


void testPulse(void)
{ 
 
 if(Pulsebz==0xaa)
   {
     	if(PulseAdd[0]>0x21)
     	{
     		PulseAdd[0]=0;PulseAdd[1]=0;}    
      }
   else
    {
    	PulseAdd[0]=0;PulseAdd[1]=0;
    }
}



void initdata(void)
{ 
    uchar ucA;
    readEE24(0,NOWZVALJYADD,2);
    if((EEbuf[0]!=0x09)||(EEbuf[1]!=0xaf))
    { 
       EEbuf[0]=0x09;EEbuf[1]=0xaf;
       writeEE24(0,NOWZVALJYADD,2);     
       EEbuf[0]=0;EEbuf[1]=0;EEbuf[2]=0;EEbuf[3]=0;
       writeEE24(0,NOWVALADD,4);
       writeEE24(0,PulseEEadd,2);   
   }
   readEE24(0,NOWVALADD,4);
   for(ucA=0;ucA<4;ucA++)
   {
   	DL[ucA]=EEbuf[ucA];}
    readEE24(0,YHIDADD,7);
  
   for(ucA=0;ucA<6;ucA++)
   MeterID[ucA]=EEbuf[ucA];  
  
     testPulse();                   
}


void Hour_Change()
{ 
  uchar ucA,ucB,ucC; 
  readEE24(0,LastDayAddpc,2);		//EEbuf[0]=pc
  ucA=EEbuf[1];ucC=EEbuf[0];
  if(ucC==0)
  {
     if(ucA>=0xf8) 
     	{
     		ucC=1;
     		ucB=0x00;
     	}
     else ucB=ucA+8;
   }
   if(ucC==1)
   	{
   		if(ucA>=0xb8) 
     	{
     		ucC=0;
     		ucB=0x40;
     	}
     	else ucB=ucA+8;
     }
  EEbuf[0]=ucC;
  EEbuf[1]=ucB;
  writeEE24(0,LastDayAddpc,2);		
  
  EEbuf[0]=PulseAdd[1];
  EEbuf[1]=DL[1];
  EEbuf[2]=DL[2];
  EEbuf[3]=DL[3];
  EEbuf[4]=HEX2BCD(Time.hour);
  EEbuf[5]=HEX2BCD(Time.day);
  writeEE24(ucC,ucB,6);	
 
  HourMark=Time.hour;
}





void SetDL(void)
{    
	    uchar ucA;
      EEbuf[0]=recv[17];
     	EEbuf[1]=recv[18];
     	EEbuf[2]=recv[19];
     	EEbuf[3]=recv[20];
     	          
      writeEE24(0,INIVALADD,4);
      writeEE24(0,NOWVALADD,4);
          
	    for(ucA=0;ucA<4;ucA++)
	    {
	    	DL[ucA]=EEbuf[ucA];
	    }
	
	    PulseAdd[1]=EEbuf[0];
	    PulseAdd[0]=0;	    
      EEbuf[1]=EEbuf[0];
      EEbuf[0]=0;
      writeEE24(0,PulseEEadd,2);
      EEbuf[0]=0;EEbuf[1]=0;EEbuf[2]=0;EEbuf[3]=0;EEbuf[4]=0;
      writeEE24(0,BYVALADD,4);writeEE24(0,BYVALADD+4,4);writeEE24(0,BYVALADD+8,4);
      CLRWDT();
           
      for(ucA=0;ucA<8;ucA++)
         writeEE24(0,ZEROADD+5*ucA,5);
      writeEE24(0,LastDayAdd,2);
      EEbuf[0]=0xfc;
      writeEE24(0,LastDayAddpc,1);
            
}



/************************************
** 函数原型: void E2Add(uchar ucM);**
** 功    能: .         **  sf 0505
************************************/
void E2Add()
{
  uchar ucA;
  AddInt();
  for(ucA=0;ucA<4;ucA++)
  {
  	EEbuf[ucA]=DL[ucA];
  }
   writeEE24(0,NOWVALADD,4);

}

/***************************************************
** 功能: 累加表码整数部分(表码为3字节的压缩BCD码) **
** 入口: 无                                       **
** 出口: 无                                       **
***************************************************/
void AddInt(void)
{
 uchar	g;

 g=DL[1]&0x0f;			/** 00000x.00 **/
 g+=1;

 if(g<0x0a){
    DL[1]+=1;
    return;
 }

 g=DL[1]&0xf0;			/** 0000x0.00 **/
 g+=0x10;

 if(g<0xa0){
    DL[1]=g;
    return;
 }

 g=DL[2]&0x0f;			/** 000x00.00 **/
 g+=1;

 if(g<0x0a){
    DL[1]=0;
    DL[2]+=1;
    return;
 }

 g=DL[2]&0xf0;			/** 00x000.00 **/
 g+=0x10;

 if(g<0xa0){
    DL[1]=0;
    DL[2]=g;
    return;
 }

 g=DL[3]&0x0f;			/** 0x0000.00 **/
 g+=1;

 if(g<0x0a){
    DL[1]=0;
    DL[2]=0;
    DL[3]+=1;
    return;
 }

 g=DL[3]&0xf0;			/** x00000.00 **/
 g+=0x10;

 if(g<0xa0)
    DL[3]=g;
 else
 DL[3]=0;
 DL[1]=0;
 DL[2]=0;
 
/* 改变为查看现场保护恢复*/
}


/*****************************************
** 函数原型: void writeLCDbuf10(void);  **
** 功    能: 熄灭所有的段位.            **
*****************************************/
void nodisplay(void)
{
    unsigned char i;    
   // CLR_WDT();    
    LCDCONY|=0x01;                                      // start updating the data,freeze the data being displayed on the LCD while updating it.    
    for(i=0x80;i<0x87;i++)    
    {    
        LCDDAT=0x00;                             // move the data to the LCD Data SFR    
        LCDPTR=i;    
    }    
    LCDCONY&=0xfe;  
 
 // writeLCD();
}

void writelcddata(unsigned char xx,unsigned char LCDBufAddr)
{  
    LCDCONY|=0x01;                                      // start updating the data,freeze the data being displayed on the LCD while updating it.    
    LCDDAT=LCDBufAddr;// move the data to the LCD Data SFR    
    LCDPTR=xx;       
    LCDCONY&=0xfe;                         // update finished    
}

void writeLCD() 
{
  uchar ucA,ucB;
  for(ucA=0;ucA<7;ucA++)
 {
  ucB=decode[LCDbuf[ucA]];
 if((LCDbuf[ucA]&0x80)==0x80) { ucB|=lh;}
   LCDbuf[ucA]=ucB; 
 }   

  writelcddata(0x83,LCDbuf[0]); 
  writelcddata(0x84,LCDbuf[1]); 
  writelcddata(0x85,LCDbuf[2]); 
  writelcddata(0x86,LCDbuf[3]); 
  writelcddata(0x80,LCDbuf[4]); 
  writelcddata(0x81,LCDbuf[5]); 
  writelcddata(0x82,LCDbuf[6]); 
  
}


/*****************************************
** 函数原型: void writeLCDbuf10(void);  **
** 功    能: 显示所有的段位.            **
*****************************************/
void displayfull(void)
{ 
    unsigned char i;    
    LCDCONY|=0x01;                                      // start updating the data,freeze the data being displayed on the LCD while updating it.    
    for(i=0x82;i<0x8A;i++)    
    {    
        LCDDAT=0xff;                             // move the data to the LCD Data SFR    
        LCDPTR=i;    
    }    
    LCDCONY&=0xfe;  
}


void nodiszero(void)
{ 
	uchar ucA;
    for(ucA=1;ucA<8;ucA++)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -