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

📄 communication.c

📁 一个完整的用用AVR单片机开发的电话交换机程序 希望对想学习AVR开发人有帮助
💻 C
📖 第 1 页 / 共 5 页
字号:
/***************************************************************************
//Actpro International (SZ) Ltd
//Project :
//File		:SoundInTel.c												Compiler:Keil
//Editor: LIUYI
//Data:		06-01-04										 				Ver:
//General Function

*/
#include <switch.h>
xdata	UCHAR	ExtComGroup[COMMUNICATIONGROUPNUM][ExtComGroup_length] _at_  0;
xdata	UCHAR	MessageGroup[MESSAGEGROUPNUMBER][MessageGroup_length]	 _at_  80;
xdata	UCHAR	ExtTelState[ExtTelNum]																 _at_	 130;
xdata	UCHAR	ExtTelTime [ExtTelNum]															   _at_	 140;
xdata	UCHAR	OutTelState[OUTSIDETELNUM	]														 _at_	 150;
xdata	UCHAR CID[CIDLENGTH]																			   _at_	 230;
			 
void	CommunicationInit();
void	WriteExtComGroup(UCHAR x,UCHAR y,UCHAR wData);
UCHAR ReadExtComGroup(UCHAR x,UCHAR y);
void	WriteMessageGroup(UCHAR x,UCHAR y,UCHAR wData);
UCHAR ReadMessageGroup(UCHAR x,UCHAR y);
void	SendUnholdMessage(UCHAR	exttelnum);
void	MessageDeal();
UCHAR	CreateExtComGroup(UCHAR origin_call);
void	ClearAMessage(UCHAR messageID);
void	SendDecodeMessage(UCHAR exttelnum,UCHAR decode_data_length, UCHAR dtmfnum);
void	SendHoldMessage(UCHAR exttelnum);
void	ClearAComGroup(UCHAR comgroupID);
void	SendOutsideCallInMessage(UCHAR linenum, UCHAR ringnum);
void	WriteExtTelState(UCHAR num, UCHAR teldata);
UCHAR	ReadExtTelState(UCHAR num);
void	WriteCID(UCHAR num, UCHAR teldata);
UCHAR	ReadCID(UCHAR num);
void 	ResResume();	//系统资源归原

UCHAR	ReadExtTelTime(UCHAR num);
void	WriteExtTelTime(UCHAR num, UCHAR time);
void	ExtTimeDeal();
void	exttel_hold_deal(UCHAR telnum);
void	exttel_unhold_deal(UCHAR	telnum);
void	exttel_dialing_deal(UCHAR telnum);
UCHAR	findextcomgroupbyorigin(UCHAR telnum);
UCHAR	findextcomgroupbyobject(UCHAR telnum);
UCHAR	testextcomgroup_inside();
void	CreatExtComGroupByID(UCHAR extcomgroupID,UCHAR origin, UCHAR object, UCHAR type);
void 	exttel_sendCID_deal(UCHAR telnum);
void	exttel_waiting_deal(UCHAR telnum);
void	exttel_ring_deal(UCHAR telnum);
void	exttel_error_deal(UCHAR telnum);
void	exttel_useing_deal(UCHAR telnum);
UCHAR	ReadOutTelState(UCHAR num);
void	WriteOutTelState(UCHAR num, UCHAR teldata);
void	outtel_hold_deal(UCHAR outtelnum);
UCHAR	testoutline(UCHAR outtelnum);
void	outtel_ring_deal(UCHAR outtelnum);
void	outtel_using_deal(UCHAR outtelnum);
void	time_exttel_unhold_deal(UCHAR telnum);
void	exttel_flash_deal(UCHAR telnum);
void	exttel_switch_deal(UCHAR telnum);
void time_exttel_flash_deal(UCHAR telnum);
void	exttel_switch_dialing_deal(UCHAR telnum);
void	exttel_switch_dialing_error_deal(UCHAR telnum);
void	TakeTheRingPhone(UCHAR telnum);

idata UCHAR	PORT_STORE;
idata	UCHAR	RawMessageNum;		//记忆未处理的消息数目

const UCHAR	MACHINE_ID[8]=
	{
		1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,	//分机编号
	};
const UCHAR OUTSIDELINE_ID[2]=
	{
		0x11,0x12									//外线ID编号
	};
	
#define	EXTTELTIME_30S			150
#define	EXTTELTIME_5S				25	
#define	EXTTELTIME_1S				5

void	CommunicationInit()
{
	idata UCHAR	i,j;

	dialog_open=0;		//楼宇对讲初始化
	dialog_take=0;
	dialog_call=0;
	WriteExtTelState(DIALOG_STATE,DIALOG_STATE_NONE);	//初始化楼宇对讲状态
	
	for(i=0;i<COMMUNICATIONGROUPNUM;i++)
		{
			for(j=0;j<ExtComGroup_length;j++)
				{
					WriteExtComGroup(i,j,0);
				}
		}

	for(i=0;i<MESSAGEGROUPNUMBER;i++)
		{
			for(j=0;j<MessageGroup_length;j++)
				{
					WriteMessageGroup(i,j,0);
				}
		}		
	RawMessageNum=0;		
		
	for(i=0;i<ExtTelNum;i++)
		{
			WriteExtTelState(i,exttel_hold);
			ReadExtTelTime(i);			//分机时间初始化
			WriteExtTelTime(i,0);
		}	

	for(i=0;i<OUTSIDETELNUM;i++)
		{
			WriteOutTelState(i,outtel_hold);
			ReadOutTelState(i);
		}	
		
	for(i=0;i<CIDLENGTH;i++)
		{
			WriteCID(i,0x00);
		}	
	WriteCID(CID_ptr,(CID_ptr+1));//初始化指针	
}

void	WriteExtComGroup(UCHAR x,UCHAR y,UCHAR wData)
{
	PORT_STORE=PORT;
	RCON=RCON_Bank0;
	
	ExtComGroup[x][y]=wData;
	
	PORT=PORT_STORE;
}

UCHAR ReadExtComGroup(UCHAR x,UCHAR y)
{
	idata UCHAR temp;
	
	PORT_STORE=PORT;
	RCON=RCON_Bank0;
	
	temp=ExtComGroup[x][y];
	
	PORT=PORT_STORE;
	return(temp); 	
}

void	WriteMessageGroup(UCHAR x,UCHAR y,UCHAR wData)
{
	PORT_STORE=PORT;
	RCON=RCON_Bank0;
	
	MessageGroup[x][y]=wData;
	
	PORT=PORT_STORE;
}

UCHAR ReadMessageGroup(UCHAR x,UCHAR y)
{
	idata UCHAR temp;
		
	PORT_STORE=PORT;
	RCON=RCON_Bank0;
	
	temp=MessageGroup[x][y];
	
	PORT=PORT_STORE;
	return(temp); 
}

void	WriteExtTelTime(UCHAR num, UCHAR time)
{
	PORT_STORE=PORT;
	RCON=RCON_Bank0;
	
	ExtTelTime[num]=time;
	
	PORT=PORT_STORE;
	return;
}
UCHAR	ReadExtTelTime(UCHAR num)
{
	idata UCHAR temp;
	
	PORT_STORE=PORT;
	RCON=RCON_Bank0;
	
	temp=ExtTelTime[num];
	
	PORT=PORT_STORE;
	return(temp);
}

void	WriteOutTelState(UCHAR num, UCHAR teldata)
{
	PORT_STORE=PORT;
	RCON=RCON_Bank0;
	
	OutTelState[num]=teldata;
	
	PORT=PORT_STORE;
	return;
}
UCHAR	ReadOutTelState(UCHAR num)
{
	idata UCHAR temp;
	
	PORT_STORE=PORT;
	RCON=RCON_Bank0;
	
	temp=OutTelState[num];
	
	PORT=PORT_STORE;
	return(temp);
}

void	WriteExtTelState(UCHAR num, UCHAR teldata)
{
	PORT_STORE=PORT;
	RCON=RCON_Bank0;
	
	ExtTelState[num]=teldata;
	
	PORT=PORT_STORE;
	return;
}
UCHAR	ReadExtTelState(UCHAR num)
{
	idata UCHAR temp;
	
	PORT_STORE=PORT;
	RCON=RCON_Bank0;
	
	temp=ExtTelState[num];
	
	PORT=PORT_STORE;
	return(temp);
}

void	WriteCID(UCHAR num, UCHAR teldata)
{
	PORT_STORE=PORT;
	RCON=RCON_Bank0;
	
	CID[num]=teldata;
	
	PORT=PORT_STORE;
	return;
}

UCHAR	ReadCID(UCHAR num)
{
	idata UCHAR temp;
	
	PORT_STORE=PORT;
	RCON=RCON_Bank0;
	
	temp=CID[num];
	
	PORT=PORT_STORE;
	return(temp);
}

void	MessageDeal()
{
  idata UCHAR i;
  for(i=0;i<OUTSIDETELNUM;i++)
  	{  		
  		switch(ReadOutTelState(i))
  			{
  				case outtel_hold  :outtel_hold_deal(i);break;
  				case outtel_ring  :outtel_ring_deal(i);break;
  				case outtel_using :outtel_using_deal(i);break;
  				default:break;  		
  			}	
  	}
  
  for(i=0;i<ExtTelNum;i++)	//内线处理
  	{
  		switch(ReadExtTelState(i))
  			{
  				case exttel_hold				:exttel_hold_deal(i);	break;					//内线状态
  				case exttel_unhold				:exttel_unhold_deal(i);break;					//摘机空闲态
  				case exttel_dialing				:exttel_dialing_deal(i);break;				//拨号状态
  				case exttel_sendCID				:exttel_sendCID_deal(i);break;				//发送来电显示信号  					
  				case exttel_waiting				:exttel_waiting_deal(i);break;				//主叫方振铃等待状态
  				case exttel_ring				:exttel_ring_deal(i);break;						//振铃状态
  				case exttel_useing				:exttel_useing_deal(i);break;					//通话状态
  				case exttel_flash				:exttel_flash_deal(i);break;					//闪断状态
  				case exttel_switch				:exttel_switch_deal(i);break;					//转接状态		
  				case exttel_switch_dialing:exttel_switch_dialing_deal(i);break;	//转接拨号中	
  				case exttel_error					:exttel_error_deal(i);break;					//出错状态 
  				default:break;
  			}
  	}	 	  	
  return;
}

void	outtel_hold_deal(UCHAR outtelnum)
{
	idata UCHAR i,j,temp;
	
	if(RawMessageNum!=0)
		{
			for(i=0;i<MESSAGEGROUPNUMBER;i++)
				{
					if(ReadMessageGroup(i,MessageGroup_origin)==OUTSIDELINE_ID[outtelnum])
						{	//为本外线消息		
							if(ReadMessageGroup(i,MessageGroup_type)==OUTSIDE_CALL_IN_MESSAGETYPE)
								{	//振铃消息			
									if(ReadMessageGroup(i,MessageGroup_datastar)==0x01)
										{//第一声振铃
											temp=testoutline(outtelnum);
											if(temp==0xff)
												{//此外线已占用
													WriteOutTelState(outtelnum,outtel_used);
													
													RawMessageNum--;	//清楚已处理的消息
													ClearAMessage(i);												
													return;

⌨️ 快捷键说明

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