📄 main.c
字号:
for(i=0;i<255;i++)
{
EXT_Number_List[j++] = FlashRamTemp[i];
if( j>=1000 )
break;
}
}
/*****************************
name:Def_EXT_Parma(void)
input:/
output:/
description:
将在FLASH中的前3个字节读出后判断
,如果前端数据是正确的,就恢复FLASH
数据,如果不是合法就要求系统数据全部
重新设置到RAM中,同时写入FLASH
*****************************/
void Def_EXT_Parma(void)
{
unchar data i,m;
unint xdata j;
EXT_Head = 6; //默认字头为6
EXT_Len = 3; //默认长度为4
Host_Head = 8; //默认总机为8缩号
Host_Ext = MAX_Ext; //默认总机用户为0号
TAL_EXT_PORT = MAX_Ext; //默认用户端口6个
TAL_MeetGroup= 7; //默认会议组为1
TAL_TrkGroup = 0; //默认中继组为1
TAL_TroopGroup = 7; //默认群呼组为1
Hot_Len = 3; //默认热线等待长度为4秒
FlagHeartSkip = 0; //是否发送PC机的心跳数据
First_Meet_Head = 0x90;
First_Troop_Head = 0x20;
FlagSystemType = 1; //=1表示是指令,=0表示普通话机
FlashRamTemp[0] = 0x55; //首次启动计数为0开始
FlashRamTemp[1] = EXT_Head; //修改变量
FlashRamTemp[2] = EXT_Len; //修改变量
FlashRamTemp[3] = Host_Head; //修改变量
FlashRamTemp[4] = TAL_EXT_PORT; //修改变量
FlashRamTemp[5] = TAL_MeetGroup; //修改变量
FlashRamTemp[6] = TAL_TrkGroup; //修改变量
FlashRamTemp[7] = TAL_TroopGroup; //修改变量
FlashRamTemp[8] = Hot_Len; //修改变量
FlashRamTemp[9] = Host_Ext; //修改变量
FlashRamTemp[10] = First_Meet_Head; //修改变量
FlashRamTemp[11] = First_Troop_Head; //修改变量
FlashRamTemp[12] = FlagSystemType;
FlashRamTemp[20] = 0; //修改复位重起变量
FlashRamTemp[21] = FlagHeartSkip;
NoFreeFlag = FlashRamTemp[22];
NoFreeCounter = FlashRamTemp[23];
Password1 = Fun_Head,FlashRamTemp[24]=Password1;
Password2 = Fun_End,FlashRamTemp[25]=Password2;
Password3 = Fun_Head,FlashRamTemp[26]=Password3;
if(NoFreeFlag==0xff)
{
NoFreeFlag = 15;
FlashRamTemp[22] = 15;
}
if(NoFreeCounter==0xff)
{
NoFreeCounter = 0;
FlashRamTemp[23] = 0;
}
FlashRamTemp[23]++;
TAL_EXTGroup = TAL_EXT_PORT/8; //默认系统分配用户组由用户口定
if( TAL_EXT_PORT % 8 )
{
TAL_EXTGroup++;
}
Write_FlashPage();
Write_FlashSecter(0x0000); //向Flash写变量
/**********************************************************/
/*系统组参数表,地址从0100h开始*/
/**********************************************************/
for(i=0;i<7;i++)//7组会议组
{
j = i*36;
Meet_Group[i].MeetLen= 2; //默认会议头长度
FlashRamTemp[j++] = Meet_Group[i].MeetLen;
Meet_Group[i].MeetHead = First_Meet_Head+i; //默认会议头为有序
FlashRamTemp[j++] = Meet_Group[i].MeetHead;
Meet_Group[i].Meetstate = 0xff; //默认会议状态为空
FlashRamTemp[j++] = Meet_Group[i].Meetstate;
Meet_Group[i].Num_Member = 0; //默认会议成员为空
FlashRamTemp[j++] = Meet_Group[i].Num_Member;
for(m=0;m<MAX_Ext;m++)
{
Meet_Group[i].Meet_Member[m] = 0xff;//默认会议成员为空
FlashRamTemp[j++] = Meet_Group[i].Meet_Member[m];
}
}
Write_FlashPage();
Write_FlashSecter(0x0100);
/*
for(i=0;i<7;i++)//7组中继组
{
j = i*36;
Trk_Group[i].TrkLen= 2; //默认中继头长度为空
FlashRamTemp[j++]= Trk_Group[i].TrkLen;
Trk_Group[i].TrkHead = 0x01+i; //默认中继头为空
FlashRamTemp[j++]= Trk_Group[i].TrkHead;
Trk_Group[i].Num_Member = TAL_EXT_PORT; //默认中继成员为空
FlashRamTemp[j++] = Trk_Group[i].Num_Member;
Trk_Group[i].Num_Use = NULL; //默认中继成员为空
FlashRamTemp[j++] = Trk_Group[i].Num_Use;
for(m=0;m<TAL_EXT_PORT;m++)
{
Trk_Group[i].Trk_Member[m] = m;//默认会议成员为空
FlashRamTemp[j++] = Trk_Group[i].Trk_Member[m];
}
for(m=TAL_EXT_PORT;m<MAX_Ext;m++)
{
Trk_Group[i].Trk_Member[m] = 0xff;//默认会议成员为空
FlashRamTemp[j++] = Trk_Group[i].Trk_Member[m];
}
}
Write_FlashPage();
Write_FlashSecter(0x0200);
*/
for(i=0;i<7;i++)//群呼组最大7组
{
j = i*37;
Troop_Param[i].TroopLen= 2; //默认长度为空0
FlashRamTemp[j++] = Troop_Param[i].TroopLen;
Troop_Param[i].TroopHead = First_Troop_Head+i; //默认头为空有序
FlashRamTemp[j++] = Troop_Param[i].TroopHead;
Troop_Param[i].Num_Member = 0; //默认成员数为空0
FlashRamTemp[j++] = Troop_Param[i].Num_Member;
Troop_Param[i].TroopType = 0; //默认在群呼状态0
FlashRamTemp[j++] = Troop_Param[i].TroopType;
Troop_Param[i].Troopstate = 0; //默认无人启用群呼态0
FlashRamTemp[j++] = Troop_Param[i].Troopstate;
for(m=0;m<MAX_Ext;m++)
{
Troop_Param[i].Troop_Member[m] = 0xff; //默认成员状态为空0xff
FlashRamTemp[j++]= Troop_Param[i].Troop_Member[m];
}
}
Write_FlashPage();
Write_FlashSecter(0x0300);
/**********************************************************/
/*用户的物理参数表,地址从1000h开始*/
/**********************************************************/
for(i=0;i<TAL_EXT_PORT;i++)
{
FlashRamTemp[i] = 0; //默认高位是0
Ext_Param[i].Num_H_Logic = FlashRamTemp[i];
}
Write_FlashPage();
Write_FlashSecter(0x1000);
for(i=0;i<TAL_EXT_PORT;i++)
{
FlashRamTemp[i] = i; //默认低位是标准有序
Ext_Param[i].Num_L_Logic = FlashRamTemp[i];
}
Write_FlashPage();
Write_FlashSecter(0x1100);
for(i=0;i<TAL_EXT_PORT;i++)
{
FlashRamTemp[i] = 0xff; //默认热线号码是无效0xff
Ext_Param[i].Num_Hot_Call = FlashRamTemp[i];
}
Write_FlashPage();
Write_FlashSecter(0x1200);
for(i=0;i<TAL_EXT_PORT;i++)
{
FlashRamTemp[i] = 0xff; //默认转移号码是无效0xff
Ext_Param[i].Num_Trans_Call = FlashRamTemp[i];
}
Write_FlashPage();
Write_FlashSecter(0x1300);
for(i=0;i<TAL_EXT_PORT;i++)
{
FlashRamTemp[i] = 0xff; //默认回叫号码是无效0xff
Ext_Param[i].Num_Busy_Recall = FlashRamTemp[i];
}
Write_FlashPage();
Write_FlashSecter(0x1400);
for(i=0;i<TAL_EXT_PORT;i++)
{
FlashRamTemp[i] = 0; //默认组呼号码是有效0
Ext_Param[i].Num_Group_Call = FlashRamTemp[i];
}
Write_FlashPage();
Write_FlashSecter(0x1500);
for(i=0;i<TAL_EXT_PORT;i++)
{
FlashRamTemp[i] = 0; //默认中继组号码是无效0
Ext_Param[i].Trk_Group_Right = FlashRamTemp[i];
}
Write_FlashPage();
Write_FlashSecter(0x1600);
for(i=0;i<TAL_EXT_PORT;i++)
{
FlashRamTemp[i] = 0xff; //默认中继组归属是无效0xff
Ext_Param[i].Trk_Group_Num = FlashRamTemp[i];
}
Write_FlashPage();
Write_FlashSecter(0x1700);
for(i=0;i<TAL_EXT_PORT;i++)
{
FlashRamTemp[i] = 0xff; //默认中继组归属是默认0xff
Ext_Param[i].Trk_Group_Param = FlashRamTemp[i];
}
Write_FlashPage();
Write_FlashSecter(0x1800);
for(i=0;i<TAL_EXT_PORT;i++)
{
FlashRamTemp[i] = 0; //默认用户功能参数是默认0
Ext_Param[i].Bit_Param = FlashRamTemp[i];
}
Write_FlashPage();
Write_FlashSecter(0x1900);
for(i=0;i<TAL_EXT_PORT;i++)
{
FlashRamTemp[i] = 0xff; //默认用户功能参数是默认0
Ext_Param[i].Num_Troop_Call= FlashRamTemp[i];
}
Write_FlashPage();
Write_FlashSecter(0x1a00);
/*****************************************/
/*1000个用户的逻辑号码表初始化*/
/*****************************************/
j = 0;
for(i=0;i<255;i++)
{
FlashRamTemp[i] = j; //默认用户逻辑号码参数有序
EXT_Number_List[j++] = FlashRamTemp[i];
}
FlashRamTemp[i] = j;
EXT_Number_List[j++] = FlashRamTemp[i];
Write_FlashPage();
Write_FlashSecter(0x2000);
for(i=0;i<255;i++)
{
FlashRamTemp[i] = j;
EXT_Number_List[j++] = FlashRamTemp[i];
}
FlashRamTemp[i] = j;
EXT_Number_List[j++] = FlashRamTemp[i];
Write_FlashPage();
Write_FlashSecter(0x2100);
for(i=0;i<255;i++)
{
FlashRamTemp[i] = j;
EXT_Number_List[j++] = FlashRamTemp[i];
}
FlashRamTemp[i] = j;
EXT_Number_List[j++] = FlashRamTemp[i];
Write_FlashPage();
Write_FlashSecter(0x2200);
for(i=0;i<255;i++)
{
FlashRamTemp[i] = j;
EXT_Number_List[j++] = FlashRamTemp[i];
if( j>=1000 )
break;
}
Write_FlashPage();
Write_FlashSecter(0x2300);
}
/************************************
name:ISR_TIMER0 INTERRUPT
中断为1ms
1ms->5ms
5ms->15ms
15ms->30ms
30ms->90ms
90ms->990ms
把中断改为1.14毫秒,全部都改过了。
************************************/
void ISR_TIMER0() interrupt 1
{
TF0 = 0;
LOAD_TIMER0(TimerH_1_14ms, TimerL_1_14ms);
CounterMS++;
Counter_Uart++;
if( Counter_Uart >=3 )
{
Counter_Uart = 0;
if( RI )
{
RI = 0;
MICRO_SendToBuf(UartRec_List[WP_UartRec], SBUF,
WP_UartRec, TAL_UartRec, AlignSize);
}
if( TAL_UartSend )
{
if( TI )
TI = 0;
MICRO_GetFromBuf(UartSend_List[RP_UartSend], SBUF,
RP_UartSend, TAL_UartSend, AlignSize);
}
}
if( CounterMS >= 5 )
{
CounterMS = 0;
Counter5MS++;
Flag5MS = 1;
if(Counter5MS==1)
{
Flagscan = 1;
}
}
Read_8870ST();
if( Counter5MS >= 3 )
{
Counter5MS = 0;
Counter15MS++;
Flag15MS = 1;
Control_4052();
}
if( Counter15MS >= 2 )
{
Counter15MS = 0;
Counter30MS++;
Flag30MS = 1;
}
if( Counter30MS >= 3 )
{
Counter30MS = 0;
Counter90MS++;
Flag90MS = 1;
}
if( Counter90MS >= 10 )
{
Counter90MS = 0;
Flag1S = 1;
WorkRight =~WorkRight;
}
}
/************************************
Name:Write_FlashProvide
Input:none
Output:none
description:provide write the flash ram
************************************/
void Write_FlashProvide(unchar operation_type)
{
SelecEN_A15 = 0;
SelecEN_A16 = 0;
SelecEN_Port = 0;
/*********************************
0 Eanble_protect
1 Disanble_protec
2 Erase_flash
3 Load_flashID
4 Boot_first16K
5 Boot_last16K
#define W29c040p1 0x5555 //写040操作1地址
#define W29c040p2 0x2aaa //写040操作2地址
*********************************/
switch(operation_type)
{
case 0:
XBYTE[(W29c040p1 + 0x8000)] =0xaa;
XBYTE[(W29c040p2 + 0x8000)] =0x55;
XBYTE[(W29c040p1 + 0x8000)] =0xa0;
break;
case 1:
XBYTE[(W29c040p1 + 0x8000)] =0xaa;
XBYTE[(W29c040p2 + 0x8000)] =0x55;
XBYTE[(W29c040p1 + 0x8000)] =0x80;
XBYTE[(W29c040p1 + 0x8000)] =0xaa;
XBYTE[(W29c040p2 + 0x8000)] =0x55;
XBYTE[(W29c040p1 + 0x8000)] =0x20;
break;
case 2:
XBYTE[(W29c040p1 + 0x8000)] =0xaa;
XBYTE[(W29c040p2 + 0x8000)] =0x55;
XBYTE[(W29c040p1 + 0x8000)] =0x80;
XBYTE[(W29c040p1 + 0x8000)] =0xaa;
XBYTE[(W29c040p2 + 0x8000)] =0x55;
XBYTE[(W29c040p1 + 0x8000)] =0x10;
break;
case 3:
break;
case 4:
break;
case 5:
break;
default:
break;
}
SelecEN_Port = 1;
}
/************************************
Name:Write_FlashSecter(unint strataddr)
Input:none
Output:none
description:get the cycle time from data_len_h(secter len)
read out the data from flash ram
overwrite the data from new
rewrite the data to flash ram
************************************/
void Write_FlashSecter(unint startaddr)
{
TR0 = 0;
Write_FlashProvide(Disable_Protect);
Delay_ms(20);
Write_FlashPage();
Write_FlashRam(startaddr);
Delay_ms(20);
Write_FlashProvide(Enable_Protect);
Delay_ms(20);
TR0 = 1;
}
/************************************
Name:Read_FlashSecter(unint strataddr)
Input:startaddr
Output:none
description:get the cycle time from data_len_h(secter len)
read out the data from flash ram
send the flash ram data to flash buf
************************************/
void Read_FlashSecter(unint startaddr)
{
unchar data i;
SelecEN_Port = 0;
for(i=0;i<255;i++)
{
FlashRamTemp[i] = XBYTE[(startaddr+i+0x8000)];
}
FlashRamTemp[i] = XBYTE[(startaddr+i+0x8000)];
SelecEN_Port = 1;
}
/************************************
Name:Write_FlashRam(unint strataddr)
Input:startaddr
Output:none
description:rewrite the flash buf data to flash ram
************************************/
void Write_FlashRam(unint startaddr)
{
unchar i;
SelecEN_Port = 0;
for(i = 0;i<255;i++)
{
XBYTE[(startaddr + i+0x8000)] = FlashRamTemp[i];
}
XBYTE[(startaddr + i+0x8000)] = FlashRamTemp[i];
SelecEN_Port = 1;
}
/****************************************
Name:Write_FlashPage
Input: none
output:none
description:select the flash ram page addr line(a15,a16,a17,a18)
****************************************/
void Write_FlashPage(void)
{
SelecEN_A15 = 0;
SelecEN_A16 = 0;
}
/************************************
Name:Delay_5ms
Input:none
Output:none
description:timer delay for time on ms
************************************/
void Delay_ms(unchar counter)
{
unchar i;
unint j;
for(i=0;i<=counter;i++)
{
for(j=0;j<delayms;j++)
{}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -