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

📄 ext3.c

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



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

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

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

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

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



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

 	if (bit_is_clear(ExtTelStateCheck,cExt3Num)) 
 	{
		Ext3_FunPt=0;    //0 fnExt3_Free 	内线空闲 
		fnCutOffLineIn(mExt3_Link[0]);
		fnCutOffDTMF(mExt3_Link[1]);
		return;
 	}
  
	if(!Ext3_dialtime)
     {
		Ext3_FunPt=5;    // fnExt3_Err
		fnCutOffLineIn(mExt3_Link[0]);
		fnCutOffDTMF(mExt3_Link[1]);
		Writesoundway(Connect_Busy,cX_Ext3,ON); //;连接忙音
		return;
      }

	Ext3_dialtime--;

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

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

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

void fnExt3_LinkLineOut(void)			//2 内线连外线 2 ->0
{
  if (Ext3_dialtime)  { Ext3_dialtime--; return; }  // 10ms Delay
  
  if(!(ExtTelStateCheck & cExt3Bit) && !(ExtTelFlashState & cExt3Bit)) //挂机
   {
	    Ext3_FunPt=0;                                    //0 fnExt3_Free 	内线空闲 
	    if(MulTalkState)
        {
          MulTalkState=0;
		  Writesoundway((mExt3_Link[0]-1),cExt3Num,OFF);
		  mExt3_Link[0]=0;
          return;
         }
	    fnCutOffLineIn(mExt3_Link[0]);
		mExt3_Link[0]=0;
	    
  }
  else if(ExtTelStateCheck & ExtTelFlashState & cExt3Bit) //转接
  {
     if(FlashtimeState) return;                    //只允许一次拍打
	 mExt3_Link[1]=fnLinkDTMF_Ext(Connect_Flash);  //查找DTMF
	 if(mExt3_Link[1])                             //有DTMF
     {
	    FlashtimeState=1;                          //禁止其他分机拍打
		Flash_For_Out_Ext=0;                       //0 For Out   1  For Ext
		Ext3_NumdialOut=mExt3_Link[0];
		Ext3_LineY4Y5Num=mExt3_Link[0];
	    Writesoundway(mExt3_Link[0]-1,cExt3Num,OFF);
        Writesoundway(mExt3_Link[0]-1,cX_Music,ON);
        Writesoundway(Connect_Flash,cX_Ext3,ON);            //连接模拟电信音
	    Writesoundway(Connect_Flash,(mExt3_Link[1]+13),ON); //连接模拟电信音
		
	    Ext3_FunPt=10;
	    Ext3_dialtime=10000;  	   	     	        
      }
   }
}



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

 	if (bit_is_clear(ExtTelStateCheck,cExt3Num)) 
 	{
		Ext3_FunPt=0;    //0 fnExt3_Free 	内线空闲 
		fnCutOffY4Y5(mExt3_Link[0]);
		fnCutOffDTMF(mExt3_Link[1]);
		return;
 	}
  
	if(!Ext3_dialtime)
      {
		Ext3_FunPt=5;    // fnExt3_Err
		fnCutOffY4Y5(mExt3_Link[0]);
		fnCutOffDTMF(mExt3_Link[1]);
		Writesoundway(Connect_Busy,cX_Ext3,ON); //;连接忙音
		return;

	   }
	Ext3_dialtime--;

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

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


void fnExt3_NotLinkAnyThing(void) //		//4 内线没连任何线 4 -> 0
{
	if (bit_is_clear(ExtTelStateCheck,cExt3Num)) 
 	{
		Ext3_FunPt=0;    //0 fnExt3_Free 	内线空闲 
	}
}


void fnExt3_Err(void)					//5 Dial Wong Extension Numer / LintOut be TimeOut
{
  if (bit_is_clear(ExtTelStateCheck,cExt3Num)) 
  {
	Ext3_FunPt=0;    //0 fnExt3_Free 	内线空闲 
    Writesoundway(Connect_Busy,cX_Ext3,OFF); //;断开忙音
	return;
 	}

}


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

	if(bit_is_clear(ExtTelStateCheck,cExt3Num)) 
 	{
		Ext3_FunPt=0;                  //0 fnExt3_Free 	内线空闲 
		fnCutOffY4Y5(Ext3_LineY4Y5Num);
        fnStopExtRing(Ext3_NumdialOut);
        return;
 	}	
				                            		

	if(!Ext3_dialtime)
      {
		Ext3_FunPt=5;    // fnExt3_Err
		fnCutOffY4Y5(Ext3_LineY4Y5Num);
        fnStopExtRing(Ext3_NumdialOut);
		Writesoundway(Connect_Busy,cX_Ext3,ON); //;连接忙音
        return;		       
	  }
	Ext3_dialtime--;

}

//   mExt3_Link[1] = DTMF
//   FlashtimeState =1
//   Y7 ->  cExt3Num +  450Hz(For DTMF)
//   Ext3_LineY4Y5Num

void fnExt3_LinkExtPhone(void)		//7 内线连内线N 7 ->0, 8	mExt3_Link[0]=Y4Y5  mExt3_Link[1]= Calling To Ext Number
{
  if (Ext3_dialtime)  { Ext3_dialtime--; return; }  // 10ms Delay
  
  if(!(ExtTelStateCheck & cExt3Bit) && !(ExtTelFlashState & cExt3Bit)) //挂机
   {
      Ext3_FunPt=0;                  //0 fnExt3_Free 	内线空闲 

	  if(MulTalkState)
      {
        MulTalkState=0;
		Writesoundway(Ext3_LineY4Y5Num,cExt3Num,OFF);
		Ext3_LineY4Y5Num=0;
		return;
	  }
	  fnCutOffY4Y5(Ext3_LineY4Y5Num);
	  fnCutOffExtLineAndLinkToBusy(Ext3_LineY4Y5Num);
	  Ext3_LineY4Y5Num=0;
  }
  else if(ExtTelStateCheck & ExtTelFlashState & cExt3Bit) //转接
  {

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

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

	    Ext3_FunPt=10;
	    Ext3_dialtime=10000;
	    fnExtLinkMusic(Ext3_NumdialOut);  	   	     	        
      }
   }
}

void fnExt3_LinkBuzzSong(void)		//8
{

}


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

 if (bit_is_clear(ExtTelStateCheck,cExt3Num)) return;  //本内线提机
 
 Writesoundway(SigCallID,cX_Ext3,OFF);                 //断开响铃
 ClrBit(ExtTelRingState,cExt3Num);
 
 Ext3_FunPt=7;                                         //7 fnExt2_LinkExtPhone 内线连内线
 fnStopExtWaitRing(Ext3_FunPt,Ext3_NumdialIn);
 Ext3_NumdialOut=Ext3_NumdialIn;
 Writesoundway(Ext3_LineY4Y5Num,cX_Ext3,ON);          //提机接听			                             		   	       
 Ext3_dialtime = cTelTm50ms;
}


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

   Ext3_FunPt=2;                                 //2 内线连外线
   mExt3_Link[0] = Ext3_NumdialIn;
   Writesoundway((Ext3_NumdialIn-1),WaitRing,OFF);
   fnConnectionOutLine(Ext3_NumdialIn,cX_Ext3);
   Ext3_dialtime = cTelTm50ms;
   return;
  }
 
  if(Ext3_dialtime)
   {
     if(!--Ext3_dialtime)
	 {
        fnStopExtRing(cExt3Num+1);
	    fnCutOffLineIn(Ext3_NumdialIn);
	  }
   }
}

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

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

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

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

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

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


void fnExt3_CenterWaitRing(void)
{
  if (Ext3_dialtime)  { Ext3_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 + -