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

📄 communication.c

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

#include "main.h"
	
						 
void Writesoundway(unsigned char y,unsigned char x,unsigned char num);
void ConnectTowPoint(unsigned char point_y,unsigned char point_x);
void CutTowPoint(unsigned char point_y,unsigned char point_x);

void TelOperateLoop(void);
void ExtTelCheck(void);            //分机摘机检测
void OutsideTelRingCheck(void);    //外线振铃检测

unsigned int SetFlashState[cExtTelNum],SetOutsideRing[OutsideTelNum];
unsigned char ExtTelStateRd,ExtTelStatePre,ExtTelStateSave;
unsigned char OutsideRingRd,OutsideRingPre,OutsideRingSave;



void Writesoundway(unsigned char y,unsigned char x,unsigned char num)
{
	if (num==ON)
	{
		ConnectTowPoint(y,x);
	}
	else
	{
		CutTowPoint(y,x);
	}
}


void ConnectTowPoint(unsigned char point_y,unsigned char point_x)
{
	unsigned char	address,x,y;
	
	address=0x00;						
	x=point_x&0x0f;
	y=point_y&0x07;

	address=address|y;
	address=address<<4;
	address=address|x;	
	address=address|0x80;		//connect

	DDRA=0xff;                  //PA7:D7  PA6:D6  PA5:D5  PA4:D4  PA3:D3  PA2:D2  PA1:D1  PA0:D0  
    PORTA=address;

	SetBit(PORTD,Storbe8816);	//STROBE 脉冲的下降沿,数据被交替的写进存储器中
	nop();
	nop();
    ClrBit(PORTD,Storbe8816);
	
	DDRA=0x00;                  //PA7:D7  PA6:D6  PA5:D5  PA4:D4  PA3:D3  PA2:D2  PA1:D1  PA0:D0  
    PORTA=0xff;
}


void CutTowPoint(unsigned char point_y,unsigned char point_x)
{
	unsigned char 	address,x,y;

	address=0x00;						
	x=point_x&0x0f;
	y=point_y&0x07;
	
	address=address|y;	
	address=address<<4;
	address=address|x;
	address=address&0x7f;		//cut

	DDRA=0xff;                  //PA7:D7  PA6:D6  PA5:D5  PA4:D4  PA3:D3  PA2:D2  PA1:D1  PA0:D0  
    PORTA=address;
	
	SetBit(PORTD,Storbe8816);	//STROBE 脉冲的下降沿,数据被交替的写进存储器中
	nop();
	nop();
    ClrBit(PORTD,Storbe8816);
	
	DDRA=0x00;                  //PA7:D7  PA6:D6  PA5:D5  PA4:D4  PA3:D3  PA2:D2  PA1:D1  PA0:D0  
    PORTA=0xff;	
}


void ExtTelCheck(void)           //分机摘机检测
{
    unsigned char i;
	unsigned char Store_Flag;
	unsigned char mRot;
    
   ClrBit(PORTD,CheckHold_Ring); //扩展选择
   nop();nop();nop();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; 	
	  }	
	  	
    mRot = 1;
   for(i=0;i<cExtTelNum;i++)
	{	                     
	   Store_Flag= ExtTelStateSave & mRot;					
	   if(ExtTelStateRd & mRot)
		{
		   if(Store_Flag)
			{//持续摘机.
                ExtTelFlashState &= ~mRot;   //清除闪断标志 
			 }
		   else
			{//摘机动作****************
			 ExtTelStateCheck|=mRot;
			 }	
		 }
		else
		{
		   if(Store_Flag)
			{//挂机动作****************
			   ExtTelFlashState|=	mRot;	  //设置闪断标志	
			   ExtTelStateCheck &= ~mRot;   //挂机
			   SetFlashState[i]=1000;         //闪断时间为1.5s
			 }
			else
			{//持续挂机
			    if(SetFlashState[i])
			     {
                   if(!(--SetFlashState[i]))
				    {
                       ExtTelFlashState &= ~mRot;   //清除闪断标志
					 }
                 }
			 }								
		 }		

 	   mRot<<=  1;

	  }
  ExtTelStateSave=ExtTelStateRd;	//更新寄存值			
}


void OutsideTelRingCheck(void)			//外线振铃检测
{
   unsigned char i,mRot,Store_Flag;
   	
   ClrBit(PORTD,CheckHold_Ring); //扩展选择
   nop();nop();nop();nop();
   OutsideRingRd=PINA & 0b11000000; //D7:Line2_RingCheck  D6:Line1_RingCheck  D5:Ext6_TelCheck  D4:Ext5_TelCheck
   OutsideRingRd >>= 6;
	                            //D3:Ext4_TelCheck    D2:Ext3_TelCheck    D1:Ext2_TelCheck  D0:Ext1_TelCheck
   SetBit(PORTD,CheckHold_Ring);
	
	if(OutsideRingPre!=OutsideRingRd)
	 {
	   OutsideRingPre=OutsideRingRd;	//更新寄存值  OutsideRingRd: 1=Nothing 0=Ring
	   return; 	
	  }		


 mRot =1;
 for(i=0;i<OutsideTelNum;i++)
  {	                     
	   Store_Flag= OutsideRingSave & mRot;			//OutsideRingSave	  1=Nothing 0=Ring
	   if(OutsideRingRd & mRot)
		{
		   if(Store_Flag)
			{
			   if(SetOutsideRing[i])
			    {
                   if(!(--SetOutsideRing[i]))
				    {
                       OutsideRingCheck &= ~mRot;
					}
                }
             }
		   else
			{//振铃停止动作****************
			  
			 }	
		 }
		else  // on Ringing
		{
		   if(Store_Flag)
			{//振铃动作****************
			   SetOutsideRing[i]=3000;       //5s未检测到振铃,则认为振铃停止
			   OutsideRingCheck|=mRot;
			 }
			else
			{
                       
			 }								
		  }
	   mRot<<=  1;		
	 }
  OutsideRingSave=OutsideRingRd;	//更新寄存值
}


void TelOperateLoop(void)
{
   fnTelRountineOut1();
   fnTelRountineOut2();

   fnTelRountineExt1();
   fnTelRountineExt2();
   fnTelRountineExt3();
   fnTelRountineExt4();
   fnTelRountineExt5();
   fnTelRountineExt6();

   fnTelRountineDoorphone();
}

⌨️ 快捷键说明

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