📄 gd485-08.c
字号:
/*******************************************************
*** 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 + -