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

📄 teloperate.c

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


void exttel_hold_deal(unsigned char ETelNum)        //内线状态
{
  unsigned char i,j;
  
 if(bit_is_set(ExtTelStateCheck,ETelNum))      //本内线提机
  {   
	 for(i=0;i<OutsideTelNum;i++)
  	  {  
	    if(ReadExt_OutComGroup(i,ETelNum))            //本内线接听外线
	     { 
            WriteExtTelState(ETelNum, exttel_useing); 
	        Writesoundway(SigCallID,ETelNum,OFF);   //本内线停止振铃
			Writesoundway(i,ETelNum,ON);           //本内线与外线建立通话
	        SetBit(PORTC,(Line_LedCtr+i));           //外线提示灯亮 
         	return;  
		  }
		}
	
	 
	 for(i=0;i<cExtTelNum;i++)
       {
		 if(ReadExt_ExtComGroup(i,ETelNum))     //本内线接听内线
	     {
            WriteExtTelState(ETelNum, exttel_useing); 
	        Writesoundway(SigCallID,ETelNum,OFF);   //本内线停止振铃
	        Writesoundway(Connect_Ext1,i,ON);
	        Writesoundway(Connect_Ext1,ETelNum,ON); //本内线与内线建立通话 
			return;
          } 
		}
   	  
	  
	  for(i=0;i<OutsideTelNum;i++)	                                       //本内线空闲
	    {
	        
		    if(bit_is_clear(OutsideBusy_Free,i))     //查找空闲外线
             {	 
			   WriteExtTelState(ETelNum, exttel_unhold);   //摘机空闲态
			   Outdialtime[i]=50;                        //10s操作

			   SetBit(OutsideBusy_Free,i);               //外线被占
			   SetBit(PORTC,(Line_LedCtr+i));           //外线提示灯亮
			   WriteExt_OutComGroup(i,ETelNum,ON);       //本内线与外线建立连接关系 
			   Writesoundway(i,ETelNum,ON);
               	
			   for(j=0;j<DTMF_DecordNum;j++)
	            {
				  if(bit_is_clear(DTMFBusy_Free,j))    //查找空闲DTMF
                   {
                     SetBit(DTMFBusy_Free,j);          //DTMF解码被占
	                 Writesoundway(i,(IC_DTMF+j),ON); 
                     DTMFUseingtime[j]=50;             //10s
			         return;
                    }
			     }

               WriteExtTelState(ETelNum, exttel_useing);  //有空闲外线但无DTMF解码,则只可拨打外线
               return;
			}
		 }
	  
	  
	  for(i=0;i<DTMF_DecordNum;i++)
	  {
			
			if(bit_is_clear(DTMFBusy_Free,i))           //查找空闲DTMF
            {
              WriteExtTelState(ETelNum, exttel_unhold); //摘机空闲态
              DTMFUseingtime[i]=25;                     //5s操作

			  SetBit(DTMFBusy_Free,i);                   //DTMF解码被占
			  Writesoundway((Connect_Ext1+i),ETelNum,ON);
	          //Writesoundway((Connect_Ext+i),(IC_DTMF+i),ON); //本内线与内线建立通话
			  WriteExt_DTMFComGroup(i,ETelNum,ON);
              return;
			 }         
	   }
   		 
    }
  else                                          //本内线未提机
  {
	  for(i=0;i<OutsideTelNum;i++)
  	  {  
	     if(ReadExt_OutComGroup(i,ETelNum))         //本内线与外线开始连接
	      { 
		     if(OutsideRingCheck>>i & 0x01)    		//外线响铃未停
		      {
			    Writesoundway(SigCallID,ETelNum,ON); //本内线振铃                                    
		      }
             else                                   //内线未接听,外线自动停止响铃
		      {
			    WriteOutTelState(i, outtel_hold);   //外线状态
		        ClrBit(OutsideBusy_Free,i);         //外线空闲
			    WriteExt_OutComGroup(i,ETelNum,OFF); //本外线与空闲分机断开连接关系
			    Writesoundway(SigCallID,ETelNum,OFF);//本内线停止振铃
               }
            }
		 }
	 	
		
	 for(i=0;i<cExtTelNum;i++)
      {		 
         if(ReadExt_ExtComGroup(i,ETelNum))     //本内线与内线开始连接
	     {
		    if(ExtTelStateCheck>>i & 0x01)    //主叫内线继续响铃
		    {
			  Writesoundway(SigCallID,ETelNum,ON);//本内线振铃                                    
		     }
            else                                  //内线未接听,外线自动停止响铃
		    {
			  WriteExt_ExtComGroup(i,ETelNum,OFF); //本外线与空闲分机断开连接关系
			  Writesoundway(SigCallID,ETelNum,OFF);     //本内线停止振铃
             }
           }                                                 
	    }
		 
		 //本内线空闲
    }
}



void exttel_unhold_deal(unsigned char ETelNum)     //摘机空闲态
{
  unsigned char i,j;
/****************************************************/
  for(i=0;i<OutsideTelNum;i++)
  {
    if(ReadExt_OutComGroup(i,ETelNum))            
	 {//有空闲外线
        if(bit_is_set(ExtTelStateCheck,ETelNum))           
	     {//分机提机
            if(Outdialtime[i]) 
	         {//等待拨号
	           Outdialtime[i]--;
          		for(j=0;j<DTMF_DecordNum;j++)
			     {
				   if(Readsoundway(i,(IC_DTMF+j)))
				    {     
			          switch(DecordDTMF(j))
			           {
			             case 0x0b: WriteExtTelState(ETelNum, exttel_dialing);  //到拨号状态
				                    ClrBit(OutsideBusy_Free,i);                //外线释放
			                        ClrBit(PORTC,(Line_LedCtr+i));             //外线提示灯灭
							        Writesoundway(i,ETelNum,OFF);              //本外线与空闲分机断开连接关系
									Writesoundway(i,(IC_DTMF+j),OFF);

				                    Outdialtime[i]=25;
							        return;
                         case 0xff: return;
			             default:   
				                    WriteExtTelState(ETelNum, exttel_useing); 
                                    ClrBit(DTMFBusy_Free,j);         //DTMF释放
					                Writesoundway(i,(IC_DTMF+j),OFF);
									return;
				           }
			          } 
				            
				  }
	          }//等待拨号
             else                                      
	         {//10s 未做任何事情
               ClrBit(OutsideBusy_Free,i);                //外线释放
			   ClrBit(PORTC,(Line_LedCtr+i));             //外线提示灯灭
               Writesoundway(Connect_Busy,ETelNum,ON);    //本内线忙音
               Writesoundway(i,ETelNum,OFF);              //本外线与空闲分机断开连接关系
				for(j=0;j<DTMF_DecordNum;j++)
			     {
				   if(Readsoundway(i,(IC_DTMF+j)))
				    {
                      ClrBit(DTMFBusy_Free,j);         //DTMF释放
					  Writesoundway(i,(IC_DTMF+j),OFF);
				     }
			      }            
 
               }//10s 未做任何事情
            }//分机提机
		 else                                         
		 {	//分机挂机		  
			  ClrBit(OutsideBusy_Free,i);              //外线释放
		      ClrBit(PORTC,(Line_LedCtr+i));           //外线提示灯灭
			  WriteExtTelState(ETelNum, exttel_hold);  //回内线状态
			  Writesoundway(Connect_Busy,ETelNum,OFF); //本内线断开忙音
              Writesoundway(i,ETelNum,OFF);            //本外线与空闲分机断开连接关系
			  WriteExt_OutComGroup(i,ETelNum,OFF);     //本外线与空闲分机断开连接关系
			  
			  for(j=0;j<DTMF_DecordNum;j++)
			   {
				 if(Readsoundway(i,(IC_DTMF+j)))
				   {
                     ClrBit(DTMFBusy_Free,j);         //DTMF释放
					 Writesoundway(i,(IC_DTMF+j),OFF);
				    }
			    }
		  }//分机挂机
	      
      }//有空闲外线
   }

/********************************************************/  
  for(i=0;i<DTMF_DecordNum;i++)
   {
	 if(ReadExt_DTMFComGroup(i,ETelNum))
     {
       if(bit_is_set(ExtTelStateCheck,ETelNum))           
	    {//分机提机
            if(DTMFUseingtime[i]) 
	         {//等待拨号
	            DTMFUseingtime[i]--;
               
			    if(DecordDTMF(i)==0x0b)                       //按" * "
			    { Writesoundway(SigCallID,Ext2,ON);
				  WriteExtTelState(ETelNum, exttel_dialing);  //到拨号状态
				  DTMFUseingtime[i]=25;
			     }
	          }//等待拨号
             else                                      
	         {//10s 未做任何事情
                ClrBit(DTMFBusy_Free,i);                         //DTMF释放
			    Writesoundway(Connect_Busy,ETelNum,ON);          //本内线忙音
			    Writesoundway((Connect_Ext1+i),ETelNum,OFF); 
               }//10s 未做任何事情
          }//分机提机
		 else                                         
		 {	//分机挂机		  
			  ClrBit(DTMFBusy_Free,i);                   //DTMF释放
			  WriteExtTelState(ETelNum, exttel_hold);    //回内线状态
			  Writesoundway(Connect_Busy,ETelNum,OFF);   //本内线断开忙音
			  Writesoundway((Connect_Ext1+i),ETelNum,OFF);
			  WriteExt_DTMFComGroup(i,ETelNum,OFF);     		  
		  }//分机挂机
	   }
    }
}


void exttel_using_deal(unsigned char ETelNum)      //内线已使用
{


}


void exttel_dialing_deal(unsigned char ETelNum)		//拨号状态
{




}


void exttel_ring_deal(unsigned char ETelNum)				//振铃状态
{


}








⌨️ 快捷键说明

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