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

📄 ext5.c

📁 一个完整的用用AVR单片机开发的电话交换机程序 希望对想学习AVR开发人有帮助
💻 C
📖 第 1 页 / 共 2 页
字号:
	{
	  DoorRingPre=DoorRingRd;	//更新寄存值  OutsideRingRd: 1=Nothing 0=Ring
	  return; 	
	 }
 	
    if(DoorRingRd)
    {
		Ext5_FunPt=5;    // fnExt5_Err
		Writesoundway(Connect_Busy,cX_Ext5,ON);
		
		CallCenterState=0;
		SetBit(PORTB,HoldDoor);	
		fnCutOffY4Y5(Ext5_LineY4Y5Num);
		Ext5_LineY4Y5Num=0; 
        return;		       
	  }
 
 
  if(bit_is_clear(ExtTelStateCheck,cExt5Num)) 
 	{
		Ext5_FunPt=0;                  //0 fnExt5_Free 	内线空闲 	
		fnCutOffY4Y5(Ext5_LineY4Y5Num);
		Ext5_LineY4Y5Num=0;		
		
		SetBit(PORTB,HoldDoor);
		CallCenterState=0;
        return;
 	}	
				                            		
}

void fnExt5_FlashDTMF(void)		//10 
{
  
if(!(ExtTelStateCheck & cExt5Bit))
 {
   if(!(ExtTelFlashState & cExt5Bit)) //挂机
    {
      Ext5_FunPt=0;                  //0 fnExt5_Free 	内线空闲 
 	 	  
	  FlashtimeState=0;              //只允许一次拍打
      MulTalkState=0;                      
	  fnCutOffDTMF(mExt5_Link[1]);
      Writesoundway(Connect_Flash,(mExt5_Link[1]+13),OFF); //连接模拟电信音
	  Writesoundway(Connect_Flash,cX_Ext5,OFF);            //连接模拟电信音

	   if(Flash_For_Out_Ext)         //0 For Out   1  For Ext
	   {
	       fnCutOffY4Y5(Ext5_LineY4Y5Num);
		   if(fnFindExtStillSong())
	     	{  		  
              fnCutOffExtLineAndLinkToBusy(Ext5_LineY4Y5Num);    
			 }

           Ext5_LineY4Y5Num=0;
		   return; 	     
        }
       else
	    {
         fnCutOffLineIn(mExt5_Link[0]);
	    }
     }
  }
  else
  {
     if((ExtTelFlashState & cExt5Bit )|| !Ext5_dialtime) //转接
	  {	       
		  goto Ext_Flashback1;
       }
    Ext5_dialtime--;
   }

	mDTMF_In=DTMF_Decode(mExt5_Link[1]);	
	if (!mDTMF_In) return;
	
	if (mDTMF_In== cExt5Num+1 ){ goto Ext_Flashback1; }

	if(MulTalkState)
	 {
       if (mDTMF_In==cXin){ goto Ext_Flashback1; }  //再次按“ * ”则为出错
	  }
    else                                            
	 {
        if (mDTMF_In==cXin){ MulTalkState=1;return; }       //按“ * ”设置三方通话标志 MulTalkState=1
	     
	  }

	fnCutOffDTMF(mExt5_Link[1]);
    Writesoundway(Connect_Flash,(mExt5_Link[1]+13),OFF); //连接模拟电信音		  
 	
	if(fnExt_DTMFIN1(mDTMF_In,Ext5_LineY4Y5Num,cExt5Num,Ext5_NumdialOut))
	{ 
	   goto Ext_FlashWaitRing; 
	 }
	else
	{ 
	   goto Ext_Flashback1;    
	 }
				

Ext_FlashWaitRing:	    
	Ext5_FunPt=11;//本内线回铃 
	Ext5_dialtime=30000;  
	Writesoundway(Connect_Flash,WaitRing,ON); //连接回铃声
	Ext5_FlashNumdialOut=mDTMF_In;	       	                                         
	Ext5_MusicNumdialIn=Ext5_NumdialOut;	    	
	return;

Ext_Flashback1:
     FlashtimeState=0;  //只允许一次拍打
	 MulTalkState=0;
	 Ext5_dialtime=0;
     fnCutOffDTMF(mExt5_Link[1]);
     Writesoundway(Connect_Flash,(mExt5_Link[1]+13),OFF); //连接模拟电信音
	 Writesoundway(Connect_Flash,cX_Ext5,OFF); //连接模拟电信音	 
	 if(Flash_For_Out_Ext)         //0 For Out   1  For Ext
	 {
		if(fnFindExtStillSong())
	     {  		  
            Ext5_FunPt=7;
	        fnExtCutOffMusic(7,Ext5_NumdialOut);
            Writesoundway(Ext5_LineY4Y5Num,cExt5Num,ON);
	      }
		 else
	      {
		    Ext5_FunPt=5;                 //5	fnExt5_Err  Dial Wong Extension Numer / LintOut be TimeOut;
		    Writesoundway(Connect_Busy,cX_Ext5,ON); //;连接忙音      	          
		   }
         return;
	  }
     else
	 {
        Ext5_FunPt=2;
		Writesoundway(mExt5_Link[0]-1,cX_Music,OFF);
		Writesoundway(mExt5_Link[0]-1,cExt5Num,ON);	
	    return;    
	  }
}


void fnExt5_FlashWaitRing(void)		//11 
{
 if(!(ExtTelStateCheck & cExt5Bit))
 {
   if(!(ExtTelFlashState & cExt5Bit)) //挂机
    {
      Ext5_FunPt=0;                  //0 fnExt5_Free 	内线空闲 
	  FlashtimeState=0;              //只允许一次拍打
	  MulTalkState=0;
	  fnCutOffFlash();	 	 
	  if(Flash_For_Out_Ext)         //0 For Out   1  For Ext
	  {
	    fnConnectMtoRExt(Ext5_MusicNumdialIn, Ext5_FlashNumdialOut);
       }
	   else
	   {
         fnConnectMtoROut(Ext5_MusicNumdialIn,Ext5_FlashNumdialOut);
	   }
     }
  }
  else
  {
     if((ExtTelFlashState & cExt5Bit )|| !Ext5_dialtime) //
	  {	 
	     Ext5_dialtime=0;

		 FlashtimeState=0;  //只允许一次拍打
		 MulTalkState=0;
         fnCutOffFlash();
         fnStopExtRing(Ext5_FlashNumdialOut);
		 if(Flash_For_Out_Ext) //0 For Out   1  For Ext
		 {
	     	if(fnFindExtStillSong())
	     	{  		  
		   	  fnExtCutOffMusic(7,Ext5_NumdialOut);
		    	
	 	      Ext5_FunPt=7;
	 	      Writesoundway(Ext5_LineY4Y5Num,cExt5Num,ON);
	 	      return;
	         }
		    else
	        {
		      Ext5_FunPt=5;                 //5	fnExt5_Err  Dial Wong Extension Numer / LintOut be TimeOut;
		      Writesoundway(Connect_Busy,cX_Ext5,ON); //;连接忙音      
	          return;
		     }       
         }
		 else
		 {
		   Ext5_FunPt=2;
           Writesoundway(mExt5_Link[0]-1,cX_Music,OFF);
		   Writesoundway(mExt5_Link[0]-1,cExt5Num,ON);
		   return;
		 }       
	 } 
	 Ext5_dialtime--;
  }
}

void fnExt5_FlashRing(void)	//12
{
  if (bit_is_clear(ExtTelStateCheck,cExt5Num)) return;  //本内线提机
  
   	Writesoundway(SigCallID,cX_Ext5,OFF);                 //断开响铃
 	ClrBit(ExtTelRingState,cExt5Num);
 
	Writesoundway(Connect_Flash,WaitRing,OFF);
	if(MulTalkState)
	{
      
	  Writesoundway(Ext5_LineY4Y5Num,cX_Ext5,ON); 
	  if(Flash_For_Out_Ext) //0 For Out   1  For Ext
       {
         Ext5_FunPt=7;
		 fnConnectMtoExt(Ext5_MusicNumdialIn,Ext5_FlashNumdialOut);
        }
       else
       {
         Ext5_FunPt=15;
		 fnConnectMtoOut(Ext5_MusicNumdialIn,Ext5_FlashNumdialOut);
        }
	 }
	else
	{
 	  Ext5_FunPt=18;                                         //7 fnExt2_LinkExtPhone 内线连内线
	  fnStopExtWaitRing(Ext5_FunPt,Ext5_FlashNumdialOut);	   	  
	  Writesoundway(Connect_Flash,cX_Ext5,ON);    //提机接听	
	 }			                             		   	       
 	Ext5_dialtime = cTelTm50ms;
  
}


void fnExt5_FlashLinkExtPhone(void)
{
 if (Ext5_dialtime)  { Ext5_dialtime--; return; }  // 10ms Delay
 
 if (bit_is_set(ExtTelStateCheck,cExt5Num)) return;
  Ext5_FunPt=0;                  //0 fnExt5_Free 	内线空闲 
  fnCutOffFlash();
  if(Flash_For_Out_Ext) //0 For Out   1  For Ext
  {
   fnConnectMtoExt(Ext5_MusicNumdialIn,Ext5_FlashNumdialOut);
   }
   else
   {
    fnConnectMtoOut(Ext5_MusicNumdialIn,Ext5_FlashNumdialOut);
   }
}




void fnExt5_LinkMusic(void)			//13 连音乐 11->0,
{
  if(!(ExtTelStateCheck & cExt5Bit)) //挂机
   {
      Ext5_FunPt=0;                  //0 fnExt5_Free 	内线空闲 
	  fnCutOffY4Y5(Ext5_LineY4Y5Num);
  }
}


void fnExt5_LinkDTMF_InputExtNm(void)	//14 内线连DTMF Wait Input (1-6,7,#) 3 ->5,6	
{
unsigned char i;
	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;

	Writesoundway(mExt5_Link[0],(mExt5_Link[0]+10),OFF); //断开模拟电信音
	fnCutOffDTMF(mExt5_Link[1]);

	if (mDTMF_In== cExt5Num+1 ) goto Lb_Warring;         //拨打本机为出错
	
     if(mDTMF_In==0x07)                     //呼叫中心
	{
      if(Doorphone_FunPt){ goto Lb_Warring; }    //门口机在使用中
	  if(CallCenterState){ goto Lb_Warring;  }    //只允许一台分机呼叫中心
	  
	  ClrBit(PORTB,HoldDoor);
	  CallCenterState=1;
	  Ext5_FunPt=19;
	  Ext5_dialtime =1000;
      Ext5_LineY4Y5Num = mExt5_Link[0];	  
	  Writesoundway(Ext5_LineY4Y5Num,Doorphone,ON);	                               	                     	  
	  return;
	 }


    if(mDTMF_In==cJing)//代接
	{
	    if( !ExtTelRingState) goto Lb_Warring;
            
	    fnCutOffY4Y5(mExt5_Link[0]);				
			
	    if (fnFindRingOutLine())    //代接外线
	     {		 	
		    Ext5_FunPt=20;  //fnExt5_4_RingForLineIn
		    return;
	      }

		if (Doorphone_FunPt==1)		 
		 {
            Ext5_FunPt=20;
            return;
		  }
			
		i=fnFindRingExtLine(cExt5Num);
		if(i)   //代接内线
		 {
		    Ext5_FunPt=9; 
			Ext5_NumdialIn =i; 
            Ext5_LineY4Y5Num=fnFindRingExtY4Y5();			  
		    return;
		  }
	 }




    if(fnExt_DTMFIN2(mDTMF_In,cExt5Num,mExt5_Link[0]))  
	{ 
	  goto Ext_dialOut;
     }
	 else
	 {
       goto Lb_Warring;
	  }

Ext_dialOut:		    
	Writesoundway(mExt5_Link[0],WaitRing,ON); //连接回铃声	        
	Ext5_FunPt=6;                             //本内线回铃
	Ext5_dialtime=30000;                      //20s
	Ext5_NumdialOut=mDTMF_In;  
	Ext5_NumdialIn =Ext5_NumdialOut;
	Ext5_LineY4Y5Num = mExt5_Link[0];                
    return;

 Lb_Warring:
	fnCutOffY4Y5(mExt5_Link[0]);
	Ext5_FunPt=5;                           //5	fnExt5_Err  Dial Wong Extension Numer / LintOut be TimeOut;
	Writesoundway(Connect_Busy,cX_Ext5,ON); //;连接忙音
    return;   
}



const void (*Ext5_FunTab[]) PROGMEM=
{
 	fnExt5_Free,  		    	//0 内线空闲 - Check Hook   0-> 1,2,3,4
 	fnExt5_LinkLineOut_DTMF,	//1 内线连外线 + DTMF  1-> 0,14,5(TimeOut)   mExt5_Link[0] = Line In Num  mExt5_Link[1]=DTMF Num
 	fnExt5_LinkLineOut,			//2 内线连外线 2 ->0						 mExt5_Link[x]
 	fnExt5_LinkDTMF,			//3 内线连DTMF 3 ->14,5,6					 mExt5_Link[0]=Y4Y5  mExt5_Link[1]=DTMF Num
 	fnExt5_NotLinkAnyThing,		//4 内线没连任何线 4 -> 0					 mExt5_Link[x]

	fnExt5_Err,					//5 Dial Wong Extension Numer / LintOut be TimeOut
	fnExt5_WaitRing,			//6 										mExt5_Link[0]=Y4Y5  mExt5_Link[1]= Calling To Ext Number
	fnExt5_LinkExtPhone,		//7 内线连内线N 7 ->0, 8					mExt5_Link[0]=Y4Y5  mExt5_Link[1]= Calling To Ext Number
	fnExt5_LinkBuzzSong,		//8

	fnExt5_Ringing,				//9 响铃  9->2,7							mExt5_Link[0]=Y4Y5/Line In Num   mExt5_Link[1]: 0=Line In 1=Ext Phone
	fnExt5_FlashDTMF,			//10 
	fnExt5_FlashWaitRing,		//11 
	fnExt5_FlashRing,	        //12

	fnExt5_LinkMusic,			//13 连音乐 11->0,
 	fnExt5_LinkDTMF_InputExtNm,	//14 内线连DTMF Wait Input (1-6,7,#) 3 ->5,6  mExt5_Link[0]=Y4Y5  mExt5_Link[1]=DTMF Num	
	fnExt5_RingingForLineIn,   //15 Line In Call ->响铃	
    fnExt5_RingingForDoorphone, //16 Doorphone In Call ->响铃
    fnExt5_LinkDoorphone,		 //17 

    fnExt5_FlashLinkExtPhone,    //18

	fnExt5_CenterWaitRing,		 //19
	fnExt5_4_RingForLineIn		 //20  外线拨打分机,四台分机响铃
};


void fnTelRountineExt5(void)
{
	void (*pp)(void);
		pp=  (void *) pgm_read_word_near(Ext5_FunTab+Ext5_FunPt);
		pp();
}

⌨️ 快捷键说明

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