📄 chiplib.c
字号:
// 入口:val_pn:端口号
// 出口:端口高低电平状态
//*/
//unsigned char ReadPort(unsigned char val_pn)
//{
// unsigned char i;
// unsigned char xdata *point;
// i = 0x01;
// if((val_pn-4) < 0) // port0
// {
// i <<= val_pn;
// point = 0x285b;
// }
// else if((val_pn-9) < 0) // port1
// {
// val_pn -= 4;
// i <<= val_pn;
// point = 0x285f;
// }
// else if((val_pn-14) < 0)// port2
// {
// val_pn -= 9;
// i <<= val_pn;
// point = 0x2863;
// }
// else if((val_pn-18) < 0)// port3
// {
// val_pn -= 14;
// i <<= val_pn;
// point = 0x2867;
// }
// else if((val_pn-26) < 0)// port4
// {
// val_pn -= 18;
// i <<= val_pn;
// point = 0x286b;
// }
// else if((val_pn-34) < 0)// port5
// {
// val_pn -= 26;
// i <<= val_pn;
// point = 0x286f;
// }
// else if((val_pn-42) < 0)// port6
// {
// val_pn -= 34;
// i <<= val_pn;
// point = 0x2873;
// }
// return (*point & i);
//}
//#endif
void Disp_Clear(void)
{
unsigned char i;
unsigned char xdata *point;
point = 0x2800;
for(i=0;i<20;i++)
{
*(point++) = 0x00;
}
}
void Disp_Full(void)
{
unsigned char i;
unsigned char xdata *point;
point = 0x2800;
for(i=0;i<20;i++)
{
*(point++) = 0xff;
}
}
//=======================================================
//函数名:ClearWDT
//函数作用:喂狗操作
//入口参数:无
//出口参数:无
//
//=======================================================
void ClearWDT(void)
{
WDT_EN = 0xa5;
WDT_CLR = 0x5a;
}
/*
函数功能:xram128字节写保护控制
入口:val_para:1表示开启保护,0表示取消保护
*/
void SetXRam(unsigned char val_para)
{
if(val_para)//
{
XRamPwd = 0x32;
}
else
{
XRamPwd = 0x33;
}
}
//===================================================================================================================
//
// 以下是计量模块内容
//
//===================================================================================================================
#define WPADDRESS 0x1094 // 写缓存首地址
#define RLADDRESS 0x1093 // 读缓存末地址
//=======================================================
//函数名:W_Buff
//函数作用:写数据到写缓存
//入口参数:需要写的32位数据
//出口参数:无
//
//=======================================================
void W_Buff(unsigned long lword)
{
unsigned char xdata *point;
point = WPADDRESS;
*(point++) = (unsigned char)lword;
*(point++) = (unsigned char)(lword>>8);
*(point++) = (unsigned char)(lword>>16);
*point = (unsigned char)(lword>>24);
}
//=======================================================
//函数名:W_Byte
//出口参数:无
//
//函数作用:写数据到地址
//入口参数:Addr-目标地址,Wdata-操作数据
//=======================================================
void W_Byte(unsigned int Addr,unsigned char Wdata)
{
unsigned char xdata *point;
point = Addr;
*point = Wdata;
}
//=======================================================
//函数名:R_Byte
//函数作用:从目标地址读数据
//入口参数:目标地址
//出口参数:读出的数据
//
//=======================================================
unsigned char R_Byte(unsigned int Addr)
{
unsigned char xdata *point;
unsigned char Rdata;
point = Addr;
Rdata = *point;
return Rdata;
}
//=======================================================
//函数名:R_Buff
//函数作用:从读缓存读数据
//入口参数:无
//出口参数:读出的32位数据
//
//=======================================================
unsigned long R_Buff(void)
{
unsigned char xdata *point;
unsigned long longword;
point = RLADDRESS;
longword = *(point--);
longword <<= 8;
longword += *(point--);
longword <<= 8;
longword += *(point--);
longword <<= 8;
longword += *(point--);
return longword;
}
//void SetAnalogPara(void)
//{
// //
//}
unsigned char SetADC(unsigned char val_number,unsigned char val_para)
{
unsigned char xdata *point;
unsigned char err,esp;
err = 1;
esp = 0;
point = 0x2894;
switch(val_number)
{
case 1:
*point |= 0x01;point = 0x2888;break;
case 2:
*point |= 0x02;point = 0x2889;break;
case 3:
*point |= 0x04;point = 0x288a;
esp=(val_para<<2);esp++;break; //(val_para=4)<<2 -> esp=0x10;//(val_para=8)<<2 -> esp=0x20;
default:
err = 0;break;
}
if(!err)
return err;
switch(val_para)
{
case 1:
*point = 0;break;
case 2:
*point = 1;break;
case 4:
*point = 2 | esp;break; // 电压0x13
case 8:
*point = 3 | esp;break; // 电压0x23
case 16:
*point = 0x13;break;
case 32:
*point = 0x23;break;
default:
err = 0;break;
}
return err;
}
unsigned char SetMChannel(unsigned char val_channel)
{
unsigned char xdata *point;
unsigned char err;
err = 1;
point = 0x2894;
*point |= 0x08;
point = 0x2893;
switch(val_channel)
{
case 1:
*point = 0x11;break;
case 2:
*point = 0x22;break;
case 3:
*point = 0x03;break;
default:
err = 0;break;
}
return err;
}
/*
函数功能:一般初次上电执行,完成清除滤波器及能量桶内数据
*/
void InitMeter(void)
{
unsigned char xdata *point;
unsigned int WAddr;
// open ADC
point = 0x2894;
*point |= 0x0f;
// write code
point = 0x28a6;
*point = 0xcd;
W_Byte(0x28a1,0x01);
W_Buff(0);
for(WAddr = 0x1000; WAddr <= 0x1089; WAddr++)
{
W_Byte(WAddr,0);
}
W_Byte(0x1078,0);
W_Byte(0x1079,0);
W_Byte(0x28a1,0);
// W_Byte(0x28a2,0x1f); //
// W_Byte(0x28a3,0x02);
W_Buff(0x0);
W_Byte(0x1080,0);
W_Byte(0x1081,0);
W_Byte(0x1082,0);
W_Byte(0x1083,0);
W_Byte(0x1084,0);
W_Byte(0x1085,0);
W_Byte(0x1086,0);
////////////////////////
// W_Buff(0x1a000000);
W_Byte(0x1087,0);
// W_Buff(0x1a000000);
W_Byte(0x1088,0);
//////////////////////////
W_Buff(0x0);
W_Byte(0x1089,0);
// 有功功率gate
W_Buff(0x40000000);//0xf0000000//f//100 ou e//50 ou :0//510 ou :4 //c //0x5f600000 1ou//bf
W_Byte(0x107b,0);
W_Buff(0x00000000);//0x0000000a//a//100 ou f//50 ou :9//510 ou :9 //3 //0x00000000 1ou//3
W_Byte(0x107a,0);
// 有效值脉冲gate
W_Buff(0x000c9900);
W_Byte(0x107d,0);
W_Buff(0x00000000);
W_Byte(0x107c,0);
// W_Byte(0x28a2,0x1f); //
// PmPwd = 0xcc;
point = 0x28a6;
*point = 0xcc;
}
/*
函数功能:设置计量模块各项参数
备注:瑕疵是每个地址都会涉及开关密码
*/
void SetMeterCfg(unsigned long val_data,unsigned char val_addr)
{
unsigned char xdata *point;
unsigned int xdata RealAddr;
// write code
point = 0x28a6;
*point = 0xcd;
RealAddr = 0x1068 + val_addr;
W_Buff(val_data);
W_Byte(RealAddr,0);
point = 0x28a6;
*point = 0xcc;
}
unsigned long ReadMeterPara(unsigned char val_addr)
{
unsigned int xdata RealAddr;
RealAddr = 0x1068 + val_addr;
R_Byte(RealAddr);
return R_Buff();
}
void SetMeterFunc(unsigned char val_nFunc)
{
unsigned char xdata *point;
// write code
point = 0x28a6;
*point = 0xcd;
point = 0x28a2; //0x28a2
*point = (val_nFunc & 0x1f);
point++; //0x28a3
*point = ((val_nFunc>>5) & 0x07);
point = 0x28a6;
*point = 0xcc;
}
unsigned char ReadMeterFunc(void)
{
unsigned char temp; // 没有设置成xdata空间
unsigned char xdata *point;
point = 0x28a2;
temp = *point;
point++;
temp += *point<<5;
return temp;
}
char OpenPDT(void)
{
unsigned char xdata *p;
p = 0x2894;
if((*p & 0x30) == 0x30)
return -1;
p = 0x2896;
*p |= 0x80;
return 1;
}
//=======================================================
//函数名:Set_PLL
//函数作用:打开PLL,并将系统时钟切换至PLL
//入口参数:无
//出口参数:无
//
//=======================================================
void SetPLL(void)
{
/* unsigned char xdata *point;
// 开PLL
point = 0x2894;
*point = 0x30;
point = 0x2897;
*point = 0x8a;
// point = 0x2898;
// *point = 0x01;
// point = 0x28d3;
// while(*point != 1);
// 写密码
point = 0x28d4;
*(point++) = 0xd2;
*(point++) = 0x09;
// 切换时钟
point = 0x28d0;
*point = 0x01;
*/
#pragma asm
// 开PLL
MOV DPTR,#0x2892
MOV A,#0x02
MOVX @DPTR,A
MOV DPTR,#0x2894
MOV A,#0x30
MOVX @DPTR,A
MOV DPTR,#0x2897
MOV A,#0x8a
MOVX @DPTR,A
// INC DPTR
// MOV A,#0x01
// MOVX @DPTR,A
// 写密码
MOV DPTR,#0x28d4
MOV A,#0xd2
MOVX @DPTR,A
INC DPTR
MOV A,#0x09
MOVX @DPTR,A
// 切换时钟
MOV DPTR,#0x28d0
MOV A,#0x01
MOVX @DPTR,A
#pragma endasm
}
void SwitchClk(unsigned char val_value)
{
unsigned char xdata *point;
// 写密码
point = 0x28d4;
*(point++) = 0xd2;
*(point++) = 0x09;
// 切换时钟
point = 0x28d0;
*point = (val_value & 0x01);
}
//===================================================================================================================
//
// 以下是主程序内容
//
//===================================================================================================================
//void main(void)
//{
// unsigned char xdata *point;
////
// SPC_FNC = 0x01;
// point = 0x8002;
// *point = 0x84;
// SPC_FNC = 0x00;
///*
// if(Systate & BIT0)
// {// powerup = 1 -> 外电供电
//// SetPLL();
//// InitMeter();
// }
// else if(!(Systate & BIT1))
// {// powerup = 0 & powerdown = 0 -> 电池供电
//
// }
// if(Systate & BIT2)
// {// rtc reset
//// RTC_Reset();
// }
//#ifdef DEBUG
//#else
// else if(Systate & BIT4)
// {// wdt reset
//// WDT_Reset();
// }
//#endif
// else if(Systate & BIT3)
// {// io reset
//// IO_Reset();
// }
// else
// {// 正常上电
//// Init_Var();
//// Normal_Reset();
//// CrtlLDO |= DGEN;
// }
//*/
//// SetPLL();
//// InitMeter();
//// SetInterrupt(19); // open rtc interrupt
// UserMain();
//// while(1);
//}
void CloseLCD(void)
{
GATE_LCD();
}
void ClosePM(void)
{
SetMeterFunc(0);
GATE_PM();
}
void Sleep(void)
{//unsigned char i;
P1IE_ADDR.bite.b3 = 1; // enable input
P1IE_ADDR.bite.b4 = 1; // enable input
CrtlLDO = 0x0e;
// GATE_LCD();
GATE_PM();
ALTER_32K_RTC();
ALTER_32K_SYS();
for(;1 == ClkSele;);
CrtlADC = 0;
CrtlCLK = 0;
// CrtlPLL = 0;
// while((Systate&0x01) == 0x01);
// CrtlLDO = 0x0e;
SLEEP();
}
void DeepSleep(void)
{
P1IE_ADDR.bite.b3 = 1; // enable input
P1IE_ADDR.bite.b4 = 1; // enable input
CrtlLDO = 0x0e;
GATE_LCD();
GATE_PM();
ALTER_32K_RTC();
ALTER_32K_SYS();
for(;1 == ClkSele;);
CrtlADC = 0;
CrtlCLK = 0;
// CrtlPLL = 0;
// while((Systate&0x01) == 0x01);
// CrtlLDO = 0x0e;
DEEP_SLEEP();
}
//======================================================================
void IAP_FLASH_PageErase(unsigned int page)
{
unsigned char xdata * p;
// unsigned int i;
SetInterrupt(13);
EA = 1;
SPC_FNC = 0x01;
p = 0x0555;
*p = 0xaa;
p = 0x02aa;
*p = 0x55;
p = 0x0555;
*p = 0x80;
p = 0x0555;
*p = 0xaa;
p = 0x02aa;
*p = 0x55;
p = page;
*p = 0x30;
PCON |= 0x01;
SPC_FNC = 0x00;
}
void IAP_FLASH_ByteWrite(unsigned int addr,unsigned char dat)
{
unsigned char xdata * p;
SetInterrupt(13);
EA = 1;
SPC_FNC = 0x01;
p = 0x0555;
*p = 0xaa;
p = 0x02aa;
*p = 0x55;
p = 0x0555;
*p = 0xa0;
p = addr;
*p = dat;
PCON |= 0x01;
SPC_FNC = 0x00;
}
unsigned char IAP_FLASH_ByteRead(unsigned int addr)
{
unsigned char code *point;
point = addr;
return *point;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -