📄 teloperate.c
字号:
#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 + -