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

📄 ext6.c

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

void fnExt6_FlashDTMF(void)		//10 
{
  
if(!(ExtTelStateCheck & cExt6Bit))
 {
   if(!(ExtTelFlashState & cExt6Bit)) //挂机
    {
      Ext6_FunPt=0;                  //0 fnExt6_Free 	内线空闲 
 	 	  
	  FlashtimeState=0;              //只允许一次拍打
      MulTalkState=0;                      
	  fnCutOffDTMF(mExt6_Link[1]);
      Writesoundway(Connect_Flash,(mExt6_Link[1]+13),OFF); //连接模拟电信音
	  Writesoundway(Connect_Flash,cX_Ext6,OFF);            //连接模拟电信音

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

           Ext6_LineY4Y5Num=0;
		   return; 	     
        }
       else
	    {
         fnCutOffLineIn(mExt6_Link[0]);
	    }
     }
  }
  else
  {
     if((ExtTelFlashState & cExt6Bit )|| !Ext6_dialtime) //转接
	  {	       
		  goto Ext_Flashback1;
       }
    Ext6_dialtime--;
   }

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

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

	fnCutOffDTMF(mExt6_Link[1]);
    Writesoundway(Connect_Flash,(mExt6_Link[1]+13),OFF); //连接模拟电信音		  
 	
	if(fnExt_DTMFIN1(mDTMF_In,Ext6_LineY4Y5Num,cExt6Num,Ext6_NumdialOut))
	{ 
	   goto Ext_FlashWaitRing; 
	 }
	else
	{ 
	   goto Ext_Flashback1;    
	 }
				

Ext_FlashWaitRing:	    
	Ext6_FunPt=11;//本内线回铃 
	Ext6_dialtime=30000;  
	Writesoundway(Connect_Flash,WaitRing,ON); //连接回铃声
	Ext6_FlashNumdialOut=mDTMF_In;	       	                                         
	Ext6_MusicNumdialIn=Ext6_NumdialOut;	    	
	return;

Ext_Flashback1:
     FlashtimeState=0;  //只允许一次拍打
	 MulTalkState=0;
	 Ext6_dialtime=0;
     fnCutOffDTMF(mExt6_Link[1]);
     Writesoundway(Connect_Flash,(mExt6_Link[1]+13),OFF); //连接模拟电信音
	 Writesoundway(Connect_Flash,cX_Ext6,OFF); //连接模拟电信音	 
	 if(Flash_For_Out_Ext)         //0 For Out   1  For Ext
	 {
		if(fnFindExtStillSong())
	     {  		  
            Ext6_FunPt=7;
	        fnExtCutOffMusic(7,Ext6_NumdialOut);
            Writesoundway(Ext6_LineY4Y5Num,cExt6Num,ON);
	      }
		 else
	      {
		    Ext6_FunPt=5;                 //5	fnExt6_Err  Dial Wong Extension Numer / LintOut be TimeOut;
		    Writesoundway(Connect_Busy,cX_Ext6,ON); //;连接忙音      	          
		   }
         return;
	  }
     else
	 {
        Ext6_FunPt=2;
		Writesoundway(mExt6_Link[0]-1,cX_Music,OFF);
		Writesoundway(mExt6_Link[0]-1,cExt6Num,ON);	
	    return;    
	  }
}


void fnExt6_FlashWaitRing(void)		//11 
{
 if(!(ExtTelStateCheck & cExt6Bit))
 {
   if(!(ExtTelFlashState & cExt6Bit)) //挂机
    {
      Ext6_FunPt=0;                  //0 fnExt6_Free 	内线空闲 
	  FlashtimeState=0;              //只允许一次拍打
	  MulTalkState=0;
	  fnCutOffFlash();	 	 
	  if(Flash_For_Out_Ext)         //0 For Out   1  For Ext
	  {
	    fnConnectMtoRExt(Ext6_MusicNumdialIn, Ext6_FlashNumdialOut);
       }
	   else
	   {
         fnConnectMtoROut(Ext6_MusicNumdialIn,Ext6_FlashNumdialOut);
	   }
     }
  }
  else
  {
     if((ExtTelFlashState & cExt6Bit )|| !Ext6_dialtime) //
	  {	 
	     Ext6_dialtime=0;

		 FlashtimeState=0;  //只允许一次拍打
		 MulTalkState=0;
         fnCutOffFlash();
         fnStopExtRing(Ext6_FlashNumdialOut);
		 if(Flash_For_Out_Ext) //0 For Out   1  For Ext
		 {
	     	if(fnFindExtStillSong())
	     	{  		  
		   	  fnExtCutOffMusic(7,Ext6_NumdialOut);
		    	
	 	      Ext6_FunPt=7;
	 	      Writesoundway(Ext6_LineY4Y5Num,cExt6Num,ON);
	 	      return;
	         }
		    else
	        {
		      Ext6_FunPt=5;                 //5	fnExt6_Err  Dial Wong Extension Numer / LintOut be TimeOut;
		      Writesoundway(Connect_Busy,cX_Ext6,ON); //;连接忙音      
	          return;
		     }       
         }
		 else
		 {
		   Ext6_FunPt=2;
           Writesoundway(mExt6_Link[0]-1,cX_Music,OFF);
		   Writesoundway(mExt6_Link[0]-1,cExt6Num,ON);
		   return;
		 }       
	 } 
	 Ext6_dialtime--;
  }
}

void fnExt6_FlashRing(void)	//12
{
  if (bit_is_clear(ExtTelStateCheck,cExt6Num)) return;  //本内线提机
  
   	Writesoundway(SigCallID,cX_Ext6,OFF);                 //断开响铃
 	ClrBit(ExtTelRingState,cExt6Num);
 
	Writesoundway(Connect_Flash,WaitRing,OFF);
	if(MulTalkState)
	{
      
	  Writesoundway(Ext6_LineY4Y5Num,cX_Ext6,ON); 
	  if(Flash_For_Out_Ext) //0 For Out   1  For Ext
       {
         Ext6_FunPt=7;
		 fnConnectMtoExt(Ext6_MusicNumdialIn,Ext6_FlashNumdialOut);
        }
       else
       {
         Ext6_FunPt=15;
		 fnConnectMtoOut(Ext6_MusicNumdialIn,Ext6_FlashNumdialOut);
        }
	 }
	else
	{
 	  Ext6_FunPt=18;                                         //7 fnExt2_LinkExtPhone 内线连内线
	  fnStopExtWaitRing(Ext6_FunPt,Ext6_FlashNumdialOut);	   	  
	  Writesoundway(Connect_Flash,cX_Ext6,ON);    //提机接听	
	 }			                             		   	       
 	Ext6_dialtime = cTelTm50ms;
  
}


void fnExt6_FlashLinkExtPhone(void)
{
 if (Ext6_dialtime)  { Ext6_dialtime--; return; }  // 10ms Delay
 
 if (bit_is_set(ExtTelStateCheck,cExt6Num)) return;
  Ext6_FunPt=0;                  //0 fnExt6_Free 	内线空闲 
  fnCutOffFlash();
  if(Flash_For_Out_Ext) //0 For Out   1  For Ext
  {
   fnConnectMtoExt(Ext6_MusicNumdialIn,Ext6_FlashNumdialOut);
   }
   else
   {
    fnConnectMtoOut(Ext6_MusicNumdialIn,Ext6_FlashNumdialOut);
   }
}




void fnExt6_LinkMusic(void)			//13 连音乐 11->0,
{
  if(!(ExtTelStateCheck & cExt6Bit)) //挂机
   {
      Ext6_FunPt=0;                  //0 fnExt6_Free 	内线空闲 
	  fnCutOffY4Y5(Ext6_LineY4Y5Num);
  }
}


void fnExt6_LinkDTMF_InputExtNm(void)	//14 内线连DTMF Wait Input (1-6,7,#) 3 ->5,6	
{
unsigned char i;
	if(bit_is_clear(ExtTelStateCheck,cExt6Num)) 
 	{
		Ext6_FunPt=0;                  //0 fnExt6_Free 	内线空闲 
		fnCutOffY4Y5(mExt6_Link[0]);
		fnCutOffDTMF(mExt6_Link[1]);
		return;
 	}
	
	if(!Ext6_dialtime)
      {
		Ext6_FunPt=5;    // fnExt6_Err
		fnCutOffY4Y5(mExt6_Link[0]);
		fnCutOffDTMF(mExt6_Link[1]);
		Writesoundway(Connect_Busy,cX_Ext6,ON); //;连接忙音
		return;
	   }

	Ext6_dialtime--;
	mDTMF_In=DTMF_Decode(mExt6_Link[1]);
	if (!mDTMF_In) return;

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

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


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

		if (Doorphone_FunPt==1)		 
		 {
            Ext6_FunPt=20;
            return;
		  }
			
		i=fnFindRingExtLine(cExt6Num);
		if(i)   //代接内线
		 {
		    Ext6_FunPt=9; 
			Ext6_NumdialIn =i; 
            Ext6_LineY4Y5Num=fnFindRingExtY4Y5();			  
		    return;
		  }
	 }




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

Ext_dialOut:		    
	Writesoundway(mExt6_Link[0],WaitRing,ON); //连接回铃声	        
	Ext6_FunPt=6;                             //本内线回铃
	Ext6_dialtime=30000;                      //20s
	Ext6_NumdialOut=mDTMF_In;  
	Ext6_NumdialIn =Ext6_NumdialOut;
	Ext6_LineY4Y5Num = mExt6_Link[0];                
    return;

 Lb_Warring:
	fnCutOffY4Y5(mExt6_Link[0]);
	Ext6_FunPt=5;                           //5	fnExt6_Err  Dial Wong Extension Numer / LintOut be TimeOut;
	Writesoundway(Connect_Busy,cX_Ext6,ON); //;连接忙音
    return;   
}



const void (*Ext6_FunTab[]) PROGMEM=
{
 	fnExt6_Free,  		    	//0 内线空闲 - Check Hook   0-> 1,2,3,4
 	fnExt6_LinkLineOut_DTMF,	//1 内线连外线 + DTMF  1-> 0,14,5(TimeOut)   mExt6_Link[0] = Line In Num  mExt6_Link[1]=DTMF Num
 	fnExt6_LinkLineOut,			//2 内线连外线 2 ->0						 mExt6_Link[x]
 	fnExt6_LinkDTMF,			//3 内线连DTMF 3 ->14,5,6					 mExt6_Link[0]=Y4Y5  mExt6_Link[1]=DTMF Num
 	fnExt6_NotLinkAnyThing,		//4 内线没连任何线 4 -> 0					 mExt6_Link[x]

	fnExt6_Err,					//5 Dial Wong Extension Numer / LintOut be TimeOut
	fnExt6_WaitRing,			//6 										mExt6_Link[0]=Y4Y5  mExt6_Link[1]= Calling To Ext Number
	fnExt6_LinkExtPhone,		//7 内线连内线N 7 ->0, 8					mExt6_Link[0]=Y4Y5  mExt6_Link[1]= Calling To Ext Number
	fnExt6_LinkBuzzSong,		//8

	fnExt6_Ringing,				//9 响铃  9->2,7							mExt6_Link[0]=Y4Y5/Line In Num   mExt6_Link[1]: 0=Line In 1=Ext Phone
	fnExt6_FlashDTMF,			//10 
	fnExt6_FlashWaitRing,		//11 
	fnExt6_FlashRing,	        //12

	fnExt6_LinkMusic,			//13 连音乐 11->0,
 	fnExt6_LinkDTMF_InputExtNm,	//14 内线连DTMF Wait Input (1-6,7,#) 3 ->5,6  mExt6_Link[0]=Y4Y5  mExt6_Link[1]=DTMF Num	
	fnExt6_RingingForLineIn,   //15 Line In Call ->响铃	
    fnExt6_RingingForDoorphone, //16 Doorphone In Call ->响铃
    fnExt6_LinkDoorphone,		 //17 

    fnExt6_FlashLinkExtPhone,    //18

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


void fnTelRountineExt6(void)
{
	void (*pp)(void);
		pp=  (void *) pgm_read_word_near(Ext6_FunTab+Ext6_FunPt);
		pp();
}

⌨️ 快捷键说明

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