?? jbinit.c
字號:
/*************************************************************
*
* 文 件 名: jbMain.c
* 說 明: JJF24-1B型計費器主程序文件
* 起始日期: 1999.11.25
*
************************************************************/
//#pragma SRC
//#pragma DEBUG
#include <jbInit.h>
byte code aVersion[]={'J','F','B','0','5','0','4','4','0','1'};
/***********************************************************
*
* 函 數:ApiProgram(void)
* 說 明:應用程序主循環
*
************************************************************/
void ApiProgram(void)
{
bFailTimes=0;
fWaitExit=0;
fFirstCmd=0;
bLastCmd=0xff;
bStatusWord=S_HARDWAREINIT; // 程序主循環
bFailTimes=0;
bEnterFlag=0;
while(TRUE){
switch(bStatusWord){
case S_HARDWAREINIT: // 00:硬件初始化過程
HardwareInit();
break;
case S_OLDPARAINIT: // 01:OLD模式變量初始化
OldParaInit();
break;
case S_OLDMASTERCALL: // 09:NEW模式主叫通話過程
OldMasterCall();
break;
case S_OLDSLAVECALL: // 10:NEW模式被叫通話過程
OldSlaveCall();
break;
case S_OLDLOCKWAIT: // 07:NEW模式鎖機等待過程
case S_NEWLOCKWAIT: // 07:NEW模式鎖機等待過程
LockWait();
TR2=0;
ET2=0;
break;
case S_OLDUNLOCKWAIT: // 08:NEW模式開鎖(掛機)等待過程
case S_NEWUNLOCKWAIT: // 08:NEW模式開鎖(掛機)等待過程
UnLockWait();
break;
case S_NEWPARAINIT: // 06:NEW模式變量初始化過程
NewParaInit();
break;
case S_NEWMASTERCALL: // 09:NEW模式主叫通話過程
NewMasterCall();
break;
case S_NEWSLAVECALL: // 10:NEW模式被叫通話過程
NewSlaveCall();
break;
// MODEM通信上呼狀態散轉:
case S_UPCALL: // 11:撥號呼叫管理機過程
UpCall();
break;
case S_OLDUPCOMM: // 12:OLD模式數據上傳過程
OldComm();
break;
case S_NEWUPCOMM: // 13:NEW模式數據上傳過程
NewComm();
break;
// MODEM通信下傳狀態散轉:
case S_DOWNCALL: // 14:管理機下呼過程
DownCall();
break;
case S_OLDDOWNCOMM: // 15:OLD模式數據下傳過程
OldComm();
break;
case S_NEWDOWNCOMM: // 16:NEW模式數據下傳過程
NewComm();
break;
// 公共過程處理:
case S_SERIALCOMM: // 17:RS232串行口通信過程
UartComm();
break;
case S_SERVICE: // 18:維護狀態
Server();
break;
default: // 出現異常時,重新進行初始化
bStatusWord=S_HARDWAREINIT;
break;
} // End switch(bStatusWord)
if(bDlpReason!=0)
return;
} // End while(TRUE)
}
// End function: Main()
/*************************************************************
*
* 函 數: HardwareInit()
* 說 明: JJF24-1B型計費器上電硬件初始化函數
* 處理定時器,中斷,外部口及12887初始化、
*
************************************************************/
void HardwareInit(void)
{
byte i;
byte bdata *Point;
TMOD=0x21; // 定時器0選擇工作模式1
TH0=L5MS_H; // 主頻為11.0592MHZ,5MS定時常數
TL0=L5MS_L;
TH1=L9600; // 串口9600BPS定時常數
TL1=L9600;
T2CON=0x00; /* time2 16-bits reload mode */
RCAP2H=L278us_H;
RCAP2L=L278us_L;
SCON=0x40; // 串口工作模式1,8位UART
PCON=0x80;
for(Point=0x20;Point<=0x2f;Point++)
*Point=0;
IP=0x20; // 中斷初始化, 278us 為最高級中斷
IT0=0;EX0=0;
IT1=1;EX1=0;
TR0=1;ET0=1;
TR1=0;ET1=0;
TR2=0;ET2=0;
ES=0;
EA=1;
cbDelay5MS=30;
fDelay5MS=0;
while(!fDelay5MS) IDLE;
DispInit(); // 顯示初始化
DispClr(); // 清除大顯示器
ReadByte(RTC_CONTROLC,6); // 取消12887中斷請求信號
Close(MLD);
Open(RLY);
Close(POWER_ON);
ResetModem();
Speaker(80);
pReadNumber=0; // 全局共用變量初始化
pWriteNumber=0;
cbFangDao=200;
// yxw 2001-05-12 16:08 add
Page(6);
OutBuf|=0x04;
XBYTE[OUT_CE]=OutBuf;
Page(5);
bErrorCode=ERR_NO;
fWaitExit=0;
AutoReadPara(47); // 讀處計費器當前工作模式
if(bParaByte==0x88)
fWorkMode=0;
else{
fWorkMode=1;
if(bParaByte!=0x99){
bParaByte=0x99;
AutoWritePara(47);
}
}
CheckPara();
if(KeyProcess())
return;
AutoReadPara(49);
if(bParaByte!=0x55){
memset(&aDataBuf,0x00,20);
WriteData(1,PARA_100,20,&aDataBuf);
bParaByte=0x55;
AutoWritePara(49);
}
AutoReadPara(50);
for(i=0;i<10;i++){
if(aVersion[i]!=aParaBuf[i]){
bErrorCode=ERR_34;
break;
}
}
if(bErrorCode==ERR_34){
for(i=0;i<10;i++)
aParaBuf[i]=aVersion[i];
WriteData(1,PARA_50,10,&aParaBuf); //填入版本號
}
bErrorCode=ERR_NO;
CheckRTCTime(); // 檢查12887中時間值的合法性
CheckSumTest(); // 檢查各種重要參數檢驗和
//
bErrorCode=ERR_NO;
//
if(bErrorCode!=ERR_NO){
DispErrorCode();
if(fWorkMode){
AutoReadPara(16);
if(bParaByte>8)
bParaByte=8;
if(bParaByte<1)
bParaByte=1;
}
else
bParaByte=3;
if(bFailTimes>9)
bFailTimes=0;
if(bFailTimes<bParaByte){
if(fWorkMode)
bCallReason=NEW_TEST;
else
bCallReason=OLD_TEST;
bStatusWord=S_UPCALL;
return;
}
else{
bStatusWord=S_NEWLOCKWAIT;
cbRingTimes=0;
cbRingPulseNum=0;
while(1){ //多次呼叫不成功后,等待系統呼入
IDLE;
if((cbRingTimes>3)||(OffHook()&&InComingCall())){
if(DetectConnectTone(1)){
bStatusWord=S_DOWNCALL;
Open(POWER_ON);
}
else
bStatusWord=S_HARDWAREINIT;
return;
}
}
}
}
DispCurrentDate();
SavePowerOnOff();
InBuf=ReadByte(IN_CE,6); // 檢查外線是否接反
if((InBuf&0x08)==0){
Close(RLY);
DelaySecond(2);
InBuf=ReadByte(IN_CE,6);
Open(RLY);
if((InBuf&0x08)!=0){
bErrorCode=ERR_20;
DispErrorCode();
}
}
else
DelaySecond(2);
//
EX0=1;
fMustReport=0;
fDelaySecond=1;
fLocked=1;
if(fWorkMode)
bStatusWord=S_NEWPARAINIT;
else
bStatusWord=S_OLDPARAINIT;
Page(5);
}
// End function: HardWareInit()
/****************************************************************
*
* 函 數: OldParaInit()
* 說 明: OLD模式參數初始化處理
* 調整記錄指針,記錄開關機記錄
*
**************************************************************/
byte code aParaCode[]={67,68,69,70,71,72};
byte code aOldRange[]={199,199,200,31,14,34};
uint code aNewRange[]={499,499,500,31,31,34};
byte code aAccumulateCode[]={60,65};
void CheckPara(void)
{
byte i;
byte j,bTemp;
uint iTemp;
//判斷主、被叫統計參數是否越界
for(i=0;i<2;i++){
j=aAccumulateCode[i];
AutoReadPara(j);
if(iParaWord>9999){
iParaWord=0;
lParaLWord=0;
AutoWritePara(j);
AutoWritePara(j+1);
}
}
//判斷各指針是否超出范圍
for(i=0;i<6;i++){
if(fWorkMode)
iTemp=aNewRange[i];
else
iTemp=aOldRange[i];
if(i>2)
bTemp=(byte)iTemp;
j=aParaCode[i];
AutoReadPara(j);
if(i>2){
if(bParaByte>bTemp)
bParaByte=0;
else
continue;
}
else{
if(iParaWord>iTemp)
iParaWord=0;
else
continue;
}
AutoWritePara(j);
}
//判斷日分項合計的時間是否為非法
WaitRTC();
Page(6);
if((XBYTE[0xc02c]>0x12)||(XBYTE[0xc02d]>0x31)
||(XBYTE[0xc02c]==0)||(XBYTE[0xc02d]==0)){
XBYTE[0xc02a]=0x20;
XBYTE[0xc02b]=XBYTE[0xc009];
XBYTE[0xc02c]=XBYTE[0xc008];
XBYTE[0xc02d]=XBYTE[0xc007];
for(iTemp=0xc02e,i=0;i<17;i++,iTemp++)
XBYTE[iTemp]=0;
}
Page(5);
}
void OldParaInit(void)
{
AutoReadPara(211); // 初始化各種控制標志位
fbBuf1=bParaByte;
fIDDPrintLimit=fDDDPrintLimit;
AutoReadPara(212);
fbBuf2=bParaByte;
//
AutoReadPara(203);
bAutoOffHookTimes=bParaByte>>4;
bReDialTimes=bParaByte&0x0f;
AutoReadPara(205);
bResetTime=bParaByte;
AutoReadPara(209);
bReportNum=bParaByte;
//
if(fAutoReport)
bReportWord=1;
else
bReportWord=0;
iDetectCarrierTime=50;
iCancelCodeDelay=0;
bStationFDLength=0;
iOffHookTime=20;
bAutoOnOffHookTime=20;
bTalkDispTime=20;
bOffHookDelay=120;
fSaveFreeTalk=0;
fSaveInTalk=0;
fStartFangDao=0;
fFanjiFangDao=0;
// Use For Wait Status
iTalkLength=199;
bDayTotalLength=14;
fUnlockStat=0;
// Read Old Mode Control Parameter.
AutoReadPara(51);
// if((bParaByte&0x01)!=0) // FDD
// fFDD=1;
// else
fFDD=0;
if((bParaByte&0x02)!=0) // NO
fDispTalkPointer=1;
else
fDispTalkPointer=0;
if((bParaByte&0x08)!=0) // BHY
fDetectDialTone=1;
else
fDetectDialTone=0;
if((bParaByte&0x20)!=0) // FPU
fPluseFD=1;
else
fPluseFD=0;
if((bParaByte&0x40)!=0) // CDY
iWaitDDTime=400;
else
iWaitDDTime=320;
//
bStatusWord=S_OLDLOCKWAIT;
}
// End function: OldParaInit()
/****************************************************************
*
*
* 函 數: NewParaInit()
* 說 明: NEW模式參數初始化處理
*
*
**************************************************************/
void NewParaInit(void)
{
fUnlockStat=0;
ReadData(1,PARA_07,14,&aNumBuf);
if(aNumBuf[0]!=0)
fIDDCallLimit=1; // IDD呼出限制
if(aNumBuf[1]!=0)
fDDDCallLimit=1; // DDD呼出限制
if(aNumBuf[2]!=0)
fLOCCallLimit=1; // LOCLA呼出限制
if(aNumBuf[3]!=0)
fIDDPrintLimit=1; // IDD打印限制
if(aNumBuf[4]!=0)
fDDDPrintLimit=1; // DDD打印限制
if(aNumBuf[5]!=0)
fLOCPrintLimit=1; // LOCAL打印限制
if(aNumBuf[6]!=0)
fDialForm=1; // 主叫撥號方式
if(aNumBuf[7]!=0)
fSecretSelect=1; // 通訊加密選擇
if(aNumBuf[8]!=0)
fHanderEnable=1; // 手動計時允許
if(aNumBuf[9]!=0)
fErrorAutoCall=1; // 自檢出錯呼叫管理系統
if(aNumBuf[10]!=0)
fClearTotalEnable=1; // 允許手動清累計值
if(aNumBuf[11]!=0)
fUnlockStat=1;
if(aNumBuf[12]!=0)
fEndLockEnable=1; // 話畢鎖機
if(aNumBuf[13]!=0)
fSlaveCalcForm=1; // 呼入是否自動計費
AutoReadPara(03);
bAutoOffHookTimes=bParaByte;
AutoReadPara(04);
bReDialTimes=bParaByte;
AutoReadPara(05);
bReportWord=bParaByte;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -