📄 parameter.c
字号:
#include <pic.h>
#include "Pindefine.h"
#include "variable.h"
#define Nop() asm("nop")
const unsigned char ParaDefault[]= //确省定值
{
0x01, //地址
0x00, //波特率
0x00, //PT高字节
0x01, //PT低字节
0x00, //CT高字节
0x01, //CT低字节
};
#define FALSE 0
#define TRUE 1
#define MaxParameter 6
unsigned char Rd_inE2PROM(unsigned int addr);
unsigned char Wr_inE2PROM(unsigned int addr,unsigned char data);
void Load_DefaultValue(void);
void FinishParams(void);
void FinishParams(void);
char CheckParameter(void);
char LoadParameter(void);
unsigned char ReadParameter(void);
unsigned char WriteParameter(void);
/*****************************************************************
函数名称:void Rd_inE2PROM(unsigned int addr)
函数功能:写内部E2PROM
入口参数:addr---内部E2PROM的地址
输 出:
备 注:
******************************************************************/
unsigned char Rd_inE2PROM(unsigned int addr)
{
unsigned char i,j;
EEADRH = (unsigned char)((addr>>8)&0x1f);
EEADR = (unsigned char)(addr&0xff);
EEPGD = 1;
EEDATA = 0;
RD = 1;
Nop();
Nop();
i = EEDATA;
j = EEDATH;
EEPGD = 0;
RD = 0;
return i;
}
/*****************************************************************
函数名称:unsigned char Wr_inE2PROM(unsigned int *addr,unsigned char data)
函数功能:写内部E2PROM
入口参数:addr---内部E2PROM的地址
data---写入的数据
输 出:
备 注: 用查询的方法写EPROM,在写的过程中要关闭系统的中断
关闭最长时间为:8000*2*0.25uS = 2ms
******************************************************************/
unsigned char Wr_inE2PROM(unsigned int addr,unsigned char data)
{
unsigned int i ;
EEADR = addr&0xff;
EEADRH = (addr&0x1f00)>>8;
EEDATA = data;
EEDATH = 0;
GIE = 0; //关闭中断
PEIE = 0;
EEPGD = 1;
WREN = 1;
Nop();
EECON2=0X55;
EECON2=0XAA;
WR = 1;
i = 0;
Nop();
Nop();
Nop();
Nop();
Nop();
EEDATA = 0;
WREN=0;
WR = 0;
GIE = 1; //关闭中断
PEIE = 1;
return TRUE;
}
void Load_DefaultValue(void)
{
unsigned char i,*P;
P = &Para;
for(i=0;i<MaxParameter;i++)
{
Wr_inE2PROM((0x0011+i),ParaDefault[i]); //将源数据写入EEDATA
*P++ = ParaDefault[i];
}
FinishParams();
}
void FinishParams(void)
{
unsigned char crc0,sum0,para;
char i;
Wr_inE2PROM(0x000,0x55);
Wr_inE2PROM(0x001,0xaa);
crc0=0;
sum0=0;
for(i=0;i<MaxParameter;i++)
{
para=Rd_inE2PROM(0x0011+i);
crc0^=para;
sum0^=para;
}
Wr_inE2PROM(0x002,crc0);
Wr_inE2PROM(0x003,sum0);
}
char CheckParameter(void)
{
unsigned char *P,crc0,sum0,data,crc,sum;
char i;
P = &Para;
crc0=Rd_inE2PROM(0x000);
sum0=Rd_inE2PROM(0x001);
if((crc0==0x55)&&(sum0==0xaa)) //定值标志
{
crc=0;
sum=0;
crc0=Rd_inE2PROM(0x002);
sum0=Rd_inE2PROM(0x003);
for(i=0;i<MaxParameter;i++)
{
data=Rd_inE2PROM(0x0011+i);
*P++ = data;
crc^=data;
sum^=data;
}
if((crc==crc0)&&(sum==sum0)) return TRUE;
}
return FALSE;
}
char LoadParameter(void) //调装置定值
{
if(CheckParameter()==FALSE)
{
Load_DefaultValue(); //调确省定值
if(CheckParameter()==FALSE)
{
return FALSE;
}
}
return TRUE;
}
unsigned char ReadParameter(void)
{
if(CheckParameter()==FALSE) Load_DefaultValue(); //调确省定值
return TRUE;
}
unsigned char WriteParameter(void)
{
unsigned char *P,i;
P = &Para;
for(i=0;i<MaxParameter;i++)
{
Wr_inE2PROM((0x0011+i),*P++); //将源数据写入EEDATA
}
FinishParams();
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -