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

📄 doorphone.c

📁 一个完整的用用AVR单片机开发的电话交换机程序 希望对想学习AVR开发人有帮助
💻 C
字号:
#include "main.h"




void fnDoorphone_Free(void)
{
  DoorRingRd=PINB & 0x04;	    //PB4:HoldDoor  PB2:CheckDoorRing     PB1:Out  PB0:In

  if(DoorRingPre!=DoorRingRd)  //去抖动
	{
	  DoorRingPre=DoorRingRd;	//更新寄存值  OutsideRingRd: 1=Nothing 0=Ring
	  return; 	
	 }

 if(CallCenterState)return;
 if(DoorRingRd)return;
 

   if(bit_is_clear(OutsideBusy_Free,4))     //查找空闲外线
    {	 
	  SetBit(OutsideBusy_Free,4);               //外线被占
	  Door_LineY4Y5Num=4;
	 }
   else if(bit_is_clear(OutsideBusy_Free,5))     //查找空闲外线
    {	 
	  SetBit(OutsideBusy_Free,5);                //外线被占
	  Door_LineY4Y5Num=5;
	 } 
    else
    {
      return;			//没有空闲线路
     }

 	if(!fnFind_4FreeExt(3))   //  查找空闲分机响铃
	 {
		if (Door_LineY4Y5Num==4)  { ClrBit(OutsideBusy_Free,4);} //没有空闲分机
			else  { ClrBit(OutsideBusy_Free,5);}
    	Door_LineY4Y5Num=0;
	 }else
	  {
 		Doorphone_FunPt=1;
		tFSKPhoneNumber[10]=0x30;
	  }
}


void fnDoorphone_Ringing(void) //1
{
  DoorRingRd=PINB & 0x04;	    //PB4:HoldDoor  PB2:CheckDoorRing     PB1:Out  PB0:In

  if(DoorRingPre!=DoorRingRd)  //去抖动
	{
	  DoorRingPre=DoorRingRd;	//更新寄存值  OutsideRingRd: 1=Nothing 0=Ring
	  return; 	
	 }

 Doorphone_time=1000;
 
 if(bit_is_clear(PINB,CheckDoorRing))return;  

  if(Door_LineY4Y5Num==4)  {    ClrBit(OutsideBusy_Free,4); }   		//外线被占    
  	else if (Door_LineY4Y5Num==5) {  ClrBit(OutsideBusy_Free,5);  }     //外线被占

   Door_LineY4Y5Num=0;
   Doorphone_FunPt=2;
   fnStopAllExtRingFor_OutLine();

}


void fnDoorphone_Delay1s(void)//2
{

	if(!Doorphone_time)
	{ 
  		Doorphone_FunPt=0;
 	}

 	Doorphone_time--;
}


void  fnDoorphone_ExtHook(void) //3 分机提起
{
  DoorRingRd=PINB & 0x04;	    //PB4:HoldDoor  PB2:CheckDoorRing     PB1:Out  PB0:In

  if(DoorRingPre!=DoorRingRd)  //去抖动
	{
	  DoorRingPre=DoorRingRd;	//更新寄存值  OutsideRingRd: 1=Nothing 0=Ring
	  return; 	
	 }

 Doorphone_time=1000;
 if(bit_is_clear(PINB,CheckDoorRing))return;  
    fnCutOffY4Y5(Door_LineY4Y5Num);
    NotHoldDoorphone();
 	Door_LineY4Y5Num=0;
 	Doorphone_FunPt=2; 
}

const void (*Doorphone_FunTab[]) PROGMEM=
{
 	fnDoorphone_Free,  		    	//0 
    fnDoorphone_Ringing,			//1 										
	fnDoorphone_Delay1s,			//2
	fnDoorphone_ExtHook				//3 分机提起
};


void fnTelRountineDoorphone(void)
{
	void (*pp)(void);
		pp=  (void *) pgm_read_word_near(Doorphone_FunTab+Doorphone_FunPt);
		pp();
}





unsigned char NotHoldDoorphone(void)
{

  SetBit(PORTB,HoldDoor); 
  
  if(Ext1_FunPt==17) //分机接听,但还没挂线 
	{
       Ext1_FunPt=5;
	   Writesoundway(Connect_Busy,cExt1Num,ON); //;连接忙音
        return 0;
	}
 
   if(Ext2_FunPt==17) //分机接听,但还没挂线 
	{
       Ext2_FunPt=5;
	   Writesoundway(Connect_Busy,cExt2Num,ON); //;连接忙音
        return 0;
	}


  if(Ext3_FunPt==17) //分机接听,但还没挂线 
	{
       Ext3_FunPt=5;
	   Writesoundway(Connect_Busy,cExt3Num,ON); //;连接忙音
        return 0;
	}


  if(Ext4_FunPt==17) //分机接听,但还没挂线 
	{
       Ext4_FunPt=5;
	   Writesoundway(Connect_Busy,cExt4Num,ON); //;连接忙音
        return 0;
	}



  if(Ext5_FunPt==17) //分机接听,但还没挂线 
	{
       Ext5_FunPt=5;
	   Writesoundway(Connect_Busy,cExt5Num,ON); //;连接忙音
        return 0;
	}


 if(Ext6_FunPt==17) //分机接听,但还没挂线 
	{
       Ext6_FunPt=5;
	   Writesoundway(Connect_Busy,cExt6Num,ON); //;连接忙音
        return 0;
	}
        return 0;

}

⌨️ 快捷键说明

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