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

📄 chiplib.c

📁 电能表源码
💻 C
📖 第 1 页 / 共 3 页
字号:
/*************************************************************************************

	文件类型:底层驱动函数文件
	文件作用:
	修改权限:底层驱动维护人员
	文件相关:
	
	创 建 人:GeminiKQ
	创建日期:2006.12.19
	当前版本:Ver0.1
	
	版本信息:Ver0.1					GeminiKQ

**************************************************************************************/
#include "libextern.h"
#include "Var.h"

//extern void SetPLL(void);

volatile char xdata VPGA1		_at_ 0x28A1;
volatile char xdata VPGA2		_at_ 0x28A2;
volatile char xdata VPGA3		_at_ 0x28A3;


//=lib中全局控制变量==================
volatile unsigned char xdata InstPara _at_ 0x0200;
#define bWRTC 0x01		// 写RTC控制
#define bRRTC 0x02		// 读RTC控制
#define bUrMo 0x04		// 串口模式控制
#define bPari 0x08		// 串口奇偶位控制
//====================================

/*
	函数作用:中断系统控制
	入口参数:val_enint:从低到高每位对应相应中断号,1表示打开,0表示关闭
	备注:
*/
void CfgInterrupt(unsigned long val_enint)
{
	unsigned long temp;
	temp = (unsigned char)val_enint;
	temp &= ~0x80;
	IE = temp;
	temp = val_enint>>7;
	if((unsigned char)temp)
	{
		EIE |= 0x01;
	}
	else
	{
		EIE &= ~0x01;
	}
	ExInt2IE = temp;
	temp = val_enint>>15;
	if((unsigned char)temp)
	{
		EIE |= 0x02;
	}
	else
	{
		EIE &= ~0x02;
	}
	ExInt3IE = temp;
	temp = val_enint>>22;
	if((unsigned char)temp)
	{
		EIE |= 0x04;
	}
	else
	{
		EIE &= ~0x04;
	}
	ExInt4IE = temp;
	temp = val_enint>>27;
	if((unsigned char)temp)
	{
		EIE |= 0x10;
	}
	else
	{
		EIE &= ~0x10;
	}
}
/*

*/
unsigned long ReadInterrupt(void)
{
	unsigned long temp;

	temp = IE;
	temp += ((unsigned long)ExInt2IE) << 7;
	temp += ((unsigned long)ExInt3IE) << 15;
	temp += ((unsigned long)ExInt4IE) << 22;
	temp += ((unsigned long)(EIE & 0x10)) << 27;
	return temp;	
}
/*
	函数功能:开中断
	入口:val_numb:中断号
	返回1表示设置成功,返回0表示设置失败
*/
unsigned char SetInterrupt(unsigned char val_numb)
{
	switch(val_numb)
	{
		case 0:	IE |= 0x01;break;
		case 1:	IE |= 0x02;break;
		case 2:	IE |= 0x04;break;
		case 3:	IE |= 0x08;break;
		case 4:	IE |= 0x20;break;
//		case 5:	IE |= 0x40;break;
//		case 6:	IE |= 0x40;break;
		case 7:	EIE |= 0x01;ExInt2IE |= 0x01;break;
		case 8:	EIE |= 0x01;ExInt2IE |= 0x02;break;
		case 9:	EIE |= 0x01;ExInt2IE |= 0x04;break;
		case 10:EIE |= 0x01;ExInt2IE |= 0x08;break;
		case 11:EIE |= 0x01;ExInt2IE |= 0x10;break;
		case 12:EIE |= 0x01;ExInt2IE |= 0x20;break;
		case 13:EIE |= 0x01;ExInt2IE |= 0x40;break;
		case 14:EIE |= 0x01;ExInt2IE |= 0x80;break;
		case 15:EIE |= 0x02;ExInt3IE |= 0x01;break;
		case 16:EIE |= 0x02;ExInt3IE |= 0x02;break;
		case 17:EIE |= 0x02;ExInt3IE |= 0x04;break;
		case 18:EIE |= 0x02;ExInt3IE |= 0x08;break;
		case 19:EIE |= 0x02;ExInt3IE |= 0x10;break;
		case 20:EIE |= 0x02;ExInt3IE |= 0x20;break;
		case 21:EIE |= 0x02;ExInt3IE |= 0x40;break;
		case 22:EIE |= 0x04;ExInt4IE |= 0x01;break;
		case 23:EIE |= 0x04;ExInt4IE |= 0x02;break;
		case 24:EIE |= 0x04;ExInt4IE |= 0x04;break;
		case 25:EIE |= 0x04;ExInt4IE |= 0x08;break;
		case 26:EIE |= 0x04;ExInt4IE |= 0x10;break;
		case 27:EIE |= 0x10;break;
		default:
			return 0;break;
	}
	return 1;		
}
/*
	函数功能:关中断
	入口:val_numb:中断号
	返回1表示设置成功,返回0表示设置失败
*/
unsigned char ClrInterrupt(unsigned char val_numb)
{
	switch(val_numb)
	{
		case 0:	IE &= ~0x01;break;
		case 1:	IE &= ~0x02;break;
		case 2:	IE &= ~0x04;break;
		case 3:	IE &= ~0x08;break;
		case 4:	IE &= ~0x20;break;
//		case 5:	IE &= ~0x40;break;
//		case 6:	IE &= ~0x40;break;
		case 7:	ExInt2IE &= ~0x01;break;
		case 8:	ExInt2IE &= ~0x02;break;
		case 9:	ExInt2IE &= ~0x04;break;
		case 10:ExInt2IE &= ~0x08;break;
		case 11:ExInt2IE &= ~0x10;break;
		case 12:ExInt2IE &= ~0x20;break;
		case 13:ExInt2IE &= ~0x40;break;
		case 14:ExInt2IE &= ~0x80;break;
		case 15:ExInt3IE &= ~0x01;break;
		case 16:ExInt3IE &= ~0x02;break;
		case 17:ExInt3IE &= ~0x04;break;
		case 18:ExInt3IE &= ~0x08;break;
		case 19:ExInt3IE &= ~0x10;break;
		case 20:ExInt3IE &= ~0x20;break;
		case 21:ExInt3IE &= ~0x40;break;
		case 22:ExInt4IE &= ~0x01;break;
		case 23:ExInt4IE &= ~0x02;break;
		case 24:ExInt4IE &= ~0x04;break;
		case 25:ExInt4IE &= ~0x08;break;
		case 26:ExInt4IE &= ~0x10;break;
		case 27:EIE &= ~0x10;break;
		default:
			return 0;break;
	}
	return 1;		
}
/*
	函数功能:查询中断标记
	入口:val_numb:中断号
	返回-1表示查询失败,返回1和0分别表示中断标记状态
*/
char ReadIntFlg(unsigned char val_numb)
{
	unsigned char temp;
	switch(val_numb)
	{
		case 0:	temp = (TCON & 0x02);break;
		case 1:	temp = (TCON & 0x20);break;
		case 2:	temp = (TCON & 0x08);break;
		case 3:	temp = (TCON & 0x80);break;
		case 4:	temp = (T2CON & 0x80);break;
//		case 5:	IE &= ~0x40;break;
//		case 6:	IE &= ~0x40;break;
		case 7:	temp = (ExInt2IFG & 0x01);break;
		case 8:	temp = (ExInt2IFG & 0x02);break;
		case 9:	temp = (ExInt2IFG & 0x04);break;
		case 10:temp = (ExInt2IFG & 0x08);break;
		case 11:temp = (ExInt2IFG & 0x10);break;
		case 12:temp = (ExInt2IFG & 0x20);break;
		case 13:temp = (ExInt2IFG & 0x40);break;
		case 14:temp = (ExInt2IFG & 0x80);break;
		case 15:temp = (ExInt3IFG & 0x01);break;
		case 16:temp = (ExInt3IFG & 0x02);break;
		case 17:temp = (ExInt3IFG & 0x04);break;
		case 18:temp = (ExInt3IFG & 0x08);break;
		case 19:temp = (ExInt3IFG & 0x10);break;
		case 20:temp = (ExInt3IFG & 0x20);break;
		case 21:temp = (ExInt3IFG & 0x40);break;
		case 22:temp = (ExInt4IFG & 0x01);break;
		case 23:temp = (ExInt4IFG & 0x02);break;
		case 24:temp = (ExInt4IFG & 0x04);break;
		case 25:temp = (ExInt4IFG & 0x08);break;
		case 26:temp = (ExInt4IFG & 0x10);break;
		case 27:temp = (EICON & 0x08);break;
		default:
			return -1;break;
	}
	return temp;		
}
/*
	函数功能:查询方式中清中断标记
	入口:val_numb:中断号
	返回1表示设置成功,返回0表示设置失败
*/
unsigned char ClrIntFlg(unsigned char val_numb)
{
	switch(val_numb)
	{
		case 0:	TCON &= ~0x02;break;
		case 1:	TCON &= ~0x20;break;
		case 2:	TCON &= ~0x08;break;
		case 3:	TCON &= ~0x80;break;
		case 4:	T2CON &= ~0x80;break;
//		case 5:	IE &= ~0x40;break;
//		case 6:	IE &= ~0x40;break;
		case 7:	ExInt2IFG &= ~0x01;break;
		case 8:	ExInt2IFG &= ~0x02;break;
		case 9:	ExInt2IFG &= ~0x04;break;
		case 10:ExInt2IFG &= ~0x08;break;
		case 11:ExInt2IFG &= ~0x10;break;
		case 12:ExInt2IFG &= ~0x20;break;
		case 13:ExInt2IFG &= ~0x40;break;
		case 14:ExInt2IFG &= ~0x80;break;
		case 15:ExInt3IFG &= ~0x01;break;
		case 16:ExInt3IFG &= ~0x02;break;
		case 17:ExInt3IFG &= ~0x04;break;
		case 18:ExInt3IFG &= ~0x08;break;
		case 19:ExInt3IFG &= ~0x10;break;
		case 20:ExInt3IFG &= ~0x20;break;
		case 21:ExInt3IFG &= ~0x40;break;
		case 22:ExInt4IFG &= ~0x01;break;
		case 23:ExInt4IFG &= ~0x02;break;
		case 24:ExInt4IFG &= ~0x04;break;
		case 25:ExInt4IFG &= ~0x08;break;
		case 26:ExInt4IFG &= ~0x10;break;
		case 27:EICON &= ~0x08;break;
		default:
			return 0;break;
	}
	return 1;	
}
//=======================================================
//函数名:Interrupt_Int0
//函数作用:端口中断0,中断向量				(03H)
//======================================================= 
void Interrupt_Int0 (void) interrupt 0 using 2
{
	TCON &= ~BIT1;
	SysIntFlgState |= 0x00000001;
	// user coding begin
	Int0();
}
//=======================================================
//函数名:Interrupt_Timer0
//函数作用:内核timer0中断,中断向量		(0BH)
//======================================================= 
void Interrupt_Timer0 (void) interrupt 1 using 2
{
	TCON &= ~BIT5;
	// user coding begin
	SysIntFlgState |= 0x00000002;
	Int1();		
}
//=======================================================
//函数名:Interrupt_Int1
//函数作用:端口中断1,中断向量				(13H)
//======================================================= 
void Interrupt_Int1 (void) interrupt 2 using 2
{
	TCON &= ~BIT3;
	SysIntFlgState |= 0x00000004;
	// user coding begin
	Int2();	
}
//=======================================================
//函数名:Interrupt_Timer1
//函数作用:内核timer1中断,中断向量		(1BH)
//======================================================= 
void Interrupt_Timer1 (void) interrupt 3 using 2
{
	TCON &= ~BIT7;
	SysIntFlgState |= 0x00000008;
	// user coding begin
	Int3();	
}
//=======================================================
//函数名:Interrupt_Timer2
//函数作用:内核timer2中断,中断向量		(2BH)
//======================================================= 
void Interrupt_Timer2 (void) interrupt 5 using 2
{
	T2CON &= ~BIT7;
	SysIntFlgState |= 0x00000010;
	// user coding begin
	Int4();		
}
//=======================================================
//函数名:Interrupt_Uart1
//函数作用:内核uart1中断,中断向量			(3BH)
//=======================================================
void Interrupt_Uart1 (void) interrupt 7 using 2
{
	if(SCON1 & BIT0)
	{// 接受中断标记
		SCON1 &= ~BIT0;
		SysIntFlgState |= 0x00000020;
		// user coding begin
		Int5();	
	}
	else if(SCON1 & BIT1)
	{// 发送中断标记
		SCON1 &= ~BIT1;
		SysIntFlgState |= 0x00000040;
		// user coding begin
		Int6();	
	}
}
//=======================================================
//函数名:Interrupt_ExInt2
//函数作用:外部中断2,中断向量				(43H)
//=======================================================
void Interrupt_ExInt2 (void) interrupt 8 using 2
{
	unsigned char temp_ifg;
	temp_ifg = ExInt2IE & ExInt2IFG;		// 防止对未使能中断的位操作
	if(temp_ifg & BIT0)
	{// uart2 translate interrupt flag
		ExInt2IFG &= ~BIT0;
		SCON2 &= ~ExUTI;
		SCON2 |= ExUTB8;	// bit9
		SysIntFlgState |= 0x00000080;
		// user coding begin
//		SBUF2 = 0x55;
		Int7();	
	}
	if(temp_ifg & BIT1)
	{// uart2 receive interrupt flag
		ExInt2IFG &= ~BIT1;
		SCON2 &= ~ExURI;
		SysIntFlgState |= 0x00000100;
		// user coding begin
		Int8();	
	}
	if(temp_ifg & BIT2)
	{// uart4 transfer interrupt flag
		ExInt2IFG &= ~BIT2;
		SCON4 &= ~ExUTI;
		SCON4 |= ExUTB8;	// bit9
		SysIntFlgState |= 0x00000200;
		// user coding begin
		Int9();	
	}
	if(temp_ifg & BIT3)
	{// uart4 receive interrupt flag
		ExInt2IFG &= ~BIT3;
		SCON4 &= ~ExURI;
		SysIntFlgState |= 0x00000400;
		// user coding begin
		Int10();	
	}
	if(temp_ifg & BIT4)
	{// uart2timer0 interrupt
		ExInt2IFG &= ~BIT4;
		// user coding begin
		SysIntFlgState |= 0x00000800;
		Int11();	
//		P1OE = 0;
//		P1OD ^= BIT3;
	}
	if(temp_ifg & BIT5)
	{// uart4timer0 interrupt
		ExInt2IFG &= ~BIT5;
		SysIntFlgState |= 0x00001000;
		// user coding begin
		Int12();	
//		P1OE = 0;
//		P1OD ^= BIT4;
	}
	if(temp_ifg & BIT6)
	{// flash erase interrupt
		ExInt2IFG &= ~BIT6;
		SysIntFlgState |= 0x00002000;
		// user coding begin
		Int13();	
	}
	if(temp_ifg & BIT7)
	{// CF impluse interrupt
		ExInt2IFG &= ~BIT7;
		SysIntFlgState |= 0x00004000;
		// user coding begin
		Int14();	
	}	
	EXIF &= ~BIT4;
}
//=======================================================
//函数名:Interrupt_ExInt3
//函数作用:外部中断3,中断向量				(4BH)			
//=======================================================
void Interrupt_ExInt3 (void) interrupt 9 using 2
{
	unsigned char temp_ifg;
	unsigned char xdata *point;
	point = 0;
	temp_ifg = ExInt3IE & ExInt3IFG;
	if(temp_ifg & BIT0)
	{// uart3 transfer interrupt flag
		ExInt3IFG &= ~BIT0;
		SCON3 &= ~ExUTI;
		SCON3 |= ExUTB8;	// bit9
		SysIntFlgState |= 0x00008000;
		// user coding begin
		Int15();	
//		SBUF3 = 0x55;
//		P1OE = 0;
//		P1OD ^= BIT3;
	}
	if(temp_ifg & BIT1)
	{// uart3 receive interrupt flag
		ExInt3IFG &= ~BIT1;
		SCON3 &= ~ExURI;
		SysIntFlgState |= 0x00010000;
		// user coding begin
		Int16();	
//		if(SBUF3 == 0x55)
	//	{
		//	P1OE = 0;
			//P1OD ^= BIT3;
	//	}			
	}
	if(temp_ifg & BIT2)
	{// uart5 transfer interrupt flag
		ExInt3IFG &= ~BIT2;
		SCON5 &= ~ExUTI;
		SCON5 |= ExUTB8;	// bit9
		SysIntFlgState |= 0x00020000;
		// user coding begin
		Int17();	
	}
	if(temp_ifg & BIT3)
	{// uart5 receive interrupt flag
		ExInt3IFG &= ~BIT3;
		SCON5 &= ~ExURI;
		SysIntFlgState |= 0x00040000;
		// user coding begin
		Int18();	
	}
	if(temp_ifg & BIT4)
	{// uart3timer0 interrupt
		ExInt3IFG &= ~BIT4;
		SysIntFlgState |= 0x00080000;
		// user coding begin
		Int19();	
//		P1OE = 0;
//		P1OD ^= BIT1;
	}	
	if(temp_ifg & BIT5)
	{// uart5timer0 interrupt
		ExInt3IFG &= ~BIT5;
		SysIntFlgState |= 0x00100000;
		// user coding begin
		Int20();	
//		P1OE = 0;
//		P1OD ^= BIT2;
	}
	if(temp_ifg & BIT6)
	{// rtc interrupt
		ExInt3IFG &= ~BIT6;
		if(InstPara & bWRTC)
		{
			InstPara &= ~bWRTC;
			/* RTC允许写 */
			RTC_PEN = 0x96;	//password 1
			RTCPWD = 0xd7;	//password 2
			/* 写RTC时间 */	
//			RTCYC = RTCTIME.rYear;
//			RTCMoC = RTCTIME.rMonth;
//			RTCDC = RTCTIME.rDate;
//			RTCHC = RTCTIME.rHour;
//			RTCMiC = RTCTIME.rMinute;
//			RTCSC = RTCTIME.rSecond;
//			RTCWC = RTCTIME.rWeek;
			RTCYC = *(point++);
			RTCMoC = *(point++);
			RTCDC = *(point++);
			RTCHC = *(point++);
			RTCMiC = *(point++);
			RTCSC = *(point++);
			RTCWC = *(point++);
			/* RTC禁止写 */ 	
			RTC_PEN = 0x96;	//
			RTCPWD = 0xd6;
		}
		else
		{ 
			InstPara &= ~bRRTC;
		}
		SysIntFlgState |= 0x00200000;
		// user coding begin
		Int21();	
//		Bottom_State |= BIT0;
//		P2OD ^= BIT5;
	}
	EXIF &= ~BIT5;
}
//=======================================================
//函数名:Interrupt_ExInt4
//函数作用:外部中断4,中断向量				(53H)
//======================================================= 
void Interrupt_ExInt4 (void) interrupt 10 using 2
{
	unsigned char temp_ifg;
	temp_ifg = ExInt4IE & ExInt4IFG;
	if(temp_ifg & BIT0)
	{
		ExInt4IFG &= ~BIT0;
		SysIntFlgState |= 0x00400000;
		// user coding begin
		Int22();	
//		P1OE = 0;
//		P1OD &= ~BIT3;
	}
	if(temp_ifg & BIT1)
	{
		ExInt4IFG &= ~BIT1;
		SysIntFlgState |= 0x00800000;
		// user coding begin
		Int23();	
//		P1OE = 0;
//		P1OD &= ~BIT4;
	}
	if(temp_ifg & BIT2)
	{
		ExInt4IFG &= ~BIT2;
		SysIntFlgState |= 0x01000000;
		// user coding begin
		Int24();	
//		P1OE = 0;
//		P1OD &= ~BIT1;
	}
	if(temp_ifg & BIT3)
	{
		ExInt4IFG &= ~BIT3;
		SysIntFlgState |= 0x02000000;
		// user coding begin
		Int25();	
//		P1OE = 0;
//		P1OD &= ~BIT2;
	}
	if(temp_ifg & BIT4)
	{
		ExInt4IFG &= ~BIT4;
		SysIntFlgState |= 0x04000000;
		// user coding begin
		Int26();	
//		P1OE = 0;
//		P1OD &= ~BIT3;
	}
	EXIF &= ~BIT6;
}
//=======================================================
//函数名:Interrupt_PF
//函数作用:系统掉电预警中断,中断向量		(63H)
//======================================================= 
void Interrupt_PF (void) interrupt 12 using 2

⌨️ 快捷键说明

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