?? jbinit.c
字號:
AutoReadPara(06);
bReportNum=bParaByte;
AutoReadPara(29);
iResetTime=iParaWord;
AutoReadPara(30);
iAutoDelayTime=iParaWord;
AutoReadPara(31);
if((iParaWord<320)||(iParaWord>800))
iParaWord=320;
iWaitDDTime=iParaWord;
AutoReadPara(32);
iDetectCarrierTime=iParaWord;
AutoReadPara(33);
iCancelCodeDelay=iParaWord;
AutoReadPara(34);
bStationFDLength=bParaByte;
AutoReadPara(35);
iOffHookTime=iParaWord;
ReadData(1,PARA_36,11,&aNumBuf);
bAutoOnOffHookTime=aNumBuf[0];
bTalkDispTime=aNumBuf[1];
fSaveFreeTalk=0;
fSaveInTalk=0;
fStartFangDao=0;
fFanjiFangDao=0;
fPluseFD=0;
fDetectDialTone=0;
fDispTalkPointer=0;
fFDD=0;
if(aNumBuf[2]!=0)
fSaveFreeTalk=1;
if(aNumBuf[3]!=0)
fSaveInTalk=1;
if(aNumBuf[4]!=0)
fStartFangDao=1;
bOffHookDelay=aNumBuf[5];
if(aNumBuf[6]!=0)
fFanjiFangDao=1;
if(aNumBuf[7]!=0)
fPluseFD=1;
if(aNumBuf[8]!=0)
fDetectDialTone=1;
if(aNumBuf[9]!=0)
fDispTalkPointer=1;
if(aNumBuf[10]!=0)
fFDD=0;
// fFDD=1;
//
iTalkLength=499;
bDayTotalLength=31;
//
bStatusWord=S_NEWLOCKWAIT;
}
// End function: NewParaInit()
/***********************************************************
*
* 函 數(shù): SavePowerOnOff()
* 說 明: 記錄計費器開關(guān)機記錄
* 入 口:aRTCTime[]存儲當前12887中的時間
* aUserRTCBuf[]存儲上次關(guān)機時的時間
*
**********************************************************/
void SavePowerOnOff(void)
{
byte i,bLen;
uint iAddr;
byte xdata *Point0;
byte xdata *Point1;
WaitRTC();
Page(6);
Point0=&aRTCTime;
Point1=&aUserRTCBuf;
if((*(Point1+YEARL)==*(Point0+9)) // 開關(guān)機時間差檢查
&&(*(Point1+MONTH)==*(Point0+8))
&&(*(Point1+DAY)==*(Point0+7))
&&(*(Point1+HOUR)==*(Point0+4))
&&(*(Point1+MINUTE)==*(Point0+2))){
Page(5);
return;
}
if(fWorkMode){
iAddr=NEW_POWERONOFF_ADDR;
bLen=12;
}
else{
iAddr=OLD_POWERONOFF_ADDR;
bLen=8;
}
Page(5);
AutoReadPara(70);
if(bParaByte>=32)
bParaByte=0;
iAddr+=(uint)(bParaByte*bLen);
if(++bParaByte>=32)
bParaByte=0;
AutoWritePara(70);
//準備本次開關(guān)機記錄數(shù)據(jù):
Page(6);
//if(Point1[YEARH]>0x90)
//aNumBuf[0]=0x19;
//else
aNumBuf[0]=0x20;
aNumBuf[1]=Point1[YEARL];
aNumBuf[2]=Point1[MONTH];
aNumBuf[3]=Point1[DAY];
aNumBuf[4]=Point1[HOUR];
aNumBuf[5]=Point1[MINUTE];
if((aNumBuf[1]>=0x9a)||(aNumBuf[2]>=0x13)||(aNumBuf[3]>=0x32)
||(aNumBuf[4]>=0x24)||(aNumBuf[5]>=0x5a))
return;
//if(Point0[9]>0x90)
//aNumBuf[6]=0x19;
//else
aNumBuf[6]=0x20;
aNumBuf[7]=Point0[9];
aNumBuf[8]=Point0[8];
aNumBuf[9]=Point0[7];
aNumBuf[10]=Point0[4];
aNumBuf[11]=Point0[2];
if(!fWorkMode){ //老模式的情況下,開關(guān)機記錄長度不一至
for(i=0;i<12;i++)
aNumBuf[i]=aNumBuf[i+2];
for(i=4;i<10;i++)
aNumBuf[i]=aNumBuf[i+2];
}
Page(5);
memcpy(&aDataBuf,&aNumBuf,bLen);
iPaNeNum=bLen;
GeneralWriteData(iAddr);
}
// End function: SavePowerOnOff()
/***********************************************************
*
*
* 函 數(shù): CheckRTCTime()
* 說 明: 檢查RTC時間值的合法性
*
*
**********************************************************/
byte code aValidTime[][2]={0,99,
1,12,
1,31,
0,6,
0,23,
0,59,
0,59};
void CheckRTCTime(void)
{
byte i;
WaitRTC();
Page(6);
aNumBuf[0]=aRTCTime[9];
aNumBuf[1]=aRTCTime[8];
aNumBuf[2]=aRTCTime[7];
aNumBuf[3]=(aRTCTime[6]&0x0f)-1;
aNumBuf[4]=aRTCTime[4];
aNumBuf[5]=aRTCTime[2];
aNumBuf[6]=aRTCTime[0];
Page(5);
for(i=0;i<7;i++){
if(!CheckValue(i)){
bErrorCode=ERR_19;
return;
}
}
}
bool CheckValue(byte bNum)
{
byte bTemp;
if(((aNumBuf[bNum]&0xf0)>0x90)||
((aNumBuf[bNum]&0x0f)>0x09))
return FALSE;
bTemp=((aNumBuf[bNum]>>4)&0x0f)*10+(aNumBuf[bNum]&0x0f);
if((bTemp>=aValidTime[bNum][0])&&(bTemp<=aValidTime[bNum][1]))
return TRUE;
else
return FALSE;
}
// End function: CheckRTCTime()
// 當12887即將更新時鐘時,先等待。
void WaitRTC(void)
{
byte bTemp;
while(TRUE){
IDLE;
Page(6);
bTemp=XBYTE[RTC_CONTROLA];
Page(5);
if((bTemp&0x80)==0)
break;
}
}
// End function: WaitRTC()
/*************************************************************
*
* 函 數(shù): CheckSumTest()
* 說 明: 計算參數(shù)檢驗并順序存入aNumBuf緩沖區(qū)中
*
************************************************************/
void CheckSumTest(void)
{
uint iAddr;
byte i;
Page(6);
if(XBYTE[PARA_76]==1){
bErrorCode=ERR_99;
Page(5);
memset(aNumBuf,0xff,10);
return;
}
Page(5);
if(fWorkMode){
AutoReadPara(100);
aNumBuf[0]=CalcCSSubA(NEW_SYSTEM_ADDR,iParaWord);
AutoReadPara(101);
aNumBuf[1]=CalcCSSubA(NEW_DISCOUNT_ADDR,iParaWord);
AutoReadPara(102);
aNumBuf[2]=CalcCSSubA(NEW_CALLSTATION_ADDR,iParaWord);
AutoReadPara(103);
aNumBuf[3]=CalcCSSubA(NEW_IDD_CLASS_ADDR,iParaWord);
AutoReadPara(104);
aNumBuf[4]=CalcCSSubA(NEW_DDD_CLASS_ADDR,iParaWord);
AutoReadPara(105);
aNumBuf[5]=CalcCSSubA(NEW_LOCAL_CLASS_ADDR,iParaWord);
AutoReadPara(106);
aNumBuf[6]=CalcCSSubA(NEW_IDD_TARIFF_ADDR,iParaWord);
AutoReadPara(107);
aNumBuf[7]=CalcCSSubA(NEW_DDD_TARIFF_ADDR,iParaWord);
AutoReadPara(108);
aNumBuf[8]=CalcCSSubA(NEW_LOCAL_TARIFF_ADDR,iParaWord);
ReadData(1,PARA_90,9,&aDataBuf);
}
else{
aNumBuf[0]=CalcCSSubA(OLD_SYSTEM_ADDR,0x18);
aNumBuf[1]=CalcCSSubA(OLD_DISCOUNT_ADDR,0x29);
aNumBuf[2]=CalcCSSubA(OLD_DISABLE_ADDR,0x20);
aNumBuf[3]=CalcCSSubA(OLD_IDD_CLASS_ADDR,0x02*128+0x68);
aNumBuf[4]=CalcCSSubA(OLD_DDD_CLASS_ADDR,0x04*128+0x1c);
aNumBuf[5]=CalcCSSubA(OLD_LOCAL_CLASS_ADDR,0x02*128+0x68);
aNumBuf[6]=CalcCSSubB(0xf310); // IDD國際費率區(qū)號表
aNumBuf[7]=0xff;
aNumBuf[8]=0xff;
iAddress=PARA_232;
ReadBytes(1,6);
if(aParaBuf[2]==(byte)(aParaBuf[0]+aParaBuf[1])){
iAddr=(uint)(aParaBuf[0]*256)+aParaBuf[1];
iAddr|=0xf000;
aNumBuf[7]=CalcCSSubB(iAddr); // DDD國內(nèi)費率區(qū)號表
}
if(aParaBuf[5]==(byte)(aParaBuf[3]+aParaBuf[4])){
iAddr=(uint)(aParaBuf[3]*256)+aParaBuf[4];
iAddr|=0xf000;
aNumBuf[8]=CalcCSSubB(iAddr); // DDD國內(nèi)費率區(qū)號表
}
ReadData(1,PARA_223,9,&aDataBuf);
}
for(i=0;i<9;i++){
if(aDataBuf[i]!=aNumBuf[i]){
bErrorCode=ERR_10+i;
break;
}
}
}
// End function: CheckSumTest()
// 計算從指定地址開始iLen長度字節(jié)的檢驗和:
byte CalcCSSubA(uint iAddr,uint iLen)
{
byte bCheckSum=0;
if(iLen==0)
return 0;
Page(1);
while((iLen--)!=0)
bCheckSum+=XBYTE[iAddr++];
Page(5);
return bCheckSum;
}
// End function: CalcCSSumA()
/*************************************************************
*
* 函數(shù)名: CalcCSSubB
* 說 明: 計算區(qū)號表中從StartAddr開始至該地址為0xff的檢驗和
*
************************************************************/
byte CalcCSSubB(uint iAddr)
{
byte bCheckSum=0,bTemp;
while(TRUE){
Page(1);
bTemp=XBYTE[iAddr++];
bCheckSum+=bTemp;
if(bTemp==0xff)
break;
if(iAddr<0xe220)
break;
}
Page(5);
return bCheckSum;
}
// End function: CalcCSSubB(.)
/*************************************************************
*
* 函數(shù)名: DispCurrentDate
* 說 明: 初始顯示當前時鐘(年-月-日 周).
*
************************************************************/
void DispCurrentDate(void)
{
byte i;
memset(aLargeBuf,'\0',20);
WaitRTC();
aLargeBuf[0]=aLCDSegment[2];
aLargeBuf[1]=aLCDSegment[0];
Page(6);
aNumBuf[0]=aLCDSegment[aRTCTime[9]>>4];
aNumBuf[1]=aLCDSegment[aRTCTime[9]&0x0f];
aNumBuf[2]=aLCDSegment[aRTCTime[8]>>4];
aNumBuf[3]=aLCDSegment[aRTCTime[8]&0x0f];
aNumBuf[4]=aLCDSegment[aRTCTime[7]>>4];
aNumBuf[5]=aLCDSegment[aRTCTime[7]&0x0f];
aNumBuf[6]=aLCDSegment[(aRTCTime[6]&0x0f)-1];
Page(5);
aLargeBuf[2]=aNumBuf[0];
aLargeBuf[3]=aNumBuf[1];
aLargeBuf[4]=0x20;
aLargeBuf[5]=aNumBuf[2];
aLargeBuf[6]=aNumBuf[3];
aLargeBuf[7]=0x20;
aLargeBuf[8]=aNumBuf[4];
aLargeBuf[9]=aNumBuf[5];
aLargeBuf[11]=aNumBuf[6];
if(!fWorkMode){
for(i=0;i<8;i++)
aLargeBuf[i]=aLargeBuf[i+2];
aLargeBuf[8]=aLargeBuf[9]=0;
aLargeBuf[10]=aLargeBuf[11];
aLargeBuf[11]=0;
}
DispOut();
}
// End function: DispCurrentDate()
void Delay5MS(byte bTime)
{
if(bTime==0)
return;
cbDelay5MS=bTime;
fDelay5MS=0;
while(!fDelay5MS)
PCON=0x81;
}
// End function: Delay5MS()
void DelaySecond(byte bSecond)
{
byte i;
for(i=0;i<bSecond;i++){
cbDelay5MS=200;
fDelay5MS=0;
while(!fDelay5MS)
PCON=0x81;
}
}
// End function: DelaySecond()
// 頁面切換函數(shù):
void Page(byte bPage)
{
EA=0;
P1=(P1&0xf8)|bPage;
EA=1;
}
// End function: Page()
// End file: jbinit.c
/***********************************************************************
JJF24-1B型計費器程序升級記錄
B050310*:MODEM芯片為CMX644。
B0503200:2000-08-25 10:32 升級
修改:1 將MODEM通訊芯片換成73K222
B0503201:2001-03-22 20:14 升級
修改:1 在SaveReocrd()函數(shù)中,未匯報話單指針增加時,要判斷
其是否越界
2 修改并機防盜的檢測方法,將并機防盜時間改為800毫秒
3 查找費率表時,若折扣時間從1:00開始,程序應(yīng)能判斷
4 改進被叫反極防盜方法
5 縮短待檢狀態(tài)下CPU的執(zhí)行時間
6 振鈴次數(shù)為0時的判斷
7 被叫是否允許基肥和是否自動計費的判斷
8 增加上海打印報表和打印格式
9 取消主叫摘機后的定時鎖機功能
B0503202:2001-04-01 13:35 升級
修改:1 上海打印報表在打印0時,會將其打印成空格
2 將并機防盜時間改為2秒鐘
B0503203:2001-04-05 20:22 升級
修改:1 將SRAM換成 WINBOND 的 w24100 時,計費器很難進行按鍵
開機。原因是因為w24100在上電時,初始值時0xaa,導(dǎo)致器
其與用于避免按鍵重復(fù)開機的標志值bEnterFlag相同,從
而使計費器無法按鍵開機。
修改時,在主循環(huán)外將bEnterFlag首先清為0。
2 當撥入201#時,計費器將不顯示其后的號碼。
3 當撥打特服和免費電話時,要注意清除接收號碼緩沖區(qū)內(nèi)
的值。 要判斷pReadNubmer<pWriteNumber時的情況。增
加參數(shù)bIs201。
B0503204: 2001-04-28 19:22 升級
修改:上海專用打印,增加上海打印格式和打印報表結(jié)束后的打印走
紙距離,打印數(shù)據(jù)前也增加了打印回紙距離。
B0503205: 2001-05-14 08:04 升級
修改:由于打印口的STB口線沒有被初始化為高,在上電時,從而造成
微打工作不正常。
查詢費率時每撥一個號碼都要查詢費率。
上海打印模式中,話畢不打印F0,F(xiàn)1,F(xiàn)2費。
B0503400: 2001-09-11 09:18 廈門修改
修改:增加來電顯示功能。
2002-03-26 11:34 增加廈門改造
1。將參數(shù)03含義改變:設(shè)為00時表示使用來電判斷,非零時表示
使用振鈴摘機功能,建議客戶端用下拉表實現(xiàn)。
2。增加擴充參數(shù)80,81.
3。增加管理系統(tǒng)號碼表。MODEM通訊命令為59,串口通訊命令為54。
4。增加相應(yīng)的MODEM和串口通訊內(nèi)容。
5。和廣東的費率設(shè)置一樣,沒有設(shè)置的區(qū)號作禁撥處理。因此缺省
費率可設(shè)為禁撥,即將級數(shù)3(缺省級數(shù))的F0和T0都設(shè)置為FFFFH。
6。區(qū)號的最大長度增加為16位,客戶端要做相應(yīng)改動。
7.通訊聯(lián)絡(luò)命令改為66BB。
B0504401: 2002-04-17 15:11 修改
修改: 增加來電號碼的存儲功能.和普通話單存儲在一起.
***********************************************************************/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -