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

📄 ext5.c

📁 一个完整的用用AVR单片机开发的电话交换机程序 希望对想学习AVR开发人有帮助
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "main.h"



void fnExt5_Free(void)                       //0 内线空闲  
{
 
 unsigned char i,j;

 if (bit_is_clear(ExtTelStateCheck,cExt5Num)) return;  //本内线提机
    Writesoundway(SigCallID,cExt5Num,OFF);      //

	i = fnLinkLineIn_Ext(cExt5Num);  // Get Line Out

	if (!i)
	{
		i= fnLinkExtLineY4Y5(cExt5Num);
		if (!i) // Have not Y4Y5
		{
			Ext5_FunPt=4;//4 内线没连任何线
			return;
		}else // Get One of Y4 / Y5
		  {
		 		j = fnLinkDTMF_Ext(i);    // Get DTMF
				
				if (!j) // No any DTMF
				{
					fnCutOffY4Y5(i);
					Ext5_FunPt=4;//4 内线没连任何线
					return;
				}
			}	
		
		mExt5_Link[0] =i;
		mExt5_Link[1] =j;  		
		Ext5_FunPt=3;                          //3 内线连DTMF
        Ext5_dialtime=10000;                      //10s操作

	}else
		{
			j = fnLinkDTMF_Ext(i-1);    // Get DTMF
			mExt5_Link[0] =i;
			mExt5_Link[1] =j; 
			if (!j)
				{
			   		Ext5_FunPt=2;                       //2 内线连外线
					Ext5_dialtime = 0;
				}else
			 		{
						Ext5_FunPt=1;                     //1 内线连外线 + DTMF
						Ext5_dialtime=10000;                 //10s操作
                        return;
			 		}
		}
}



void fnExt5_LinkLineOut_DTMF(void)                        //1 内线连外线 + DTMF
{
 unsigned char i,j;

 	if (bit_is_clear(ExtTelStateCheck,cExt5Num)) 
 	{
		Ext5_FunPt=0;    //0 fnExt5_Free 	内线空闲 
		fnCutOffLineIn(mExt5_Link[0]);
		fnCutOffDTMF(mExt5_Link[1]);
		return;
 	}
  
	if(!Ext5_dialtime)
     {
		Ext5_FunPt=5;    // fnExt5_Err
		fnCutOffLineIn(mExt5_Link[0]);
		fnCutOffDTMF(mExt5_Link[1]);
		Writesoundway(Connect_Busy,cX_Ext5,ON); //;连接忙音
		return;
      }

	Ext5_dialtime--;

	mDTMF_In=DTMF_Decode(mExt5_Link[1]);
	if (!mDTMF_In) return;

	if (mDTMF_In == cXin)
	{		      
	    fnCutOffLineIn(mExt5_Link[0]);
		fnCutOffDTMF(mExt5_Link[1]);
		i= fnLinkExtLineY4Y5(cExt5Num);
		if (!i)
		{ 							
		   Ext5_FunPt=5;                 //5	fnExt5_Err  Dial Wong Extension Numer / LintOut be TimeOut;
		   Writesoundway(Connect_Busy,cX_Ext5,ON); //;连接忙音
		   return;
		 }else
		   {
             j = fnLinkDTMF_Ext(i);    // Get DTMF			
			  if (!j) // No any DTMF
			   {
			      Ext5_FunPt=5;        //5	fnExt5_Err  Dial Wong Extension Numer / LintOut be TimeOut;
				  fnCutOffY4Y5(i);
				  Writesoundway(Connect_Busy,cX_Ext5,ON); //;连接忙音
				  return;
				}

				mExt5_Link[0] =i;
				mExt5_Link[1] =j;  		
				Ext5_FunPt=14; 			//14	fnExt5_LinkDTMF_InputExtNm 内线连DTMF Wait Input (1-6,7,#) 3 ->5,6	
        		Ext5_dialtime=10000;       //10s操作
				Writesoundway(mExt5_Link[0],(mExt5_Link[0]+10),ON); //连接模拟电信音
				Writesoundway(mExt5_Link[0],cX_Ext5,ON); //连接模拟电信音
			 }
	  }
	  else // Not Key "*"
		{
		    Ext5_FunPt=2; //fnExt5_LinkLineOut,			//2 内线连外线 2 ->0
			Ext5_dialtime=0;
			fnCutOffDTMF(mExt5_Link[1]);
		 }		
}

void fnExt5_LinkLineOut(void)			//2 内线连外线 2 ->0
{
  if (Ext5_dialtime)  { Ext5_dialtime--; return; }  // 10ms Delay
  
  if(!(ExtTelStateCheck & cExt5Bit) && !(ExtTelFlashState & cExt5Bit)) //挂机
   {
	    Ext5_FunPt=0;                                    //0 fnExt5_Free 	内线空闲 
	    if(MulTalkState)
        {
          MulTalkState=0;
		  Writesoundway((mExt5_Link[0]-1),cExt5Num,OFF);
		  mExt5_Link[0]=0;
          return;
         }
	    fnCutOffLineIn(mExt5_Link[0]);
		mExt5_Link[0]=0;
	    
  }
  else if(ExtTelStateCheck & ExtTelFlashState & cExt5Bit) //转接
  {
     if(FlashtimeState) return;                    //只允许一次拍打
	 mExt5_Link[1]=fnLinkDTMF_Ext(Connect_Flash);  //查找DTMF
	 if(mExt5_Link[1])                             //有DTMF
     {
	    FlashtimeState=1;                          //禁止其他分机拍打
		Flash_For_Out_Ext=0;                       //0 For Out   1  For Ext
		Ext5_NumdialOut=mExt5_Link[0];
		Ext5_LineY4Y5Num=mExt5_Link[0];
	    Writesoundway(mExt5_Link[0]-1,cExt5Num,OFF);
        Writesoundway(mExt5_Link[0]-1,cX_Music,ON);
        Writesoundway(Connect_Flash,cX_Ext5,ON);            //连接模拟电信音
	    Writesoundway(Connect_Flash,(mExt5_Link[1]+13),ON); //连接模拟电信音
		
	    Ext5_FunPt=10;
	    Ext5_dialtime=10000;  	   	     	        
      }
   }
}



void  fnExt5_LinkDTMF(void)			//3 内线连DTMF 3 ->14,5,6
{

 	if (bit_is_clear(ExtTelStateCheck,cExt5Num)) 
 	{
		Ext5_FunPt=0;    //0 fnExt5_Free 	内线空闲 
		fnCutOffY4Y5(mExt5_Link[0]);
		fnCutOffDTMF(mExt5_Link[1]);
		return;
 	}
  
	if(!Ext5_dialtime)
      {
		Ext5_FunPt=5;    // fnExt5_Err
		fnCutOffY4Y5(mExt5_Link[0]);
		fnCutOffDTMF(mExt5_Link[1]);
		Writesoundway(Connect_Busy,cX_Ext5,ON); //;连接忙音
		return;

	   }
	Ext5_dialtime--;

	mDTMF_In=DTMF_Decode(mExt5_Link[1]);
	if (!mDTMF_In) return;

	if (mDTMF_In == cXin)
	{
		Ext5_FunPt=14; 			//14	fnExt5_LinkDTMF_InputExtNm 内线连DTMF Wait Input (1-6,7,#) 3 ->5,6	
        Ext5_dialtime=10000;                      //10s操作
		Writesoundway(mExt5_Link[0],(mExt5_Link[0]+10),ON); //连接模拟电信音
		Writesoundway(mExt5_Link[0],cX_Ext5,ON); //连接模拟电信音
	}else // Not Key "*"
	{
  		Ext5_FunPt=5; //5	fnExt5_Err  Dial Wong Extension Numer / LintOut be TimeOut;	fnCutOffDTMF(mExt5_Link[1]);
		fnCutOffY4Y5(mExt5_Link[0]);
		Writesoundway(Connect_Busy,cX_Ext5,ON); //;连接忙音
     }
}


void fnExt5_NotLinkAnyThing(void) //		//4 内线没连任何线 4 -> 0
{
	if (bit_is_clear(ExtTelStateCheck,cExt5Num)) 
 	{
		Ext5_FunPt=0;    //0 fnExt5_Free 	内线空闲 
	}
}


void fnExt5_Err(void)					//5 Dial Wong Extension Numer / LintOut be TimeOut
{
  if (bit_is_clear(ExtTelStateCheck,cExt5Num)) 
  {
	Ext5_FunPt=0;    //0 fnExt5_Free 	内线空闲 
    Writesoundway(Connect_Busy,cX_Ext5,OFF); //;断开忙音
	return;
 	}

}


void fnExt5_WaitRing(void)			//6 										mExt5_Link[0]=Y4Y5  mExt5_Link[1]= Calling To Ext Number
{

	if(bit_is_clear(ExtTelStateCheck,cExt5Num)) 
 	{
		Ext5_FunPt=0;                  //0 fnExt5_Free 	内线空闲 
		fnCutOffY4Y5(Ext5_LineY4Y5Num);
        fnStopExtRing(Ext5_NumdialOut);
        return;
 	}	
				                            		

	if(!Ext5_dialtime)
      {
		Ext5_FunPt=5;    // fnExt5_Err
		fnCutOffY4Y5(Ext5_LineY4Y5Num);
        fnStopExtRing(Ext5_NumdialOut);
		Writesoundway(Connect_Busy,cX_Ext5,ON); //;连接忙音
        return;		       
	  }
	Ext5_dialtime--;

}

//   mExt5_Link[1] = DTMF
//   FlashtimeState =1
//   Y7 ->  cExt5Num +  450Hz(For DTMF)
//   Ext5_LineY4Y5Num

void fnExt5_LinkExtPhone(void)		//7 内线连内线N 7 ->0, 8	mExt5_Link[0]=Y4Y5  mExt5_Link[1]= Calling To Ext Number
{
  if (Ext5_dialtime)  { Ext5_dialtime--; return; }  // 10ms Delay
  
  if(!(ExtTelStateCheck & cExt5Bit) && !(ExtTelFlashState & cExt5Bit)) //挂机
   {
      Ext5_FunPt=0;                  //0 fnExt5_Free 	内线空闲 

	  if(MulTalkState)
      {
        MulTalkState=0;
		Writesoundway(Ext5_LineY4Y5Num,cExt5Num,OFF);
		Ext5_LineY4Y5Num=0;
		return;
	  }
	  fnCutOffY4Y5(Ext5_LineY4Y5Num);
	  fnCutOffExtLineAndLinkToBusy(Ext5_LineY4Y5Num);
	  Ext5_LineY4Y5Num=0;
  }
  else if(ExtTelStateCheck & ExtTelFlashState & cExt5Bit) //转接
  {

     if(FlashtimeState) return;  //只允许一次拍打

	 mExt5_Link[1]=fnLinkDTMF_Ext(Connect_Flash);
	 if(mExt5_Link[1])//有DTMF
     {
	    FlashtimeState=1;
		Flash_For_Out_Ext=1; //0 For Out   1  For Ext 
	    Writesoundway(Ext5_LineY4Y5Num,cExt5Num,OFF);
	    Writesoundway(Connect_Flash,cExt5Num,ON);
	    Writesoundway(Connect_Flash,(mExt5_Link[1]+13),ON); //连接模拟电信音

	    Ext5_FunPt=10;
	    Ext5_dialtime=10000;
	    fnExtLinkMusic(Ext5_NumdialOut);  	   	     	        
      }
   }
}

void fnExt5_LinkBuzzSong(void)		//8
{

}


void fnExt5_Ringing(void)				//9 分机拨打分机,响铃  9->2,7							mExt5_Link[0]=Y4Y5/Line In Num   mExt5_Link[1]: 0=Line In 1=Ext Phone
{

 if (bit_is_clear(ExtTelStateCheck,cExt5Num)) return;  //本内线提机
 
 Writesoundway(SigCallID,cX_Ext5,OFF);                 //断开响铃
 ClrBit(ExtTelRingState,cExt5Num);
 
 Ext5_FunPt=7;                                         //7 fnExt2_LinkExtPhone 内线连内线
 fnStopExtWaitRing(Ext5_FunPt,Ext5_NumdialIn);
 Ext5_NumdialOut=Ext5_NumdialIn;
 Writesoundway(Ext5_LineY4Y5Num,cX_Ext5,ON);          //提机接听			                             		   	       
 Ext5_dialtime = cTelTm50ms;
}


void fnExt5_RingingForLineIn(void)  //15 外线拨打分机,响铃
{
 
 if(bit_is_set(ExtTelStateCheck,cExt5Num))
  {
   Writesoundway(SigCallID,cX_Ext5,OFF);                 //断开响铃
   ClrBit(ExtTelRingState,cExt5Num);

   Ext5_FunPt=2;                                 //2 内线连外线
   mExt5_Link[0] = Ext5_NumdialIn;
   Writesoundway((Ext5_NumdialIn-1),WaitRing,OFF);
   fnConnectionOutLine(Ext5_NumdialIn,cX_Ext5);
   Ext5_dialtime = cTelTm50ms;
   return;
  }
 
  if(Ext5_dialtime)
   {
     if(!--Ext5_dialtime)
	 {
        fnStopExtRing(cExt5Num+1);
	    fnCutOffLineIn(Ext5_NumdialIn);
	  }
   }
}

void fnExt5_4_RingForLineIn(void)    //20 外线拨打分机,四台分机响铃
{
unsigned char i;

 if(bit_is_set(ExtTelStateCheck,cExt5Num))
  {
   Writesoundway(SigCallID,cX_Ext5,OFF);                 //断开响铃
   ClrBit(ExtTelRingState,cExt5Num);

   i=fnFindWhichLineInRingFirst();	
	if (!i)	   // It is a Fault
	{
		 Ext5_FunPt=0;  
	}
	else if (i==3)  // Door Phone Dial In
	{
 		Ext5_FunPt=17;
 		ClrBit(PORTB,HoldDoor);
 		Writesoundway(SigCallID,cX_Ext5,OFF);      //连接响铃
 		ClrBit(ExtTelRingState,cExt5Num);
 		Writesoundway(Door_LineY4Y5Num,cExt5Num,ON);
 		Writesoundway(Door_LineY4Y5Num,Doorphone,ON);
		Doorphone_FunPt=3;
	}
	else  // Line In Dial In
	{
   		Ext5_FunPt=2;                                 //2 内线连外线
   		Ext5_NumdialIn =  i;	
   		mExt5_Link[0] = Ext5_NumdialIn;
   		Writesoundway((Ext5_NumdialIn-1),WaitRing,OFF);
   		fnConnectionOutLine(Ext5_NumdialIn,cX_Ext5);
   		Ext5_dialtime = cTelTm50ms;
	 }
   fnStopAllExtRingFor_OutLine();				// 停止 内机响铃
   }
}

void fnExt5_RingingForDoorphone(void)	//16
{
 if (bit_is_clear(ExtTelStateCheck,cExt5Num)) return;  //本内线提机
 Ext5_FunPt=17;
 ClrBit(PORTB,HoldDoor);
 Writesoundway(SigCallID,cX_Ext5,OFF);      //连接响铃
 ClrBit(ExtTelRingState,cExt5Num);
 Writesoundway(Door_LineY4Y5Num,cExt5Num,ON);
 Writesoundway(Door_LineY4Y5Num,Doorphone,ON);
}

void fnExt5_LinkDoorphone(void)	//17
{
  if (bit_is_set(ExtTelStateCheck,cExt5Num)) return;  //本内线提机

  Ext5_FunPt=0;    //0 fnExt5_Free 	内线空闲 
  SetBit(PORTB,HoldDoor); 
  fnCutOffY4Y5(Door_LineY4Y5Num);
}


void fnExt5_CenterWaitRing(void)
{
  if (Ext5_dialtime)  { Ext5_dialtime--; return; }  // 10ms Delay

  DoorRingRd=PINB & 0x04;	    //PB4:HoldDoor  PB2:CheckDoorRing     PB1:Out  PB0:In
  if(DoorRingPre!=DoorRingRd)  //去抖动

⌨️ 快捷键说明

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