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

📄 ext2.c

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

void fnExt2_FlashDTMF(void)		//10 
{
  
if(!(ExtTelStateCheck & cExt2Bit))
 {
   if(!(ExtTelFlashState & cExt2Bit)) //挂机
    {
      Ext2_FunPt=0;                  //0 fnExt2_Free 	内线空闲 
 	 	  
	  FlashtimeState=0;              //只允许一次拍打
      MulTalkState=0;                      
	  fnCutOffDTMF(mExt2_Link[1]);
      Writesoundway(Connect_Flash,(mExt2_Link[1]+13),OFF); //连接模拟电信音
	  Writesoundway(Connect_Flash,cX_Ext2,OFF);            //连接模拟电信音

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

           Ext2_LineY4Y5Num=0;
		   return; 	     
        }
       else
	    {
         fnCutOffLineIn(mExt2_Link[0]);
	    }
     }
  }
  else
  {
     if((ExtTelFlashState & cExt2Bit )|| !Ext2_dialtime) //转接
	  {	       
		  goto Ext_Flashback1;
       }
    Ext2_dialtime--;
   }

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

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

	fnCutOffDTMF(mExt2_Link[1]);
    Writesoundway(Connect_Flash,(mExt2_Link[1]+13),OFF); //连接模拟电信音		  
 	
	if(fnExt_DTMFIN1(mDTMF_In,Ext2_LineY4Y5Num,cExt2Num,Ext2_NumdialOut))
	{ 
	   goto Ext_FlashWaitRing; 
	 }
	else
	{ 
	   goto Ext_Flashback1;    
	 }
				

Ext_FlashWaitRing:	    
	Ext2_FunPt=11;//本内线回铃 
	Ext2_dialtime=30000;  
	Writesoundway(Connect_Flash,WaitRing,ON); //连接回铃声
	Ext2_FlashNumdialOut=mDTMF_In;	       	                                         
	Ext2_MusicNumdialIn=Ext2_NumdialOut;	    	
	return;

Ext_Flashback1:
     FlashtimeState=0;  //只允许一次拍打
	 MulTalkState=0;
	 Ext2_dialtime=0;
     fnCutOffDTMF(mExt2_Link[1]);
     Writesoundway(Connect_Flash,(mExt2_Link[1]+13),OFF); //连接模拟电信音
	 Writesoundway(Connect_Flash,cX_Ext2,OFF); //连接模拟电信音	 
	 if(Flash_For_Out_Ext)         //0 For Out   1  For Ext
	 {
		if(fnFindExtStillSong())
	     {  		  
            Ext2_FunPt=7;
	        fnExtCutOffMusic(7,Ext2_NumdialOut);
            Writesoundway(Ext2_LineY4Y5Num,cExt2Num,ON);
	      }
		 else
	      {
		    Ext2_FunPt=5;                 //5	fnExt2_Err  Dial Wong Extension Numer / LintOut be TimeOut;
		    Writesoundway(Connect_Busy,cX_Ext2,ON); //;连接忙音      	          
		   }
         return;
	  }
     else
	 {
        Ext2_FunPt=2;
		Writesoundway(mExt2_Link[0]-1,cX_Music,OFF);
		Writesoundway(mExt2_Link[0]-1,cExt2Num,ON);	
	    return;    
	  }
}


void fnExt2_FlashWaitRing(void)		//11 
{
 if(!(ExtTelStateCheck & cExt2Bit))
 {
   if(!(ExtTelFlashState & cExt2Bit)) //挂机
    {
      Ext2_FunPt=0;                  //0 fnExt2_Free 	内线空闲 
	  FlashtimeState=0;              //只允许一次拍打
	  MulTalkState=0;
	  fnCutOffFlash();	 	 
	  if(Flash_For_Out_Ext)         //0 For Out   1  For Ext
	  {
	    fnConnectMtoRExt(Ext2_MusicNumdialIn, Ext2_FlashNumdialOut);
       }
	   else
	   {
         fnConnectMtoROut(Ext2_MusicNumdialIn,Ext2_FlashNumdialOut);
	   }
     }
  }
  else
  {
     if((ExtTelFlashState & cExt2Bit )|| !Ext2_dialtime) //
	  {	 
	     Ext2_dialtime=0;

		 FlashtimeState=0;  //只允许一次拍打
		 MulTalkState=0;
         fnCutOffFlash();
         fnStopExtRing(Ext2_FlashNumdialOut);
		 if(Flash_For_Out_Ext) //0 For Out   1  For Ext
		 {
	     	if(fnFindExtStillSong())
	     	{  		  
		   	  fnExtCutOffMusic(7,Ext2_NumdialOut);
		    	
	 	      Ext2_FunPt=7;
	 	      Writesoundway(Ext2_LineY4Y5Num,cExt2Num,ON);
	 	      return;
	         }
		    else
	        {
		      Ext2_FunPt=5;                 //5	fnExt2_Err  Dial Wong Extension Numer / LintOut be TimeOut;
		      Writesoundway(Connect_Busy,cX_Ext2,ON); //;连接忙音      
	          return;
		     }       
         }
		 else
		 {
		   Ext2_FunPt=2;
           Writesoundway(mExt2_Link[0]-1,cX_Music,OFF);
		   Writesoundway(mExt2_Link[0]-1,cExt2Num,ON);
		   return;
		 }       
	 } 
	 Ext2_dialtime--;
  }
}

void fnExt2_FlashRing(void)	//12
{
  if (bit_is_clear(ExtTelStateCheck,cExt2Num)) return;  //本内线提机
  
   	Writesoundway(SigCallID,cX_Ext2,OFF);                 //断开响铃
 	ClrBit(ExtTelRingState,cExt2Num);
 
	Writesoundway(Connect_Flash,WaitRing,OFF);
	if(MulTalkState)
	{
      
	  Writesoundway(Ext2_LineY4Y5Num,cX_Ext2,ON); 
	  if(Flash_For_Out_Ext) //0 For Out   1  For Ext
       {
         Ext2_FunPt=7;
		 fnConnectMtoExt(Ext2_MusicNumdialIn,Ext2_FlashNumdialOut);
        }
       else
       {
         Ext2_FunPt=15;
		 fnConnectMtoOut(Ext2_MusicNumdialIn,Ext2_FlashNumdialOut);
        }
	 }
	else
	{
 	  Ext2_FunPt=18;                                         //7 fnExt2_LinkExtPhone 内线连内线
	  fnStopExtWaitRing(Ext2_FunPt,Ext2_FlashNumdialOut);	   	  
	  Writesoundway(Connect_Flash,cX_Ext2,ON);    //提机接听	
	 }			                             		   	       
 	Ext2_dialtime = cTelTm50ms;
  
}


void fnExt2_FlashLinkExtPhone(void)
{
 if (Ext2_dialtime)  { Ext2_dialtime--; return; }  // 10ms Delay
 
 if (bit_is_set(ExtTelStateCheck,cExt2Num)) return;
  Ext2_FunPt=0;                  //0 fnExt2_Free 	内线空闲 
  fnCutOffFlash();
  if(Flash_For_Out_Ext) //0 For Out   1  For Ext
  {
   fnConnectMtoExt(Ext2_MusicNumdialIn,Ext2_FlashNumdialOut);
   }
   else
   {
    fnConnectMtoOut(Ext2_MusicNumdialIn,Ext2_FlashNumdialOut);
   }
}




void fnExt2_LinkMusic(void)			//13 连音乐 11->0,
{
  if(!(ExtTelStateCheck & cExt2Bit)) //挂机
   {
      Ext2_FunPt=0;                  //0 fnExt2_Free 	内线空闲 
	  fnCutOffY4Y5(Ext2_LineY4Y5Num);
  }
}


void fnExt2_LinkDTMF_InputExtNm(void)	//14 内线连DTMF Wait Input (1-6,7,#) 3 ->5,6	
{
unsigned char i;
	if(bit_is_clear(ExtTelStateCheck,cExt2Num)) 
 	{
		Ext2_FunPt=0;                  //0 fnExt2_Free 	内线空闲 
		fnCutOffY4Y5(mExt2_Link[0]);
		fnCutOffDTMF(mExt2_Link[1]);
		return;
 	}
	
	if(!Ext2_dialtime)
      {
		Ext2_FunPt=5;    // fnExt2_Err
		fnCutOffY4Y5(mExt2_Link[0]);
		fnCutOffDTMF(mExt2_Link[1]);
		Writesoundway(Connect_Busy,cX_Ext2,ON); //;连接忙音
		return;
	   }

	Ext2_dialtime--;
	mDTMF_In=DTMF_Decode(mExt2_Link[1]);
	if (!mDTMF_In) return;

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

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


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

		if (Doorphone_FunPt==1)		 
		 {
            Ext2_FunPt=20;
            return;
		  }
			
		i=fnFindRingExtLine(cExt2Num);
		if(i)   //代接内线
		 {
		    Ext2_FunPt=9; 
			Ext2_NumdialIn =i; 
            Ext2_LineY4Y5Num=fnFindRingExtY4Y5();			  
		    return;
		  }
	 }




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

Ext_dialOut:		    
	Writesoundway(mExt2_Link[0],WaitRing,ON); //连接回铃声	        
	Ext2_FunPt=6;                             //本内线回铃
	Ext2_dialtime=30000;                      //20s
	Ext2_NumdialOut=mDTMF_In;  
	Ext2_NumdialIn =Ext2_NumdialOut;
	Ext2_LineY4Y5Num = mExt2_Link[0];                
    return;

 Lb_Warring:
	fnCutOffY4Y5(mExt2_Link[0]);
	Ext2_FunPt=5;                           //5	fnExt2_Err  Dial Wong Extension Numer / LintOut be TimeOut;
	Writesoundway(Connect_Busy,cX_Ext2,ON); //;连接忙音
    return;   
}



const void (*Ext2_FunTab[]) PROGMEM=
{
 	fnExt2_Free,  		    	//0 内线空闲 - Check Hook   0-> 1,2,3,4
 	fnExt2_LinkLineOut_DTMF,	//1 内线连外线 + DTMF  1-> 0,14,5(TimeOut)   mExt2_Link[0] = Line In Num  mExt2_Link[1]=DTMF Num
 	fnExt2_LinkLineOut,			//2 内线连外线 2 ->0						 mExt2_Link[x]
 	fnExt2_LinkDTMF,			//3 内线连DTMF 3 ->14,5,6					 mExt2_Link[0]=Y4Y5  mExt2_Link[1]=DTMF Num
 	fnExt2_NotLinkAnyThing,		//4 内线没连任何线 4 -> 0					 mExt2_Link[x]

	fnExt2_Err,					//5 Dial Wong Extension Numer / LintOut be TimeOut
	fnExt2_WaitRing,			//6 										mExt2_Link[0]=Y4Y5  mExt2_Link[1]= Calling To Ext Number
	fnExt2_LinkExtPhone,		//7 内线连内线N 7 ->0, 8					mExt2_Link[0]=Y4Y5  mExt2_Link[1]= Calling To Ext Number
	fnExt2_LinkBuzzSong,		//8

	fnExt2_Ringing,				//9 响铃  9->2,7							mExt2_Link[0]=Y4Y5/Line In Num   mExt2_Link[1]: 0=Line In 1=Ext Phone
	fnExt2_FlashDTMF,			//10 
	fnExt2_FlashWaitRing,		//11 
	fnExt2_FlashRing,	        //12

	fnExt2_LinkMusic,			//13 连音乐 11->0,
 	fnExt2_LinkDTMF_InputExtNm,	//14 内线连DTMF Wait Input (1-6,7,#) 3 ->5,6  mExt2_Link[0]=Y4Y5  mExt2_Link[1]=DTMF Num	
	fnExt2_RingingForLineIn,   //15 Line In Call ->响铃	
    fnExt2_RingingForDoorphone, //16 Doorphone In Call ->响铃
    fnExt2_LinkDoorphone,		 //17 

    fnExt2_FlashLinkExtPhone,    //18

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


void fnTelRountineExt2(void)
{
	void (*pp)(void);
		pp=  (void *) pgm_read_word_near(Ext2_FunTab+Ext2_FunPt);
		pp();
}

⌨️ 快捷键说明

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