📄 communication.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 + -