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

📄 rtc_dsp.c

📁 江苏单相复费率电能表方案
💻 C
📖 第 1 页 / 共 3 页
字号:
  				for(i=0;i<6;i++)DspExch[i] = DspBuf[i];//数据入显示交换区
  				
  				ArrayInit(DspBuf,8);
			}				
		}		   		

     	else//显示指针>8
     	{   
    		if(DspPtr<16)
			{
				i = 0x00;									//上月
   				if(DspPtr>11) i=0x01;						//上上月   			
   				Addr[1] = LastMonthSN(i)*16+(DspPtr%4)*4;	//子地址
   				Addr[0] = 0xA2;
   				Len[1]  = 0x04;
   				ReadData(DspExch);							//读取历史电量数据
			}
     	}
    }  	

	//******************************
	if(DspSec>=(DspTime>>1))DspPage = 1;	                //按无锡恒通要求改进    
	//******************************
	
	if((DspPtr<0x02)||(DspPtr==0x05)||(DspPtr==0x06))
	{
		if(DspPtr==0x00)								    //当前日期显示  
		{	
			DspBuf[7] = Year;
			DspBuf[5] = Month;
			DspBuf[3] = Day;
		}
			
		else if(DspPtr==0x01)							    //当前时间显示
		{
			DspBuf[7] = Hour;
			DspBuf[5] = Min;
			DspBuf[3] = Sec;	
		}
						
		else if(DspPtr==0x05)							    //电表局号显示
		{				
			//电表局号高6位			
			DspBuf[7] = DspExch[5];
			DspBuf[5] = DspExch[4];
			DspBuf[3] = DspExch[3];
			
			//电表局号低6位 			
			if(	DspPage==1 )		
			{	
				DspBuf[7] = DspExch[2];
				DspBuf[5] = DspExch[1];
				DspBuf[3] = DspExch[0];
			}
		}			
		else
		{ 			
			if(DspPage==0)
			{
				if( Battery ==1 ) DspBuf[3] |= 0x01;	   //电池情况
				if( Hardware==1 ) DspBuf[3] |= 0x10;	   //硬件情况 
				if( RsComm  ==1 ) DspBuf[5] |= 0x01;	   //通讯情况
				if( AdjTime ==1 ) DspBuf[5] |= 0x10;	   //时钟情况			
  				if( AdjDate ==1 ) DspBuf[7] |= 0x01;	   //校时情况    			
				DspBuf[7] |= 0xF0;                 		   //显示"F"=a+e+f+g
			}	
		}
	    
    	DspBuf[2] = DspBuf[3]&0x0F;						    //显示数据拆分
		DspBuf[3] = DspBuf[3]>>4;
			
		DspBuf[4] = DspBuf[5]&0x0F;
		DspBuf[5] = DspBuf[5]>>4;
		
		DspBuf[6] = DspBuf[7]&0x0F;
		DspBuf[7] = DspBuf[7]>>4;
	}				
	
	else
	{
    	if(DspType==0) 							//5位整数+1位小数				    
		{
												//十万位不处理	
 			DspBuf[7] = DspExch[3]&0x0F;		//万位 
 			 	
  			DspBuf[6] = DspExch[2]>>4;			//千位  	
  			DspBuf[5] = DspExch[2]&0x0F;		//百位  
  			
  			DspBuf[4] = DspExch[1]>>4;			//十位  	
 			DspBuf[3] = DspExch[1]&0x0F; 		//个位 
 				
  			DspBuf[2] = DspExch[0]>>4;  		//小数位
		}
				
		else									//先显示整数,再显示小数
		{
			if((DspPtr>0x01)&&(DspPtr<0x05))
			{
    			i = DspExch[0];    		
     			
    			if(DspPtr==0x02)		DspExch[0] = EryTmp[0];	//当前总电量小数
    			
     			else if(DspPtr==0x03)	DspExch[0] = EryTmp[1];	//当前峰电量小数	
     			
     			else					DspExch[0] = EryTmp[3];	//当前谷电量小数
     			
     			if((i!=DspExch[0])&&(DspExch[0]==0x00))			//小数进位
     				BCDINC(&DspExch[1],3,1);
    		}
			
			DspBuf[3] = DspExch[0];				//显示小数(默认显示小数屏)
			if(DspPage==0)						//显示整数		
	   		{
	   			DspBuf[7] = DspExch[3];
				DspBuf[5] = DspExch[2];
				DspBuf[3] = DspExch[1];
	   		}	   

	  		DspBuf[2] = DspBuf[3]&0x0F;			//显示数据拆分
			DspBuf[3] = DspBuf[3]>>4;	
			
			DspBuf[4] = DspBuf[5]&0x0F;
			DspBuf[5] = DspBuf[5]>>4;
			
			DspBuf[6] = DspBuf[7]&0x0F;
			DspBuf[7] = DspBuf[7]>>4;
		}			
/*		
  		if(DspBuf[7]==0x00)						//前导"0"处理	
  		{	
  			DspBuf[7]=0x10;
  			if(DspBuf[6]==0x00)
			{
  				DspBuf[6]=0x10;
  				if(DspBuf[5]==0x00)
  				{
  					DspBuf[5]=0x10;
  					if(DspBuf[4]==0x00)	DspBuf[4]=0x10;
  				}
  			}
		}	
*/
		//if((DspType==1)&&(DspPage==0)&&(DspBuf[4]==0x10)&&(DspBuf[3]==0x00))DspBuf[3]=0x10;	
		if((DspType==1)&&(DspPage==0))			//整数页处理
  		{
  			if((DspBuf[4]==0x10)&&(DspBuf[3]==0x00))DspBuf[3]=0x10;
  		}
			
	}
	
	for(i=2;i<8;i++)  DspBuf[i] = LcdCoding[DspBuf[i]]; //显示编码转换
	
    if( EryRev==1)    DspBuf[1] |= 0x02; 				//反向状态显示

    //LCD"通讯"标志显示
	if(CommSec>CommLCDTime)   DspBuf[1] |= 0x04; 		//通讯状态显示
    
    switch(DspPtr)
	{
		case 0x00://当前日期
			DspBuf[0] |= 0x80;	//"日期"
			DspBuf[4] |= 0x10;
    		DspBuf[6] |= 0x10;    				
			break;
			
		case 0x01://当前时间+":"
			DspBuf[0] |= 0x28;//"时间"+P7
			DspBuf[1] |= 0x80;//P8
			DspBuf[4] |= 0x10;//P4
    		DspBuf[6] |= 0x10;//P2
			
			if(Fee1==1)
			{
				if(Fee0==1)	DspBuf[1] |= 0x40;   	//显示谷
				else		DspBuf[0] |= 0x04;   	//显示平
			}
			else			DspBuf[1] |= 0x10;   	//显示峰	
			break;
				
		case 0x05:
			if(DspPage==0)
            {	
                DspBuf[1] |= 0x20;
                DspBuf[2] |= 0x10;               
            }         
			break;
			
		case 0x06:
			if(DspPage==0)DspBuf[7] |= 0x10;
			else
			{
				DspBuf[7] = 0x00;
				DspBuf[6] = 0x00;				
				
				i = Temp_Read();//读温度值
			
			     if(i&0x80)
				{
					DspBuf[6] = 0x02;//"-"
					i = ~i+1;
				}
				
				DspBuf[5] = LcdCoding[i/10];
				DspBuf[4] = LcdCoding[i%10];
				
				//摄氏度符号
				DspBuf[3] = 0xAA;//"0"
				DspBuf[2] = 0x8D;//"C"
			}
			break;
				
		default:
			DspBuf[1] |= 0x09;								//"电量"+"kW/h"			
			
			if(DspType==0)				DspBuf[3] |= 0x10;	//小数点
			if(DspType==1&&DspPage==1)	DspBuf[4] |= 0x10;	//小数点
						
			if(DspPtr>0x07)	DspBuf[0] |= 0x02;				//上月 
			if(DspPtr>0x0B)	DspBuf[0] |= 0x42;				//上上月	
			
			if(		DspPtr==0x02||DspPtr==0x08||DspPtr==0x0C)  	DspBuf[0] |= 0x01;	//总		
    		else if(DspPtr==0x03||DspPtr==0x09||DspPtr==0x0D)	DspBuf[1] |= 0x10;	//峰
    		else if(DspPtr==0x0A||DspPtr==0x0E)					DspBuf[0] |= 0x04;	//平
    		else 												DspBuf[1] |= 0x40;	//谷    		
			break;
	}	

	//满屏测试显示
	if(DspPtr==16)
	{
		for(i=0x00;i<0x08;i++) DspBuf[i]=0xFF;
	}

	if(DspPtr==17)
	{
	    ArrayInit(DspBuf,8);
		DspBuf[7] = 0x8F;//"E"
		DspBuf[6] = 0x6A;//"4"
	}

	Display(DspBuf);	//输送显示数据
}




//**********************************************************
//读取显示控制数据
//**********************************************************   	    	
void DspPara_Read(void)
{
	uchar Temp;
	
	Addr[0] = 0xA0;
    Addr[1] = 0xDC;    	
    Len[1]  = 0x04;    	
    do
    {
    	ReadData(DspPara);		 
    	Temp = DspPara[0]+DspPara[1]+DspPara[2];//SumCHK(DspPara,3);    	
    }while((DspPara[3]!=~Temp)&&(Addr[0]<=0xA4));
	
    if(DspPara[3]!=~Temp)		//显示数据默认值,必要时可以更改
    {	
    	DspTime    = 0x10;		//10秒,BCD码
    	DspCtrl2   = 0x00;
    	DspCtrl1   = 0x7F;
        DspParaCHK = 0x70;		//校验和反码
    }

    ErrorModify(0xA4,DspPara);	//保存区数据恢复
}





//**********************************************************
// 名称:DateTerm
// 功能:校时期判断(25天判断)
// 说明:
//**********************************************************
bit DateTerm(void)
{
	uchar Temp;
	uchar DataTime[5];	
		
	if(Prog_Flag==1)return(1);
	else 
	{	
		Addr[0] = 0xA2;//读取上次较时时间
   	 	Addr[1] = 0xF8;    	        		      
    	Len[1]  = 0x05;      	
    	do
    	{
	    	ReadData(DataTime);	
    		Temp      = SumCHK(DataTime,4);    	
    	} while((Temp!=DataTime[4])&&(Addr[0]<=0xA6));
    	
		if(Temp!=DataTime[4])
		{
			DataTime[0] = 0x00;						//分
			DataTime[1] = 0x00;						//时
			DataTime[2] = 0x01;						//日
			DataTime[3] = 0x01;						//月
		}    	

		//============================================
		//月判断
		//============================================	
		Temp 		= BCD2HEX(Month);				//当前月份
		DataTime[3] = BCD2HEX(DataTime[3]);			//上次校时月份

		if(Temp<DataTime[3]) Temp += 12;			//跨年	    	    
		DataTime[4] = Temp-DataTime[3];	
	
		if(DataTime[4]>1) return(1);				//相隔两个月,满足校表日期条件
		else
		{	
			//========================================
			//日判断
			//========================================
			Temp        = BCD2HEX(Day);				//当前日期
	   		DataTime[2] = BCD2HEX(DataTime[2]);		//上次校时日期   
	   	 
	    	if(DataTime[4]==1)
	    	{
				if( DataTime[3]==2 )               //上次校时月份
	    		{   	      
	   	    		if((BCD2HEX(Year)%0x04)==0x00)	Temp += 29;//闰月判断,百年问题不考虑
					else							Temp += 28;			
				}				
				else if(DataTime[3]==4||DataTime[3]==6||DataTime[3]==9||DataTime[3]==11) Temp += 30;	
									
				else Temp += 31;
			}									
		
			if(Temp>DataTime[2])
			{
				Temp -= DataTime[2];
			
				//校时限制天数(25天)判断	    	
	    		if(Temp>DateErrorTerm)  return(1);	
	    		else if(Temp==DateErrorTerm)//天数相等
		    	{	
					//小时、分比较
	    			if((Hour>DataTime[1])||((Hour==DataTime[1])&&(Min>=DataTime[0])))return(1); 	    		
	    			else return(0);	    		
	   			}
	    		else return(0);	    
	    	}
	    	else return(0);	
		}
	}
}




//**********************************************************
// 名称:Ery_Balance
// 功能:电量结算
// 说明:
//**********************************************************
void Ery_Balance(void)
{
	uchar Temp;	
	uchar TMonth[2];
	uchar TBalance[3];
	
	ES  = 0;		
	TR0 = 0;	//关闭超时监控定时器

	CommTimer = 0x00;
	ComPtr    = 0x00;
	
	//读取上次结算月份
	Addr[0] = 0xA2;	
    Addr[1] = 0xCC;    
    Len[1]  = 0x02;
    do
    {
        ReadData(TMonth);
	} while((TMonth[0]!=~TMonth[1])&&(Addr[0]<=0xA6));
        
    if(TMonth[0]!=~TMonth[1])	TMonth[0] = 0x01; //默认上次结算为1月
    
    //读取自动抄表日期
    Addr[0] = 0xA0;	
    Addr[1] = 0xD4;   	
    Len[1]  = 0x03;
    do
    {
        ReadData(TBalance);
		Temp = TBalance[0]+TBalance[1];//SumCHK(TBalance,2);      	        				
    } while((TBalance[2]!=~Temp)&&(Addr[0]<=0xA4));    
        
    //写入默认月末24时冻结时间(00:00)
    if(TBalance[2]!=~Temp)
    {    	
    	TBalance[0] =  0x00;//时
    	TBalance[1] =  0x01;//日
    	TBalance[2] =  0xFE;//校验
    }	

   	ErrorModify(0xA4,TBalance);

	//月判断
	TMonth[1] = BCD2HEX(Month); 			//当前月份
	Temp      = TMonth[1];					//当前月份HEX数据
	if(TMonth[1]<TMonth[0])TMonth[1] +=12;	//跨年
	TMonth[1] -= TMonth[0];	
	
	if(TMonth[1]>0x01)						//大于1个月
	{
	 	TBalance[2] = TMonth[1];			//结算标志
	}	
	else if(TMonth[1]==0x01)
	{	
		if(Day>TBalance[1])TBalance[2]=0x01;//超过结算日
		else if((Day==TBalance[1])&&(Hour>=TBalance[0]))TBalance[2] = 0x01;//超过结算日时
		else TBalance[2] = 0x00;
	}
	else	 TBalance[2] = 0x00;
	
	if(TBalance[2]>=0x01)
	{
		Addr[0] = 0xA0;	
    	Addr[1] = 0xC0;
    	Len[1]  = 0x10;
		ReadData(ComBuf);  					//读取正向有功电量集合		
				
		ComBuf[0]  = EryTmp[0];
		ComBuf[4]  = EryTmp[1];
		ComBuf[8]  = EryTmp[2];
		ComBuf[12] = EryTmp[3];
		
		TMonth[0]  =  Temp;
    	TMonth[1]  = ~Temp;    	

		for(Temp=0x00;Temp<TBalance[2];Temp++)	//正向有功电量数据
		{   	 		
			Addr[0] = 0xA2; 		
			Addr[1] = LastMonthSN(Temp)<<4;    		
    		Len[1]  = 0x10;
			WriteEPMData(ComBuf);		
		} 

		Addr[0] = 0xA2; 
		Addr[1] = 0xCC;    		
    	Len[1]  = 0x02;
		WriteEPMData(TMonth);				//结算月份
	}
	
	EryBln_Flag = 0;

	ArrayInit(ComBuf,RS_MaxSize);
		
	ES     = 1;
	KBMASK = 0x40;
}




//**********************************************************
// 名称:
// 功能:
// 说明:
//**********************************************************
void Fee_CHK(void)//时段费率检查
{
	uchar TFlag;
	uchar TFee;
	uchar Num[2];
	
	ES  = 0;
	TR0 = 0;
	CommTimer = 0x00;                          //关UART中断
	ComPtr    = 0x00;
	

⌨️ 快捷键说明

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