📄 rtc_dsp.c
字号:
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 + -