📄 ddsy922.c
字号:
case 0x1f:
{
(*(s+6))|=0x80;(*(s+7))=14; /*存入命令码及长度字节*/
(*(s+8))=0x1F;(*(s+9))=0x90;
for(i=0;i<4;i++)
*(s+10+i)=real_energy.money0.money_overplus[3-i];
for(i=0;i<4;i++)
*(s+14+i)=real_energy.money.money_sum[3-i];
for(i=0;i<4;i++)
*(s+18+i)=real_energy.electric.energy[3-i];
// page_read(OFFSET_OF(EEPROM_DATA,eprom_real_energy), s+10,sizeof(struct real_energy));
TXD_Int(s); /*发送一帧数据*/
}
break;
}
}
break;
case 0xc0:
{
switch(*(s+7))
{
case 0x30:
{
(*(s+6))|=0x80;(*(s+7))=0x05; /*存入命令码及长度字节*/
(*(s+8))=0x30;(*(s+9))=0xc0;
for(i=0;i<3;i++)
*(s+10+i)=meter_para.pulse_constant[2-i];
// IRcvStr(FM24W08,0x00,s+8,3);//电表的有功脉冲常数
TXD_Int(s); /*发送一帧数据*/
}
break;
case 0x33:
{
(*(s+6))|=0x80;(*(s+7))=0x08; /*存入命令码及长度字节*/
// for(i=0;i<6;i++)
// *(s+10+i)=meter_para.factory_No[i];
// IRcvStr(FM24W08,0x00,s+8,6);//电表的出厂编号
TXD_Int(s); /*发送一帧数据*/
}
break;
case 0x34:
{
// IRcvStr(FM24W08,0x00,s,6); /*读取电表通讯地址*/
(*(s+6))|=0x80;(*(s+7))=0x08; /*存入命令码及长度字节*/
//for(i=0;i<6;i++)
//*(s+10+i)=meter_para.factory_No[i];
// IRcvStr(FM24W08,0x00,s+8,4);//电表购电卡卡号
TXD_Int(s); /*发送一帧数据*/
}
break;
}
}
break;
}
}
break;
case 0x02: /*读后续帧数据*/
break;
case 0x03: /*重读帧数据*/
break;
case 0x04: /*写数据*/
switch(*(s+8))
{
case 0xb6:
if(~Serial_Password(s+8))/*密码是否正确*/
return 0; /*错误,返回*/
for(i=0;i<3;i++)
{aa=*(s+10+i);
*(s+10+i)=*(s+12-i);
*(s+12-i)=aa;}
page_write(OFFSET_OF(EEPROM_DATA,eprom_money_notice0),s+10,3);//&real_energy.energy[0]SIZE_OF(EEPROM_DATA,eprom_real_energy)
// DelayNus1(1);
/*构造返回数据帧*/
(*(s+6))|=0x80;(*(s+7))=0x03; /*存入命令码及长度字节*/
*(s+8)=0;
TXD_Int(s); /*发送一帧数据*/
break;
break;
case 0xc0:
break;
case 0xc1:
break;
case 0xc2:
break;
case 0xc3:
break;
case 0xc4:
break;
case 0xe1:
break;
}
break;
case 0x08: /*广播校时*/
break;
case 0x0A: /*写设备地址帧数据*/
break;
case 0x0C: /*更必通信速率帧数据*/
break;
case 0x10: /*最大需量清零帧数据*/
break;
case 0x14: /*读取指定数据标识项集合*/
break;
case 0x18: /*读取冻结电量数据*/
break;
case 0x1A: /*冻结电能数据*/
break;
case 0x1B: /*单相编程数据*/
break;
case 0x1D: /*单相读显示项数据*/
break;
case 0x1E: /*单相读编程项数据*/
break;
default: /*其他命令*/
break;
}
break;
}
return 1; /*帧执行正确,返回*/
}
//********************************************************************
//通讯主函数
//原型:void Serial_Command();
//功能:执行通讯命令
//入口参数:无
//出口参数:无
//********************************************************************/
void Serial_Command()
{
if(Command_status1&0x04) /*通讯事件发送*/
{
if(~Serial_Command_Run(ec.ReceBuf)) /*帧执行*/
//{ESR=1;Command_status1&=0xfb;return;} /*帧错误,恢复信道功能*/
//ESR=1; /*恢复信道功能*/
Command_status1&=0xfb; /*j 清除通讯处理事件*/
}
}
/********************************************************************
延时函数
原型:void Delay_T(unsigned char );
功能:延时1ms*i
入口参数: i 是设定延时时间
出口参数:无
********************************************************************/
void comm_ini(void)
{
page_read(0x4e,ec.ReceBuf,1); // 0xfd=19200,0xfa=9600,0xf4=4800,0xe8=2400,0xd0=1200
switch(ec.ReceBuf[0])
{
case 0:
TH1 = 0xFd;
break;
case 1:
TH1 = 0xFa;
break;
case 2:
TH1 = 0xF4;
break;
case 3:
TH1 = 0xe8;
break;
default:
//TH1 = 0xFd;
TH1 = 0xe8;
break;
}
}
/********************************************************************
/*
功能:查询卡座内是否有卡
输入:无
输出:1--卡座内有卡; 0--座内无卡
********************************************************************/
unsigned char _CardReady()
{
Flag_ICPort=0;
Portic=1;
/*根据自己的硬件编写处理过程*/
DelayNus1(25); //5ms
DelayNus1(25);
if(Portic)
{
Flag_ICPort=1;
return Flag_ICPort;
}
else
Flag_Play=0;
return Flag_ICPort;
}
/********************************************************************
/*
功能:置IC卡读写器Clock高或低。
输入:Level
当Level=1,给IC卡读写器Clock置高。
当Level=0,给IC卡读写器Clock置低。
输出:无
********************************************************************/
//void _CardSetClock(unsigned char level)
//{
/*根据自己的硬件编写处理过程*/
// if(level==HIGH)
// P2_3=HIGH;
// else
// P2_3=LOW;
//}
/********************************************************************
/*
功能:将IC卡读写器Vcc段上电或下电。插入或者拨出IC卡前请先下电。
输入:Level
当Level=POWERUP,给IC卡读写器上电。
当Level=POWERDOWN,给IC卡读写器下电。
输出:无
********************************************************************/
void _CardSetPower(unsigned char level)
{
/*根据自己的硬件编写处理过程*/
if(level==HIGH)
{
P2_2=LOW;
P2_1=LOW;
DelayNus1(25);//05ma
P2_0=LOW;
}
else
{
P2_2=LOW;
P2_1=LOW;
P2_0=LOW;
DelayNus1(25);//05ma
}
}
/********************************************************************
/*
功能:置IC卡读写器PGM高或低。
输入:Level
当Level=1,给IC卡读写器PGM置高。
当Level=0,给IC卡读写器PGM置低。
输出:无
********************************************************************/
//void _CardSetPGM(unsigned char level)
//{
/*根据自己的硬件编写处理过程*/
// if(level==HIGH)
// P2_3=HIGH;
// else
// P2_3=LOW;
//}
/********************************************************************
/*
功能:如果卡在位,上电并对AT88SC102型MEMORY卡复位。
输入:无
输出:-1 = 卡不在位;0 = 正常
*
********************************************************************/
unsigned char _C102Reset()
{
if(Flag_ICPort == 0)
return -1;
_CardSetPower(HIGH);
P2_3=0;
P2_0=1;
P2_2=1;
P2_1=0;
P2_2=0;
_nop_();
return 0;
}
/********************************************************************
/*
原型:void _C102AddsInc(unsigned char count)
功能:给出count个时钟脉冲,使AT88SC102型IC卡内部地址计数器增加count次。
输入:count
输出:无
********************************************************************/
void _C102AddsInc(unsigned char count)
{
unsigned char j,i;
for(j=0;j<count;j++)
{
for(i=0; i<8; i++)
{ P2_1=1;
_nop_();
P2_1=0;
_nop_();
}
}
}
/********************************************************************
延时函数
原型:void Delay_T(unsigned char );
功能:延时1ms*i
入口参数: i 是设定延时时间
出口参数:无
********************************************************************/
void _C102Prog0(void)
{
// _nop_();
P2_3=1;
_nop_();
P2_0=0;
_nop_();
_nop_();
P2_1=1;
_nop_();
P2_3=0;
DelayNus1(250);
P2_0=1;
P2_1=0;
_nop_();
}
/********************************************************************
延时函数
原型:void Delay_T(unsigned char );
功能:延时1ms*i
入口参数: i 是设定延时时间
出口参数:无
********************************************************************/
void _C102Prog1(void)
{
// _nop_();
P2_3=1;
P2_0=1;
_nop_();
_nop_();
_nop_();
P2_1=1;
_nop_();
P2_3=0;
DelayNus1(250);
P2_1=0;
_nop_();
}
/********************************************************************
延时函数
原型:void Delay_T(unsigned char );
功能:延时1ms*i
入口参数: i 是设定延时时间
出口参数:无
********************************************************************/
int _C102Addressing(unsigned char address)
{
if (_C102Reset() < 0)
return -1;
_C102AddsInc(address);
return 0;
}
/********************************************************************
/*
原型:unsigned char C102CheckSC(unsigned char *sc)
功能:比较密码。密码为2字节。
输入:sc:2字节
输出:返回值: 0 = 正确
其它 = 错误
********************************************************************/
unsigned char C102CheckSC(unsigned char *sc)
{
unsigned char i, k,l;
if( _C102Addressing(9) < 0 )
return -1;
for(i=0; i<7; i++)
{ P2_1=1;
_nop_();
P2_1=0;
_nop_();
}
for(i=0;i<2;i++)
{
for(k=0;k<8;k++)
{
P2_1=1;
P2_0=(bit)(*sc&0x80);
*sc<<=1;
P2_1=0;
_nop_();
}
sc++;
}
cc: P2_1=1;
P2_0=1;
P2_1=0;
if(P2_0==1)
{
_C102Prog0();
if(P2_0==1)
return 1;
_C102Prog1();
if(P2_0==0)
return 1;
}
else
{
l++;
if(l>=4)
return 1;
goto cc;
}
_CardSetPower(LOW);
return 0;
}
/********************************************************************
/*
原型:unsigned char _C102Read(unsigned char address, unsigned char *retmsg,unsigned char len)
功能:从IC卡地址address开始
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -