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

📄 teloperate.c

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

#include "main.h"


void WriteOutTelState(unsigned char OutTelNum, unsigned char Teldata);
unsigned char ReadOutTelState(unsigned char OutTelNum);
void WriteExtTelState(unsigned char ETelNum, unsigned char Teldata);
unsigned char ReadExtTelState(unsigned char ETelNum);
void WriteExt_OutComGroup(unsigned char OutTelNum,unsigned char ETelNum,unsigned char Teldata);
unsigned char ReadExt_OutComGroup(unsigned char OutTelNum,unsigned char ETelNum);
void WriteExt_ExtComGroup(unsigned char ETelNumA,unsigned char ETelNumB,unsigned char Teldata);
unsigned char ReadExt_ExtComGroup(unsigned char ETelNumA,unsigned char ETelNumB);
void WriteExt_DTMFComGroup(unsigned char DTMFNum,unsigned char ETelNum,unsigned char Teldata);
unsigned char ReadExt_DTMFComGroup(unsigned char DTMFNum,unsigned char ETelNum);
void TelOperateLoop(void);
void ExtTelCheck(void);            //分机摘机检测
void OutsideTelRingCheck(void);    //外线振铃检测
void MessageDeal(void);                            //电话处理
void outtel_hold_deal(unsigned char OutTelNum);
void outtel_using_deal(unsigned char OutTelNum);       //外线已使用
void exttel_hold_deal(unsigned char ETelNum);        //内线状态
void exttel_unhold_deal(unsigned char ETelNum);     //摘机空闲态
void exttel_using_deal(unsigned char ETelNum);      //内线已使用
void exttel_dialing_deal(unsigned char ETelNum);		//拨号状态
void exttel_ring_deal(unsigned char ETelNum);			//振铃状态



unsigned char SetFlashState[cExtTelNum],SetOutsideRing[OutsideTelNum];
unsigned char Ext_ExtComGroup[cExtTelNum][cExtTelNum],Ext_OutComGroup[OutsideTelNum][cExtTelNum];
unsigned char Ext_DTMFComGroup[DTMF_DecordNum][cExtTelNum];
unsigned char ExtTelState[OutsideTelNum],OutTelState[OutsideTelNum];
unsigned char State_Flag,Store_Flag;
unsigned char ExtTelStateRd,ExtTelStatePre,ExtTelStateSave;
unsigned char OutsideRingRd,OutsideRingPre,OutsideRingSave;
//unsigned char ExtTelRingState;



void WriteOutTelState(unsigned char OutTelNum, unsigned char Teldata)
{
  OutTelState[OutTelNum]=Teldata;
}


unsigned char ReadOutTelState(unsigned char OutTelNum)
{	
  return(OutTelState[OutTelNum]);
}


void WriteExtTelState(unsigned char ETelNum, unsigned char Teldata)
{
  ExtTelState[ETelNum]=Teldata;
}

unsigned char ReadExtTelState(unsigned char ETelNum)
{
 return(ExtTelState[ETelNum]);
}

void WriteExt_OutComGroup(unsigned char OutTelNum,unsigned char ETelNum,unsigned char Teldata)
{
  Ext_OutComGroup[OutTelNum][ETelNum]=Teldata; 	
}


unsigned char ReadExt_OutComGroup(unsigned char OutTelNum,unsigned char ETelNum)
{
  return(Ext_OutComGroup[OutTelNum][ETelNum]); 	
}


void WriteExt_ExtComGroup(unsigned char ETelNumA,unsigned char ETelNumB,unsigned char Teldata)
{
 Ext_ExtComGroup[ETelNumA][ETelNumB]=Teldata;
}

unsigned char ReadExt_ExtComGroup(unsigned char ETelNumA,unsigned char ETelNumB)
{
 return(Ext_ExtComGroup[ETelNumA][ETelNumB]);
}

void WriteExt_DTMFComGroup(unsigned char DTMFNum,unsigned char ETelNum,unsigned char Teldata)
{
 Ext_DTMFComGroup[DTMFNum][ETelNum]=Teldata;

}
unsigned char ReadExt_DTMFComGroup(unsigned char DTMFNum,unsigned char ETelNum)
{
 return(Ext_DTMFComGroup[DTMFNum][ETelNum]);
}


void TelOperateLoop(void)
{
	ExtTelCheck();					//分机摘机检测
//	OutsideTelRingCheck();			//外线振铃检测
    MessageDeal();                  //电话处理

}

void ExtTelCheck(void)           //分机摘机检测
{
   unsigned char i;

   ClrBit(PORTD,CheckHold_Ring); //扩展选择
   nop();	
   ExtTelStateRd=PINA & 0x3f; //D7:Line2_RingCheck  D6:Line1_RingCheck  D5:Ext6_TelCheck  D4:Ext5_TelCheck
                                //D3:Ext4_TelCheck    D2:Ext3_TelCheck    D1:Ext2_TelCheck  D0:Ext1_TelCheck
   SetBit(PORTD,CheckHold_Ring);


	if(ExtTelStatePre!=ExtTelStateRd)
	 {
	   ExtTelStatePre=ExtTelStateRd;	//更新寄存值
	   return; 	
	  }		

	for(i=0;i<cExtTelNum;i++)
	 {	                     

	   State_Flag=(ExtTelStateRd>>i)&0x01;
	   Store_Flag=(ExtTelStateSave>>i)&0x01;
					
	   if(State_Flag)
		{
		   if(Store_Flag)
			{//持续摘机.
              SetFlashState[i]=7;         //闪断时间为1.4s
			  SetBit(ExtTelStateCheck,i);//提机
			  ClrBit(ExtTelFlashState,i); //清除闪断标志 
			 }
		   else
			{//摘机动作****************
             SetBit(ExtTelFlashState,i); //设置闪断标志

			 }	
		 }
		else
		{
		   if(Store_Flag)
			{//挂机动作****************
			 }
			else
			{//持续挂机
               ClrBit(ExtTelStateCheck,i);   //挂机
			   if(SetFlashState[i])
			    {
				  SetFlashState[i]--;				  
				}else
				{
			      ClrBit(ExtTelFlashState,i);  //清除闪断标志
				 }
			  }								
		 }		
	  }
  ExtTelStateSave=ExtTelStateRd;	//更新寄存值			
}


void OutsideTelRingCheck(void)			//外线振铃检测
{
   unsigned char i;
	
   ClrBit(PORTD,CheckHold_Ring); //扩展选择
   nop();	
   OutsideRingRd=PINA & 0b11000000; //D7:Line2_RingCheck  D6:Line1_RingCheck  D5:Ext6_TelCheck  D4:Ext5_TelCheck
                                //D3:Ext4_TelCheck    D2:Ext3_TelCheck    D1:Ext2_TelCheck  D0:Ext1_TelCheck
   SetBit(PORTD,CheckHold_Ring);

	if(OutsideRingPre!=OutsideRingRd)
	 {
	   OutsideRingPre=OutsideRingRd;	//更新寄存值
	   return; 	
	  }		
	
	 for(i=0;i<OutsideTelNum;i++)
	 {	                     

	   State_Flag=(OutsideRingRd>>(i+6))&0x01;
	   Store_Flag=(OutsideRingSave>>(i+6))&0x01;
					
	   if(State_Flag)
		{
		   if(Store_Flag)
			{
              if(SetOutsideRing[i])     //5s未检测到振铃,则认为振铃停止
			  {
			    SetOutsideRing[i]--;
				ClrBit(OutsideRingCheck,i);
			   }
			 }
		   else
			{//振铃停止动作****************
			  
			 }	
		 }
		else
		{
		   if(Store_Flag)
			{//振铃动作****************
			   SetOutsideRing[i]=30;       //5s未检测到振铃,则认为振铃停止
			   SetBit(OutsideRingCheck,i);
			 }
			else
			{
                       
			 }								
		 }		
	  }
  OutsideRingSave=OutsideRingRd;	//更新寄存值

}


void MessageDeal(void)             //电话处理
{
  unsigned char i;
/*
  for(i=0;i<OutsideTelNum;i++)
  	{  		
  		switch(ReadOutTelState(i))
  			{
  				case outtel_hold  :outtel_hold_deal(i);break;  //外线状态
  				case outtel_using :outtel_using_deal(i);break;  //外线已使用
  				default:break;  		
  			}	
  	}
 */ 
  for(i=0;i<cExtTelNum;i++)	//内线处理
  	{
  		switch(ReadExtTelState(i))
  			{
  				case exttel_hold				:exttel_hold_deal(i);	break;					//内线状态
				case exttel_unhold				:exttel_unhold_deal(i);break;					//摘机空闲态
  				case exttel_useing				:exttel_using_deal(i);break;					//通话状态
				case exttel_dialing				:exttel_dialing_deal(i);break;				    //拨号状态	
				case exttel_ring				:exttel_ring_deal(i);break;						//振铃状态
  				default:break;
  			}
  	}	 	  	
}


void outtel_hold_deal(unsigned char OutTelNum)
{
  unsigned char i;
  
  if(bit_is_set(OutsideRingCheck,OutTelNum))           //检测振铃
  {
    for(i=0;i<cExtTelNum;i++)
	 {
	   if(bit_is_clear(ExtTelStateCheck,i))           //查找空闲分机
	    {
		  WriteOutTelState(OutTelNum, outtel_using);  //外线已使用
		  SetBit(OutsideBusy_Free,OutTelNum);         //外线忙
          WriteExt_OutComGroup(OutTelNum,i,ON);  //本外线与空闲分机建立连接关系
		 }
      }
   }
}


void outtel_using_deal(unsigned char OutTelNum)       //外线已使用
{
 
}

⌨️ 快捷键说明

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