📄 main.c
字号:
/**************************************
pj name: DTMF CID
author: RPJ
version: V0.1
description: the code for 16 channel CID of dtmf mode.
hook off/ on register ADDR at 8000h and 9000h,
data for cid decoder register ADDR at A000h and B000h,
8870 stb single at hight 4 bit of P1 port,
**************************************/
#include "micro.h"
sbit SWITCH_4052A = P1^0 ; /* switch for a*/
sbit SWITCH_4052B = P1^1 ; /* switch for b*/
sbit WORK_RIGHT = P1^2; /*system work right*/
sbit DOG_RIGHT= P1^3; /*system monitor right*/
sbit SLEC_138 = P3^4 ; /* extern Reg select signal */
void InitSystem(void);
void Micro_Scan_8870(void);
void EXT_Rec_StateScan(UNCHAR group);
void EXT_StateScan(UNCHAR group);
void Control_4052(void);
BOOL Exchang_CIDData(UNCHAR EXT_No);
void SendDataToAlign(UNCHAR EXT_No);
void SendDataToDisp(void);
void Deal_UartData(void);
void Deal_CIDEvent(void);
BOOL Deal_TRKNo(void);
BOOL Back_Catch_Front(UNCHAR Back, UNCHAR Front, UNCHAR CatchSize) ;
void TimerStart(void);
void test(UNCHAR type);
main()
{
SP = 0x60;
InitSystem();
for(;;)
{
if( Flag_5ms )
{
STD8870 |= P1;
}
else
{
Flag_5ms= 1;
EXT_Rec_StateScan(0);
EXT_Rec_StateScan(1);
Micro_Scan_8870();
}
if( Flag_10ms )
{
Flag_10ms = 0;
Control_4052();
STD8870 = 0;
}
if( Flag_100ms )
{
Flag_100ms = 0;
EXT_StateScan(0);
EXT_StateScan(1);
}
if( Flag_s )
{
Flag_s = 0;
WORK_RIGHT =~WORK_RIGHT;
DOG_RIGHT =~DOG_RIGHT;
}
if( ISP_Mode )
{
ISP_Mode = 0;
}
Deal_UartData();
Deal_CIDEvent();
}
}
/*******************
test
*********************/
void test(UNCHAR type)
{
UNINT i;
MICRO_SendToBuf(ALIGNMENT[WP_ALIGN],
type, WP_ALIGN, TAL_ALIGN, ALIGSIZE);
for(i=0;i<(TRK_No+1)*6;i++)
{
MICRO_SendToBuf(ALIGNMENT[WP_ALIGN],
TRK_No_List[i], WP_ALIGN, TAL_ALIGN, ALIGSIZE);
TRK_No_List[i] = 0;
}
TRK_No = 0;
MICRO_SendToBuf(ALIGNMENT[WP_ALIGN],
type, WP_ALIGN, TAL_ALIGN, ALIGSIZE);
}
/***************************************
subroutine name: initsystem
input variable: /
output variable: /
description: initialize the system variable,for interrupt\timer\uart\
***************************************/
void InitSystem(void)
{
UNINT i;
PSW = 0 ;
IE = 0; //屏蔽所有中断
TMOD = 0x21; //定时器T1用于串口,定时器T0用于16位定时器。
PCON = 0x80; //串行SMOD波特率翻倍
SCON = 0x50; //串行方式为1,SM = 0,REN = 1,
IP = 0x02; //设置T0为高级中断
ET0 = 1; //设置定时器中断
TCON = 0; //清楚定时器初始状态
LOAD_TIMER0(TimerH_2ms, TimerL_2ms);
LOAD_TIMER1(bps4800, bps4800);
TI = 0;
RI = 0;
for(i=0;i<16;i++)
{
DTMF_Rec_ST[i] = MT8870_EnRec;
DTMF_Reg_Rec[i] = NULL;
CHECK_Reg[i] = NULL;
COUNTER[i] = NULL;
}
for(i=0;i<ALIGSIZE;i++)
{
EXT_RecDtmf_List[i] = NULL;
ALIGNMENT[i] = NULL;
UART_CIDList[i] = NULL;
TRK_No_List[i] = NULL;
}
for(i=0;i<BUFSIZE;i++)
{
EXT_EVENT_QUEUE[i] = NULL;
}
GROUP_Red_ST[0] = 0;
GROUP_Red_ST[1] = 0;
GROUP_RESAVE_ST[0] = 0;
GROUP_RESAVE_ST[1] = 0;
SLEC_Point = 0;
TRK_No = 0;
WP_EVENT = 0;
RP_EVENT = 0;
TAL_EVENT = 0;
WP_ALIGN = 0;
RP_ALIGN = 0;
TAL_ALIGN = 0;
WP_UCID = 0;
RP_UCID = 0;
TAL_UCID = 0;
Counter2ms = 0;
Counter5ms = 1;
Counter10ms= 0;
Counter100ms= 0;
Flag_2ms = 0;
Flag_5ms = 0;
Flag_10ms = 0;
Flag_100ms = 0;
Flag_s = 0;
Flag_Scan = 0;
Flag_Head = 0;
Flag_Second = 0;
Flag_End = 0;
SLEC_138 = 1;
STD8870 = 0;
ISP_Mode = 0;
TR0 = 1;
TR1 = 1;
EA = 1;
}
/***************************************
subroutine name: Micro_Scan_8870
input variable: /
output variable: /
description: scan 8870 decoder.tidy the cid dtmf,and write the align for each arry
***************************************/
void Micro_Scan_8870(void)
{
UNCHAR EXT_No,temp,INT_ST;
UNCHAR i,Class;
UNINT Addr;
/****************DECODER ST***************/
INT_ST = STD8870 & 0xf0;
INT_ST >>= 4;
STD8870 = 0;
/*****************************************/
for(i=0;i<4;i++)
{
EXT_No = i*4+SLEC_Point;
if( INT_ST&0x01 )
{
if( DTMF_Rec_ST[EXT_No]&0xf0 )
{
DTMF_Rec_ST[EXT_No] &= 0xf0;
DTMF_Rec_ST[EXT_No] |= MT8870_EnOut;//have tone input when decorder finish
temp = i/2;
Class = EXT_RecDtmf_List[EXT_No*15];
if( Class >= 0x10 )
{
EXT_RecDtmf_List[EXT_No*15] |= 0x30;
SendDataToAlign(EXT_No);
}
if( i%2 )
{
SLEC_138 = 0;
Addr = ADDR_DTMFDATA + temp *EXT_Group_Offset;
temp = XBYTE[(Addr)];
SLEC_138 = 1;
temp = temp&0xf0;
temp >>=4;
DTMF_Reg_Rec[EXT_No] = temp;
if(temp==0x0f)
temp = 0;
}
else
{
SLEC_138 = 0;
Addr = ADDR_DTMFDATA + temp *EXT_Group_Offset;
temp = XBYTE[(Addr)];
SLEC_138 = 1;
temp = temp&0x0f;
DTMF_Reg_Rec[EXT_No] = temp;
}
}
}
else
{
if( (DTMF_Rec_ST[EXT_No] & 0x0f) == MT8870_EnOut)
{
COUNTER[EXT_No] = 0;
DTMF_Rec_ST[EXT_No] &= 0xf0;
DTMF_Rec_ST[EXT_No] |= MT8870_NoOut;//no tone input when decorder finish
Class = DTMF_Rec_ST[EXT_No] & 0xf0;
if( Class )
{
if( Exchang_CIDData(EXT_No) )
{
EXT_RecDtmf_List[EXT_No*15]++;
temp = EXT_RecDtmf_List[EXT_No*15] & 0x0f;
Addr = EXT_No*15+temp;
EXT_RecDtmf_List[Addr] = DTMF_Reg_Rec[EXT_No];
}
}
else
{
EXT_RecDtmf_List[EXT_No*15] = 0;
}
}
if( COUNTER[EXT_No] == TIME_SPACE )
{
COUNTER[EXT_No] = 0;
DTMF_Rec_ST[EXT_No] &= 0xf0;
temp = EXT_RecDtmf_List[EXT_No*15];
if( temp & 0x0f )
{
MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT],
EXT_No, WP_EVENT, TAL_EVENT, BUFSIZE);
temp |= 0x10;
EXT_RecDtmf_List[EXT_No*15] = temp;
}
}
else
{
if(DTMF_Rec_ST[EXT_No] > MT8870_EnRec )
COUNTER[EXT_No] ++;
else
COUNTER[EXT_No] = 0;
}
}
INT_ST>>=1;
}
}
/***************************************
subroutine name: EXT_Rec_StateScan(UNCHAR group)
input variable: ext_group/0 or 1
output variable: /
description: scan ext hook off / on,when hook on the decorder shut off,or trun on.
***************************************/
void EXT_Rec_StateScan(UNCHAR group)
{
UNCHAR EXT_No,i;
UNCHAR GROUP_ST_NEW;
SLEC_138 = 0;
GROUP_ST_NEW = XBYTE[(ADDR_HOOKDATA+group*EXT_Group_Offset)];
SLEC_138 = 1;
for(i=0;i<8;i++)
{
EXT_No = group *8+i;
if((GROUP_ST_NEW>>i)&0x01)
{
DTMF_Rec_ST[EXT_No] &= 0x0f;
}
else
{
DTMF_Rec_ST[EXT_No] |= MT8870_EnRec;
}
}
}
/***************************************
subroutine name: EXT_StateScan
input variable: ext_group/0 or 1
output variable: /
description: scan ext hook off / on,when hook on the decorder shut off,or trun on.
***************************************/
void EXT_StateScan(UNCHAR group)
{
UNCHAR ST_TEMP,EXT_No,i;
UNCHAR GROUP_ST_ANAL,GROUP_ST_NEW;
SLEC_138 = 0;
GROUP_ST_NEW = XBYTE[(ADDR_HOOKDATA+group*EXT_Group_Offset)];
SLEC_138 = 1;
GROUP_ST_ANAL=GROUP_ST_NEW^GROUP_Red_ST[group];
ST_TEMP = GROUP_ST_NEW;
for(i=0;i<8;i++)
{
EXT_No = group * 8+i;
if( EXT_No > TAL_EXT_PORT )
break;
if( GROUP_ST_ANAL & 0x01 )
{
CHECK_Reg[EXT_No] = EXT_SCAN_ON;
if( EXT_SCAN_PRI )
CHECK_Reg[EXT_No]++;
else
goto NO_PRI;
}
else
{
if( CHECK_Reg[EXT_No] >EXT_SCAN_ON)
{
if( CHECK_Reg[EXT_No] >EXT_SCAN_LEN )
{
NO_PRI: if( ST_TEMP & 0x01 )
{
CHECK_Reg[EXT_No] = EXT_SCAN_OFF;
//DTMF_Rec_ST[EXT_No] = MT8870_NoRec;
if( (EXT_RecDtmf_List[EXT_No*15] & 0x10) ==0 )
{
if( EXT_RecDtmf_List[EXT_No*15] & 0x0f )
COUNTER[EXT_No] = TIME_SPACE;
}
}
else
{
if( CHECK_Reg[EXT_No] >(EXT_SCAN_LEN +40))
{
CHECK_Reg[EXT_No] = EXT_SCAN_OFF;
//DTMF_Rec_ST[EXT_No] = MT8870_EnRec;
if( EXT_RecDtmf_List[EXT_No*15] & 0x10 )
{
COUNTER[EXT_No] = TIME_SPACE;
EXT_RecDtmf_List[EXT_No*15] |= 0x30;
}
}
else
{
CHECK_Reg[EXT_No]++;
}
}
}
else
{
CHECK_Reg[EXT_No]++;
}
}
else
{
CHECK_Reg[EXT_No] = EXT_SCAN_OFF;
}
}
ST_TEMP >>= 1;
GROUP_ST_ANAL = GROUP_ST_ANAL >>1;
}
GROUP_Red_ST[group] = GROUP_ST_NEW;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -