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

📄 chiplib.c

📁 电能表源码
💻 C
📖 第 1 页 / 共 3 页
字号:
//	入口: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 + -