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

📄 chiplib.c

📁 电能表源码
💻 C
📖 第 1 页 / 共 3 页
字号:
{// powerdown interrupt
	EICON &= ~BIT3;
	SysIntFlgState |= 0x08000000;
	// user coding begin
	Int27();	
//	P1OE = 0;
//	P1OD &= ~BIT3;
}

//=======================================================
//函数名:Init_RTC
//函数作用:RTC模块初始化
//入口参数:val_tsfot---RTC时钟源选择:0--32K,1--PLL
//			val_sp------休眠唤醒间隔时间选择
//出口参数:无
//备注:RTC工作频率选择由PLLSEL决定:0--50hz,1--60hz
//======================================================= 
void CfgRTC(unsigned char val_tsfot,unsigned char val_sp)
{
	unsigned char i=0;
	/* 复位RTC操作 */
//	RTC_PEN = 0x96;	//password 1
//	RTCPWD = 0x57;	//password 2

	/* RTC允许写 */
	RTC_PEN = 0x96;	//password 1
	RTCPWD = 0xd7;	//password 2
	
	/* RTC时钟初始化 */
	if(val_tsfot)
	{
		i = 0x08;
	}
	if(CrtlCLK & 0x10)
	{
		i |= 0x04;
	}
	RTCSFTO = i;	
	/* 休眠唤醒间隔时间初始化 */
	INT_RTC = val_sp;
	
	/* RTC禁止写 */ 
	RTC_PEN = 0x96;	//
	RTCPWD = 0xd6;
}

void SetRTCTime(struct RTCTime pRTCTimeSet)
{
	unsigned char xdata *point;
	point = 0;
//	RTCTIME.rYear = pRTCTimeSet.rYear;
//	RTCTIME.rMonth = pRTCTimeSet.rMonth;
//	RTCTIME.rDate = pRTCTimeSet.rDate;
//	RTCTIME.rHour = pRTCTimeSet.rHour;
//	RTCTIME.rMinute = pRTCTimeSet.rMinute;
//	RTCTIME.rSecond = pRTCTimeSet.rSecond;
//	RTCTIME.rWeek = pRTCTimeSet.rWeek;
	*(point++) = pRTCTimeSet.rYear;
	*(point++) = pRTCTimeSet.rMonth;
	*(point++) = pRTCTimeSet.rDate;
	*(point++) = pRTCTimeSet.rHour;
	*(point++) = pRTCTimeSet.rMinute;
	*(point++) = pRTCTimeSet.rSecond;
	*(point++) = pRTCTimeSet.rWeek;
	InstPara |= bWRTC;		// 写准备就绪
}

unsigned char ReadRTCTime(void)
{
	unsigned char xdata *point;
	point = 0;
	if(InstPara & bWRTC)
	{
		return 0;
	}
	InstPara |= bRRTC;		// 读开始
//	RTCTIME.rYear = RTCYC;
//	RTCTIME.rMonth = RTCMoC;
//	RTCTIME.rDate = RTCDC;
//	RTCTIME.rHour = RTCHC;
//	RTCTIME.rMinute = RTCMiC;
//	RTCTIME.rSecond = RTCSC;
//	RTCTIME.rWeek = RTCWC;
	*(point++) = RTCYC;
	*(point++) = RTCMoC;
	*(point++) = RTCDC;
	*(point++) = RTCHC;
	*(point++) = RTCMiC;
	*(point++) = RTCSC;
	*(point++) = RTCWC;
	if(InstPara & bRRTC)
	{
		return 1;						// 读成功
	}
	return 0;							// 读失败,需要重读
}

void AdjustRTC(unsigned char val_dp,unsigned char val_gph,unsigned char val_gpl)
{
	/* RTC允许写 */
	RTC_PEN = 0x96;	//password 1
	RTCPWD = 0xd7;	//password 2

	/* 写RTC修正寄存器 */
	RTCLC = val_dp;	// 低频修正
	RTCHCH = val_gph;	// 高频修正高位
	RTCHCL = val_gpl;	// 高频修正低位

	/* RTC禁止写 */ 
	RTC_PEN = 0x96;	//
	RTCPWD = 0xd6;
}	
/*
	函数功能:配置timer参数
	入口参数:结构体
	备注:定时器号为2-5
*/
void CfgET(struct ETMode ETMODE)
{
	unsigned char xdata *point;//
	ETMODE.tMode &= 0x0f;		// 只关心低4位
	point = 0x2820 + (8*(ETMODE.tName-2));// TCONx

	point++;								// TMODx
	*point |= ETMODE.tMode;
	point++;								// TH0
	*point = ETMODE.tDH;
	point++;								//
	point++;								// TL0
	*point = ETMODE.tDL;
	point++;								//
	point++;								// SCONx	
	point -= 6;								// TCONx
	if(ETMODE.tClk)
	{
		*point |= 0x10;
	}
	// TR0 = 1
	*point |= 0x01;													// 
}
/*
	函数功能:串口配置
	入口:	val_numb---串口号-----------2/3/4/5
			val_bps----串口波特率-------1200bps/2400bps/4800bps/9600bps
			val_bit----串口方式---------10(bit)/11(bit)
			val_parity-奇偶校验位设定---0(even)/非0(odd)
	出口:	1----设置成功
			0----串口号出错
			-1---串口方式出错
			-2---波特率出错			
	注:目前支持串口方式为10位/11位;波特率支持1200bps,2400bps,4800bps,9600bps		
*/
char CfgEU(unsigned char val_numb,unsigned int val_bps,unsigned char val_bit,unsigned char val_parity)
{
	unsigned char temp1,temp2;
	unsigned char xdata *point;//
	temp2 = 0;
//==================串口号定位================================	
	if(val_numb > 5 || val_numb <2)
	{
		return 0;													// 串口号找不到
	}
	point = 0x2820 + (8*(val_numb-2));	// TCONx
	*point &= ~0xa2;					// clear T1M & SMOD & TR1
//==================波特率发生器模式设定======================	
	point++;							// TMODx
	*point |= 0x20;				// 8-bit counter with auto-reload
//==================串口波特率设定============================	
	switch(val_bps)
	{
		case 300:	temp1 = 0xc7;temp2 = 2;break;	// T1M = 0,SMOD = 1;
		case 600:	temp1 = 0xf2;temp2 = 3;break;	// T1M = 0,SMOD = 0;
		case 1200:	temp1 = 0xab;break;				// T1M = 1,SMOD = 0;
		case 2400:	temp1 = 0xab;temp2 = 1;break;	// T1M = 1,SMOD = 1;
		case 4800:	temp1 = 0xeb;break;				// T1M = 1,SMOD = 0;
		case 9600:	temp1 = 0xeb;temp2 = 1;break;	// T1M = 1,SMOD = 1;
//		case 11520:
		default:	return -2;break;				// 波特率不支持
	}		
	point += 2;							// TH1
	*point = temp1;
	point += 2;							// TL1
	*point = temp1;
//==================串口方式设定==============================	
	point++;							// SCONx
	if(val_bit == 11)
	{						
		*point = 0xd0;						// 
		InstPara |= bUrMo;				// 串口模式有校验位
	}
	else if(val_bit == 10)
	{
		*point = 0x50;						//
		InstPara &= ~bUrMo; 				// 串口模式无校验位
	}
	else
	{
		return -1;								// 串口方式不支持
	}
//===================奇偶校验位设定============================	
	if(val_parity)
	{
		InstPara |= bPari;
	}
	else
	{
		InstPara &= ~bPari;
	}
//===================波特率加倍设定============================	
	point -= 6;							// TCONx
	if(temp2 == 0)
	{
		*point |= 0x20;					// T1M = 1 波特率不加倍
	}
	else if(temp2 == 1)
	{
		*point |= 0x20 | 0x80;			// T1M = 1 波特率加倍
	}
	else if(temp2 == 2)
	{
		*point |= 0x80;					// T1M = 0 波特率加倍
	}
//	if(temp2)
//	{
//		*point |= 0x80;
//	}
//===================开启波特率发生器==========================		
	*point |= 0x02;						// TR1 = 1;
	return 1;
}
/*
	函数功能:向对应串口发送一个字节数据
	入口:val_data:希望发送的数据
				val_numb:希望发送的串口号
	出口:1----发送成功
				0----串口号出错			
*/
char SendUData(unsigned char val_data,unsigned char val_numb)
{
	unsigned char xdata *point;
	unsigned char temp;
	if(val_numb > 5 || val_numb <2)
	{
		return 0;							// 串口号找不到
	}
	temp = 8*(val_numb-2);
	point = 0x2826 + temp;	// SCONx
//	if(InstPara & bUrMo)
//	{
//		temp = InstPara & bPari;
//		temp >>= 3;						// InstPara.bit3
//		ACC = val_data;
/*		if(P)
		{
			if(temp)
			{
				*point &= ~0x08;		// SCONx.bit3
			}
			else
			{
				*point |= 0x08;
			}
		}
		else
		{
			if(temp)
			{
				*point |= 0x08;
			}
			else
			{
				*point &= ~0x08;
			}
		}*/
//	}
	point++;
	*point = val_data;
	return 1;
}
/*
	函数功能:从串口接受一个字节数据
	入口:串口号
	出口:低8位为受到数据
				高8位中0x01表示校验错误,0x02表示串口号出错
*/
int RecvUData(unsigned char val_numb)
{
	unsigned char xdata *point;
	unsigned char temp,temp_data;
	if(val_numb > 5 || val_numb <2)
	{
		return 0x0200;				// 串口号找不到
	}
	temp = 8*(val_numb-2);
	point = 0x2827 + temp;	// SBUFx
	temp_data = *point;
//	temp = InstPara & bPari;
//	temp >>= 1;
//	if(InstPara & bUrMo)
//	{
//		point--;								// SCONx
//		ACC = temp_data;
//		if(P)
//		{
//			if(((InstPara & bPari)>>1) != (*point & 0x04))
//			{
//				return temp_data;
//			}
//			else
//			{
//				return (int)temp_data + 0x0100;
//			}
//		}
//		else
//		{
//			if(((InstPara & bPari)>>1) == (*point & 0x04))
//			{
//				return temp_data;
//			}
//			else
//			{
//				return (int)temp_data + 0x0100;
//			}
//		}		
//	}
	return temp_data;
}
/*
	函数功能:设定红外调制参数
	入口参数:val_dute1:高电平持续时间
						val_dute2:低电平持续时间
	说明:两个参数相加之和应为86,才能保证38K信号;如果两个参数都为0,则表示关闭红外调制					
*/
void SetIR(unsigned char val_dute1,unsigned char val_dute2)
{
	if(val_dute1 == 0 && val_dute2 == 0)
	{
		Txd2FS = 0x01;
	}
	else
	{
		Txd2FS = 0x00;//
		CARRH = val_dute1;
		CARRL = val_dute2;	
	}
}

void CfgLCD(unsigned char val_cfg)
{
	Ctrl_LCD = val_cfg;
}

/*
	函数功能:配置LCD显存
	入口参数:	pAddrLCD:指针,指向用户定义的数组首地址
				val_start:从LCDM0开始的偏移量开始写入数据
				val_numb:需要写显存的个数
	备注:用户定义的数组需要存放在xdata地址空间
*/
void SetLCDData(unsigned char xdata *pAddrLCD,unsigned char val_start,unsigned char val_numb)
{
	unsigned char xdata *point1;
	unsigned char xdata *point2;
	unsigned char i;
	point1 = 0x2800 + val_start;
	point2 = pAddrLCD;
	for(i = 0; i < val_numb; i++)
	{
		*(point1++) = *(point2++);
	}
}

/*
	函数功能:端口配置操作
	入口参数:val_pn----端口号(0-42)
						val_pf----端口特殊功能选择(只有4-14端口具备)
	备注:
*/
void CfgPort(unsigned char val_pn,unsigned char val_pf)
{
	if(val_pn == 4)			// 特殊功能选择
	{
		switch(val_pf)
		{
			case 0:
			case 1:P10FS = val_pf;break;
			default:P10FS = 0x00;break;
		}
	}
	else if(val_pn == 5)			// 特殊功能选择
	{
		switch(val_pf)
		{
			case 0:
			case 3:
			case 4:P11FS = val_pf;break;
			default:P11FS = 0x00;break;
		}
	}
	else if(val_pn == 6)			// 特殊功能选择
	{
		switch(val_pf)
		{
			case 0:
			case 3:
			case 4:P12FS = val_pf;break;
			default:P12FS = 0x00;break;
		}
	}
	else if(val_pn == 7)			// 特殊功能选择
	{
		switch(val_pf)
		{
			case 0:
			case 2:
			case 3:P13FS = val_pf;break;
			default:P13FS = 0x00;break;
		}
	}
	else if(val_pn == 8)			// 特殊功能选择
	{
		switch(val_pf)
		{
			case 0:
			case 2:
			case 3:P14FS = val_pf;break;
			default:P14FS = 0x00;break;
		}
	}
	else if(val_pn == 9)			// 特殊功能选择
	{
		switch(val_pf)
		{
			case 0:
			case 2:
			case 3:P20FS = val_pf;break;
			default:P20FS = 0x00;break;
		}
	}
	else if(val_pn == 10)			// 特殊功能选择
	{
		switch(val_pf)
		{
			case 0:
			case 2:
			case 3:P21FS = val_pf;break;
			default:P21FS = 0x00;break;
		}
	}
	else if(val_pn == 11)			// 特殊功能选择
	{
		switch(val_pf)
		{
			case 0:
			case 2:P22FS = val_pf;break;
			default:P22FS = 0x00;break;
		}
	}
	else if(val_pn == 12)			// 特殊功能选择
	{
		switch(val_pf)
		{
			case 0:
			case 2:P23FS = val_pf;break;
			default:P23FS = 0x00;break;
		}
	}
	else if(val_pn == 13)			// 特殊功能选择
	{
		switch(val_pf)
		{
			case 0:
			case 2:P24FS = val_pf;break;
			default:P24FS = 0x00;break;
		}
	}
	else if(val_pn == 14)			// 特殊功能选择
	{
		switch(val_pf)
		{
			case 0:
			case 2:P25FS = val_pf;break;
			default:P25FS = 0x00;break;
		}
	}
}
//#ifdef LARGE
///*
//	函数功能:写端口数据
//	入口:val_pn:端口号
//				val_value:1表示输出1,0表示输出0
//*/
//void SetPort(unsigned char val_pn,unsigned char val_value)
//{
//	unsigned char i;
//	unsigned char xdata *point;
//	i = 0x01;
//	if(val_pn >= 0 && val_pn < 4)	// port0
//	{
//		i <<= val_pn;
//		point = 0x285a;
//	}
//	else if(val_pn >= 4 && val_pn < 9)	// port1
//	{
//		i <<= (val_pn-4);
//		point = 0x285e;
//	}
//	else if(val_pn >= 9 && val_pn < 14)	// port2
//	{
//		i <<= (val_pn-9);
//		point = 0x2862;
//	}
//	else if(val_pn >= 14 && val_pn < 18)	// port3
//	{
//		i <<= (val_pn-14);
//		point = 0x2866;
//	}
//	else if(val_pn >= 18 && val_pn < 26)	// port4
//	{
//		i <<= (val_pn-18);
//		point = 0x286a;
//	}
//	else if(val_pn >= 26 && val_pn < 34)	// port5
//	{
//		i <<= (val_pn-26);
//		point = 0x286e;
//	}
//	else if(val_pn >= 34 && val_pn < 42)	// port6
//	{
//		i <<= (val_pn-34);
//		point = 0x2872;
//	}
//	if(val_value)
//	{
//		*point |= i;
//	}
//	else
//	{
//		*point &= ~i;
//	}
//}
///*
//
//*/
//void XorPort(unsigned char val_pn)
//{
//	unsigned char i;
//	unsigned char xdata *point;
//	i = 0x01;
//	if(val_pn >= 0 && val_pn < 4)	// port0
//	{
//		i <<= val_pn;
//		point = 0x285a;
//	}
//	else if(val_pn >= 4 && val_pn < 9)	// port1
//	{
//		i <<= (val_pn-4);
//		point = 0x285e;
//	}
//	else if(val_pn >= 9 && val_pn < 14)	// port2
//	{
//		i <<= (val_pn-9);
//		point = 0x2862;
//	}
//	else if(val_pn >= 14 && val_pn < 18)	// port3
//	{
//		i <<= (val_pn-14);
//		point = 0x2866;
//	}
//	else if(val_pn >= 18 && val_pn < 26)	// port4
//	{
//		i <<= (val_pn-18);
//		point = 0x286a;
//	}
//	else if(val_pn >= 26 && val_pn < 34)	// port5
//	{
//		i <<= (val_pn-26);
//		point = 0x286e;
//	}
//	else if(val_pn >= 34 && val_pn < 42)	// port6
//	{
//		i <<= (val_pn-34);
//		point = 0x2872;
//	}
//	*point ^= i;
//}
//
///*
//	函数功能:读端口数据

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -