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

📄 drive.c

📁 使用51单片机开发的一个集团电话系统
💻 C
📖 第 1 页 / 共 3 页
字号:
听空音				3
听催挂音				4
用户听回铃			5
用户听振铃			6

信号指示标志的构造是前后个4位表示,注意处理
******************************/
void OPEN_EXT_Signal(unchar Ext_No,unchar Signal_Type)
{
	switch(Signal_Type)
	{
		case 1:
			Micro_Switch_8816(Ext_No,BUSY_Channel, 1);
			Signal_Type <<= 4;
			Signal_Type |= 0x01;
			Ext_Param[Ext_No].Flag_Signal = Signal_Type;
			break;
		case 2:
			Micro_Switch_8816(Ext_No,BUSY2_Channel, 1);
			Signal_Type <<= 4;
			Signal_Type |= 0x01;
			Ext_Param[Ext_No].Flag_Signal = Signal_Type;
			break;
		case 3:
			Micro_Switch_8816(Ext_No,BUSY_Channel, 0);
			Micro_Switch_8816(Ext_No,BUSY2_Channel, 0);
			Micro_Switch_8816(Ext_No,BUSY3_Channel, 0);
			Signal_Type <<= 4;
			Signal_Type |= 0x01;
			Ext_Param[Ext_No].Flag_Signal = Signal_Type;
			break;
		case 4:
			Micro_Switch_8816(Ext_No,BUSY2_Channel, 1);
			Signal_Type <<= 4;
			Signal_Type |= 0x01;
			Ext_Param[Ext_No].Flag_Signal = Signal_Type;
			break;
		case 5:
			Micro_Switch_8816(Ext_No,BUSY3_Channel, 1);
			Signal_Type <<= 4;
			Signal_Type |= 0x01;
			Ext_Param[Ext_No].Flag_Signal = Signal_Type;
			break;
		default:
			break;
	}
}
/******************************
Name:TURN_EXT_Signal(unchar Ext_No)
input:Ext_No,Signal_Type
output:none
description:
将当前的信号音状态反转
******************************/
void TURN_EXT_Signal(unchar Ext_No)
{
unchar data signal,temp;

	signal = Ext_Param[Ext_No].Flag_Signal & 0xf0;
	signal >>= 4;
	Ext_Param[Ext_No].Flag_Signal++;
	Ext_Param[Ext_No].Flag_Signal &= 0xf1;
	temp = Ext_Param[Ext_No].Flag_Signal & 0x01;
	switch(signal)
	{
		case 1:
			Micro_Switch_8816(Ext_No,BUSY_Channel, temp);
			break;
		case 2:
			Micro_Switch_8816(Ext_No,BUSY2_Channel, temp);
			break;
		case 3:
			Micro_Switch_8816(Ext_No,BUSY_Channel, temp);
			break;
		case 4:
			Micro_Switch_8816(Ext_No,BUSY2_Channel, temp);
			break;
		case 5:
			Micro_Switch_8816(Ext_No,BUSY3_Channel, temp);
			break;
		default:
			break;
	}
}
/******************************
Name:STOP_EXT_Signal(unchar Ext_No)
input:Ext_No,Signal_Type
output:none
description:
关闭当前信号音
******************************/
void STOP_EXT_Signal(unchar Ext_No)
{
unchar data signal;

	signal = Ext_Param[Ext_No].Flag_Signal & 0xf0;
	signal >>= 4;
	switch(signal)
	{
		case 1:
			Micro_Switch_8816(Ext_No,BUSY_Channel, 0);
			break;
		case 2:
			Micro_Switch_8816(Ext_No,BUSY2_Channel, 0);
			break;
		case 3:
			Micro_Switch_8816(Ext_No,BUSY_Channel, 0);
			break;
		case 4:
			Micro_Switch_8816(Ext_No,BUSY2_Channel, 0);
			break;
		case 5:
			Micro_Switch_8816(Ext_No,BUSY3_Channel, 0);
			break;
		default:
			break;
	}
	Ext_Timer[Ext_No].Counter_Signal = 0;
	Ext_Param[Ext_No].Flag_Signal = 0;
}
/******************************
Name:OPEN_EXT_Ring(unchar Ext_No)
input:Ext_No,Signal_Type
output:none
description:
信号音的类型说明
用户听振铃			6

改写当前用户组的振铃数据,
同时向用户写入开始振铃数据
******************************/
void OPEN_EXT_Ring(unchar Ext_No)
{
unchar data temp,group;

	group = Ext_No/8;
	temp = Ext_No%8;
	temp = RING<<temp;
	Ext_Group[group].Ext_Ring_ST |= temp;
	XBYTE[(Addr_EXT_Drive+group*Addr_Offset)] = Ext_Group[group].Ext_Ring_ST;
	Ext_Param[Ext_No].Flag_Signal = 0x61;
}
/******************************
Name:TURN_EXT_Ring(unchar Ext_No)
input:Ext_No,Signal_Type
output:none
description:
将当前的振铃状态反转
******************************/
void TURN_EXT_Ring(unchar Ext_No)
{
unchar data temp,group;

	Ext_Param[Ext_No].Flag_Signal++;
	Ext_Param[Ext_No].Flag_Signal &= 0xf1;
	temp = Ext_Param[Ext_No].Flag_Signal & 0x01;
	if( temp )
	{
		group = Ext_No/8;
		temp = Ext_No%8;
		temp = RING<<temp;
		Ext_Group[group].Ext_Ring_ST |= temp;
		XBYTE[(Addr_EXT_Drive+group*Addr_Offset)] = Ext_Group[group].Ext_Ring_ST;
		Ext_Param[Ext_No].Flag_Signal = 0x61;
	}
	else
	{
		group = Ext_No/8;
		temp = Ext_No%8;
		temp = RING<<temp;
		temp =~temp;
		Ext_Group[group].Ext_Ring_ST &= temp;
		XBYTE[(Addr_EXT_Drive+group*Addr_Offset)] = Ext_Group[group].Ext_Ring_ST;
		Ext_Param[Ext_No].Flag_Signal = 0x60;
	}
}
/******************************
Name:STOP_EXT_Ring(unchar Ext_No)
input:Ext_No,Signal_Type
output:none
description:
改写当前用户组的振铃数据,
同时向用户写入停止振铃数据
******************************/
void STOP_EXT_Ring(unchar Ext_No)
{
unchar data temp,group;

	group = Ext_No/8;
	temp = Ext_No%8;
	temp = RING<<temp;
	temp =~temp;
	Ext_Group[group].Ext_Ring_ST &= temp;
	XBYTE[(Addr_EXT_Drive+group*Addr_Offset)] = Ext_Group[group].Ext_Ring_ST;
	Ext_Param[Ext_No].Flag_Signal = 0;
}
/******************************
Name:OPEN_Trk(unchar Ext_No)
input:Ext_No
output:none
description:
打开用户中继线路
******************************/
void OPEN_Trk(unchar Ext_No)
{
unchar data temp,group;

	group = Ext_No/8;
	temp = Ext_No%8;
	temp = OPEN<<temp;
	Ext_Group[group].Ext_Ring_ST |= temp;
	XBYTE[(Addr_EXT_Drive+group*Addr_Offset)] = Ext_Group[group].Ext_Ring_ST;
}
/******************************
Name:CLOSE_Trk(unchar Ext_No)
input:Ext_No
output:none
description:
关闭用户中继线路
******************************/
void CLOSE_Trk(unchar Ext_No)
{
unchar data temp,group;

	group = Ext_No/8;
	temp = Ext_No%8;
	temp = OPEN<<temp;
	temp =~temp;
	Ext_Group[group].Ext_Ring_ST &= temp;
	XBYTE[(Addr_EXT_Drive+group*Addr_Offset)] = Ext_Group[group].Ext_Ring_ST;
}

/******************************
Name:Scan_Ext_Cable(void)
input:	/
output:	cable no
description:
计算出当前可以用的绳路
******************************/
unchar Scan_Ext_Cable(void)
{
unchar data i;

	if( CABLE_USE == TAL_CABLE )
	{
		return 15;
	}

	for(i=(CABLE_USE_NOW+1);i<TAL_CABLE;i++)
	{
		if( CABLE_USE_LIST[i] == 0 )
		{
			CABLE_USE_NOW = i;
			CABLE_USE++;
			CABLE_USE_LIST[i] = 1;	//1表示该绳路使用中0表示空闲
			return i;
		}
	}
	
	for(i=0;i<CABLE_USE_NOW;i++)
	{
		if( CABLE_USE_LIST[i] == 0 )
		{
			CABLE_USE_NOW = i;
			CABLE_USE++;
			CABLE_USE_LIST[i] = 1;
			return i;
		}
	}

	return 15;
}
/******************************
Name:Release_Cable(unchar channel)
input:	channel
output:	/
description:
释放当前计算的绳路
******************************/
void Release_Cable(unchar channel)
{
	CABLE_USE--;
	CABLE_USE_LIST[channel] = 0;
}
/******************************
Name:Use_Cable(unchar channel)
input:	channel
output:	/
description:
占用当前计算的绳路
******************************/
void Use_Cable(unchar channel)
{
	CABLE_USE++;
	CABLE_USE_LIST[channel] = 1;
}
/******************************
Name:Scan_Trk(void)
input:	/
output:	TRK no
description:
计算出当前可以用的中继
使用轮循方式计算新的中继
先计算当前使用的到满用户数的中继是否有空闲
如果有空闲就占用,通过带入中继组号计算
如果中继组的每个成员都是小于标志0x80的,表示
中继用户是空闲的还没有使用,那么就增加
该组的用户使用数量,同时将该用户写入被使用标志0x80
同时取到成员的0x7f号码为中继用户号i
******************************/
unchar Scan_Trk(unchar group)
{
unchar data i;

	for(i=Trk_Group[group].No_Use_Now;i<Trk_Group[group].Num_Member;i++)
	{
		if( Trk_Group[group].Trk_Member[i] < 0x80 )
		{
			if( Ext_Param[Trk_Group[group].Trk_Member[i]].Trk_Group_Param >= 0xfe )
			{
				Trk_Group[group].Num_Use++;
				Trk_Group[group].Trk_Member[i] |= 0x80;
				i = Trk_Group[group].Trk_Member[i] & 0x7f;
				return i;
			}
		}
	}
	
	for(i=0;i<Trk_Group[group].No_Use_Now;i++)
	{
		if( Trk_Group[group].Trk_Member[i] < 0x80 )
		{
			if( Ext_Param[Trk_Group[group].Trk_Member[i]].Trk_Group_Param >= 0xfe )
			{
				Trk_Group[group].Num_Use++;
				Trk_Group[group].Trk_Member[i] |= 0x80;
				i = Trk_Group[group].Trk_Member[i] & 0x7f;
				return i;
			}
		}
	}

	return 0xff;
}
/******************************
Name:Reign_Trk(unchar Ext_No)
input:	Ext_No
output:	1/0
description:
占用当前计算的用户中继
0x80是占用标志,or 标志就是占用
and 0x7f 就是空闲中继
******************************/
void Reign_Trk(unchar Ext_No)
{
unchar xdata i,group;

	group = Ext_Param[Ext_No].Trk_Group_Num;
	for(i=0;i<Trk_Group[group].Num_Member;i++)
	{
		if( (Trk_Group[group].Trk_Member[i]&0x7f) == Ext_No )
		{
			Trk_Group[group].Num_Use++;
			Trk_Group[group].Trk_Member[i] |= 0x80;
		}
	}
}

/******************************
Name:Release_Cable(unchar Ext_No)
input:	Ext_No
output:	1/0
description:
释放当前计算的中继
******************************/
void Release_Trk(unchar Ext_No)
{
unchar xdata i,group;

	group = Ext_Param[Ext_No].Trk_Group_Num;
	for(i=0;i<Trk_Group[group].Num_Member;i++)
	{
		if( (Trk_Group[group].Trk_Member[i]&0x7f) == Ext_No )
		{
			Trk_Group[group].Num_Use--;
			Trk_Group[group].Trk_Member[i] &= 0x7f;
		}
	}
}
/******************************
Name:Release_MeetGroup(unchar group)
input:	group
output:	/
description:
释放当前计算的会议组
******************************/
void Release_MeetGroup(unchar group)
{
unchar data i,SExt_No;

	for(i=0;i<Temp_MeetGroup[group].Num_Member;i++)
	{
		SExt_No = Temp_MeetGroup[group].Meet_Member[i];
		if( SExt_No < TAL_EXT_PORT )
		{
			HostExt_Called_List[SExt_No] = 0;
			HostExt_Calling_List[SExt_No] = 0;
			Temp_MeetGroup[group].Meet_Member[i] = 0xff;
			if( SExt_No != Temp_MeetGroup[group].Manager_Ext )
			{
				if(Ext_Param[SExt_No].Ext_State == state6_Ring )
				{
					Ext_Param[SExt_No].Ext_EVENT = event5_ExtReleaseRing;
					MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No, 
						WP_EVENT, TAL_EVENT, BufSize);//用户主叫挂机,被叫撤铃
				}
				else if(Ext_Param[SExt_No].Ext_State == state8_MeetTalk)
				{
					Ext_Param[SExt_No].Ext_EVENT = event18_MangerRelease;
					MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No, 
						WP_EVENT, TAL_EVENT, BufSize);//用户主叫挂机,通话挂断
				}
			}
		}
	}//对会议组织者进行处理
	
	SExt_No = Temp_MeetGroup[group].Manager_Ext;
	if(Ext_Param[SExt_No].Ext_State == state6_Ring )
	{
		HostExt_Called_List[SExt_No] = 0;
		HostExt_Calling_List[SExt_No] = 0;
		Ext_Param[SExt_No].Ext_EVENT = event5_ExtReleaseRing;
		MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No, 
			WP_EVENT, TAL_EVENT, BufSize);//用户被叫挂机,主叫撤铃
	}
	i = Temp_MeetGroup[group].MeetGroup;

⌨️ 快捷键说明

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