📄 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()
/***********************************************************
*
* 函 数: SavePowerOnOff()
* 说 明: 记录计费器开关机记录
* 入 口:aRTCTime[]存储当前12887中的时间
* aUserRTCBuf[]存储上次关机时的时间
*
**********************************************************/
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)) // 开关机时间差检查
&&(*(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);
//准备本次开关机记录数据:
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){ //老模式的情况下,开关机记录长度不一至
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()
/***********************************************************
*
*
* 函 数: 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()
/*************************************************************
*
* 函 数: CheckSumTest()
* 说 明: 计算参数检验并顺序存入aNumBuf缓冲区中
*
************************************************************/
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国际费率区号表
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国内费率区号表
}
if(aParaBuf[5]==(byte)(aParaBuf[3]+aParaBuf[4])){
iAddr=(uint)(aParaBuf[3]*256)+aParaBuf[4];
iAddr|=0xf000;
aNumBuf[8]=CalcCSSubB(iAddr); // DDD国内费率区号表
}
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长度字节的检验和:
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()
/*************************************************************
*
* 函数名: CalcCSSubB
* 说 明: 计算区号表中从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(.)
/*************************************************************
*
* 函数名: 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()
// 页面切换函数:
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()函数中,未汇报话单指针增加时,要判断
其是否越界
2 修改并机防盗的检测方法,将并机防盗时间改为800毫秒
3 查找费率表时,若折扣时间从1:00开始,程序应能判断
4 改进被叫反极防盗方法
5 缩短待检状态下CPU的执行时间
6 振铃次数为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,导致器
其与用于避免按键重复开机的标志值bEnterFlag相同,从
而使计费器无法按键开机。
修改时,在主循环外将bEnterFlag首先清为0。
2 当拨入201#时,计费器将不显示其后的号码。
3 当拨打特服和免费电话时,要注意清除接收号码缓冲区内
的值。 要判断pReadNubmer<pWriteNumber时的情况。增
加参数bIs201。
B0503204: 2001-04-28 19:22 升级
修改:上海专用打印,增加上海打印格式和打印报表结束后的打印走
纸距离,打印数据前也增加了打印回纸距离。
B0503205: 2001-05-14 08:04 升級
修改:由于打印口的STB口線沒有被初始化為高,在上電時,從而造成
微打工作不正常。
查詢費率時每撥一個號碼都要查詢費率。
上海打印模式中,话毕不打印F0,F1,F2费。
B0503400: 2001-09-11 09:18 厦门修改
修改:增加来电显示功能。
2002-03-26 11:34 增加厦门改造
1。将参数03含义改变:设为00时表示使用来电判断,非零时表示
使用振铃摘机功能,建议客户端用下拉表实现。
2。增加扩充参数80,81.
3。增加管理系统号码表。MODEM通讯命令为59,串口通讯命令为54。
4。增加相应的MODEM和串口通讯内容。
5。和广东的费率设置一样,没有设置的区号作禁拨处理。因此缺省
费率可设为禁拨,即将级数3(缺省级数)的F0和T0都设置为FFFFH。
6。区号的最大长度增加为16位,客户端要做相应改动。
7.通讯联络命令改为66BB。
B0504401: 2002-04-17 15:11 修改
修改: 增加来电号码的存储功能.和普通话单存储在一起.
***********************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -