📄 com.c
字号:
CopyRamToEEP(ADDRESS_230AE,ComVar.RxBuff+16,30);
break;
case 0x230B: //产品条形码2(高30字节)
CopyRamToEEP(ADDRESS_230BE,ComVar.RxBuff+16,30);
break;
// case 0xC119: // 写命令 C119 有功底度
// if((ComVar.RxBuff[16]|ComVar.RxBuff[17]|ComVar.RxBuff[18]|ComVar.RxBuff[19])!=0)
// {
// goto INVALID_DATA;
// }
// SETBIT(PulseBits,ClearEng);
// // BCDToHEX8(ComVar.RxBuff+16,4);
// CopyRam(ComVar.RxBuff+16,PowerVar.ActInPow,4); // 电能读入缓冲,刷现当前电量
//CopyRamToEEP(ADDRESS_C119E,PowerVar.ActInPow,4); // 存入电能底度
// PowerVar.ActInPow[4] = 0x00;
// PowerVar.PowerZero = 0x00; // 读出电能小数位
// EEPClear(ADDRESS_ZEROE,60); // 电能记录区域清零
// PowerVar.PowerEEPIndex = 0;
// SavePower(); // 脉冲数清零
// SETBIT(ACSR,ACIE); // 允许掉电检测 允许掉电中断
// PowerVar.PowerChange = 0xAA; // 置位电量改变标志
// break;
case 0xC212:
CopyRamToEEP(ADDRESS_C212E,ComVar.RxBuff+16,4);
break;
case 0xD410:
SETBIT(PulseBits,ClearEng);
// BCDToHEX8(ComVar.RxBuff+16,4);
// CopyRam(ComVar.RxBuff+16,PowerVar.ActInPow,4); // 电能读入缓冲,刷现当前电量
//CopyRamToEEP(ADDRESS_C119E,PowerVar.ActInPow,4); // 存入电能底度
for(i=0;i<5;i++) PowerVar.ActInPow[i]=0x00;
PowerVar.PowerZero = 0x00; // 读出电能小数位
EEPClear(ADDRESS_ZEROE,60); // 电能记录区域清零
PowerVar.PowerEEPIndex = 0;
SavePower(); // 脉冲数清零
SETBIT(ACSR,ACIE); // 允许掉电检测 允许掉电中断
PowerVar.PowerChange = 0xAA; // 置位电量改变标志
break;
case 0xC098:
if(ComVar.AdjustEn!=0xAA)
{
goto INVALID_DATA;
}
// ComVar.RxBuff[22]=DataAddCS(ComVar.RxBuff+16,6);
mIICWritePage(ComVar.RxBuff+16,6,0xA0,0x00);
// CopyRamToEEP(ADDRESS_C098E,ComVar.RxBuff+16,6);
// ReadAdjustConst();
CopyRam(ComVar.RxBuff+16,consttmp,6);
// temp =consttmp[0]*256+consttmp[1];
//temp =(65535.0-temp)/45.0+0.5;
AdjustVar.AdjustConst_A =(0xFFFF-(consttmp[0]*256+consttmp[1]))/45;
if((AdjustVar.AdjustConst_A)<100)AdjustVar.AdjustConst_A=100;
//-------------------------------------------
// CopyEEPToRam(ADDRESS_B,consttmp,2); // 读入B相分频数
//temp =consttmp[2]*256+consttmp[3];
//temp =(65535.0-temp)/45.0+0.5;
AdjustVar.AdjustConst_B =(0xFFFF-(consttmp[2]*256+consttmp[3]))/45;
if((AdjustVar.AdjustConst_B)<100)AdjustVar.AdjustConst_B=100;
//--------------------------------------------
// CopyEEPToRam(ADDRESS_C,consttmp,2); // 读入C相分频数
// temp =consttmp[4]*256+consttmp[5];
// temp =(65535.0-temp)/45.0+0.5;
AdjustVar.AdjustConst_C =(0xFFFF-(consttmp[4]*256+consttmp[5]))/45;
if((AdjustVar.AdjustConst_C)<100)AdjustVar.AdjustConst_C=100;
AdjustVar.CurrtConst_A = AdjustVar.AdjustConst_A;
AdjustVar.CurrtConst_B = AdjustVar.AdjustConst_B;
AdjustVar.CurrtConst_C = AdjustVar.AdjustConst_C;
AdjustVar.CurrtSumConst = 0;
break;
//-----------------------------------------------------
default:
INVALID_DATA:
erro = 0x34;
goto SEND_645_ERRO; // 非法数据
} // 发送缓冲前10字节已经准备好
ComVar.TxAllBuff[8] = 0x84; // 置控制码:正常应答,无后续帧
ComVar.TxAllBuff[10] = DataAddCS(ComVar.TxAllBuff,10);
ComVar.TxAllBuff[11] = 0x16;
ComVar.TxConst = 12;
}
else // 密码错误处理
{
goto PASSWORD_ERRO; // 密码错误处理
}
break;
//*****************************************************************
case 0x0F: // 判断密码编程模式
if(PasswordCheck(10)||ComVar.ProgEn==0xAA)
{
EEPVar.WriteProtectAA = 0xAA; // 打开EEPROM写保护
ComVar.TxAllBuff[8] = 0x8F; // 置控制码:正常应答,无后续帧
ComVar.TxAllBuff[9] = 0x04; // 置数据长度 0
CopyRamToEEP(ADDRESS_C212E,ComVar.RxBuff+14,4);
CopyRam(ComVar.RxBuff+14,ComVar.TxAllBuff+10,4);
DataAdd33(ComVar.TxAllBuff+10,4);
ComVar.TxAllBuff[14] = DataAddCS(ComVar.TxAllBuff,16);;
ComVar.TxAllBuff[15] = 0x16;
ComVar.TxConst = 16;
}
else
{
goto PASSWORD_ERRO; // 密码错误处理
}
break;
//*****************************************************************
default:
erro = 0x34; // 非法数据
goto SEND_645_ERRO;
//*****************************************************************
}
//-------------------------------------------------------------------------
return(1);
//-------------------------------------------------------------------------
PASSWORD_ERRO:
erro = 0x37;
SEND_645_ERRO:
ComVar.TxAllBuff[_COM_CTR_CODE] = 0xC0|ComVar.RxBuff[8]; // 生成错误控制字
ComVar.TxAllBuff[ 9] = 0x01; // 数据长度
ComVar.TxAllBuff[10] = erro;
ComVar.TxAllBuff[11] = DataAddCS(ComVar.TxAllBuff,11);;
ComVar.TxAllBuff[12] = 0x16;
ComVar.TxConst = 13;
return(1);
//-------------------------------------------------------------------------
}
//*****************************************************************************
// 函数 : INT8U DataAddCS(INT8U *datap,INT8U count) *
// *
// 功能 : 发送数据计算CS子函数 *
//*****************************************************************************
INT16U DataAddCS_ZhengZhou(INT8U *datap,INT8U count)
{
union
{
INT16U cs;
INT8U cs_buff[2];
}cs_union;
INT8U buff[4];
cs_union.cs = 0;
for(;count>0;count--)
{
cs_union.cs += *datap;
datap++;
}
HEXToBCD32(cs_union.cs,buff);
cs_union.cs_buff[0] = buff[2];
cs_union.cs_buff[1] = buff[3];
return(cs_union.cs);
}
//*****************************************************************************
// 函数 : INT8U CheckProgKeyHigh(void) *
// *
// 功能 : 编程开关检测 *
// *
//*****************************************************************************
void CheckProgKeyHigh(void)
{
if(CHKBIT(PINB,IO_PROG)==0)
{
ShortDelay();
if(CheckPin(PINB,1,IO_PROG)==0)
{
if(CHKBIT(EventBits,ProgKey))
{
if((TimeVar.AdjustTimer>=2)&(ComVar.AdjustEn!=0xAA))
{
ComVar.AdjustEn=0xAA;
SETBIT(TimeBits,AdjustFlash);
SETBIT(TimeBits,EnDisplay);
}
}
else {SETBIT(EventBits,ProgKey);TimeVar.AdjustTimer=0;}
}
}
else
{
ComVar.AdjustEn=0x55;
if(CHKBIT(EventBits,ProgKey))
{
CLRBIT(EventBits,ProgKey);
if(ComVar.ProgEn != 0xAA) ComVar.ProgEn = 0xAA;
else ComVar.ProgEn = 0x55;
TimeVar.ProgTimer = 0;
}
}
if(ComVar.ProgEn == 0xAA) // 编程键延时控制
{
//_FLASH_STATUS_LED(); // 闪烁状态LED
if(++TimeVar.ProgTimer >= _PROG_TIMER_CNT )
{
ComVar.ProgEn = 0x55; // 关闭编程开关
//_STATUS_LED_OFF(); // 关闭状态LED显示
}
}
}
//*****************************************************************************
// 函数 : INT8U PasswordCheck(void) *
// *
// 功能 : 密码校验处理 *
// 返回 : 0: 密码错误 1: 密码正确 *
//*****************************************************************************
INT8U PasswordCheck(INT8U start)
{
INT8U i;
CopyEEPToRam(ADDRESS_C212E,EEPVar.I2cBuff+start,4); // 读入4字节密码
for(i=start;i<(start+3);i++)
{
if((EEPVar.I2cBuff[i]!=ComVar.RxBuff[i])&(ComVar.RxBuff[i]!=PassWord[i-12]))
{
return(0);
}
}
return(1);
}
//*****************************************************************************
// 函数 : void DataAdd33(INT8U *datap,INT8U count) *
// *
// 功能 : 数据+33处理子函数 *
// 输入 : *datap: 数据起始指针 count: 操作个数 *
//*****************************************************************************
void DataAdd33(INT8U *datap,INT8U count)
{
for(;count>0;count--)
{
*datap = *datap+0x33;
datap++;
}
}
//*****************************************************************************
// 函数 : void DataDec33(INT8U *datap,INT8U count) *
// *
// 功能 : 发送数据-33处理子函数 *
// 输入 : *datap: 数据起始指针 count: 操作个数 *
//*****************************************************************************
void DataDec33(INT8U *datap,INT8U count)
{
for(;count>0;count--)
{
*datap = *datap-0x33;
datap++;
}
}
//*****************************************************************************
// 函数 : INT8U DataAddCS(INT8U *datap,INT8U count) *
// *
// 功能 : 发送数据计算CS子函数 *
// 输入 : *datap: 数据起始指针 count: 操作个数 *
//*****************************************************************************
INT8U DataAddCS(INT8U *datap,INT8U count)
{
INT8U cs;
cs = 0;
for(;count>0;count--)
{
cs += *datap;
datap++;
}
return(cs);
}
//*****************************************************************************
// 函数 : void Com1Reset(void) *
// *
// 功能 : 串口1复位程序 *
//*****************************************************************************
void Com1Reset(void)
{
CLRBIT(UCSR0B,RXCIE0); // 禁止串口接收中断
Com1Bits = 0; // 清除串口工作标志
Com1Var.RxPoint = 0; // 串口接收指针清零
Com1Var.CommEnd = 0;
Com1Var.OverTimer = 0;
UBRR0 = _UBRR; // 初始化串口波特率1200bps
UCSR0C = 0x26; // 0B10100110; // 异步 偶校验 1停止位 8 数据位
CLRBIT(UCSR0B,UCSZ02); // 8个数据位
SETBIT(UCSR0B,RXEN0); // 允许串口接收
SETBIT(UCSR0B,RXCIE0); // 允许串口接收中断
SETBIT(PORTD,IO_TXD1); // 置高TXD
SETBIT(UCSR0B,TXEN0); // 允许串口发送
CLRBIT(Com1Bits,En500ms); // 禁止 500 ms 定时标志
}
//*****************************************************************************
// 函数 : void Com2Reset(void) *
// *
// 功能 : 串口2复位程序 *
// 注释 : 一部分在串口发送时初始化 *
//*****************************************************************************
void Com2Reset(void)
{
CLRBIT(TIMSK1,ICIE1); // 禁止输入捕捉中断
Com2Bits = 0; // 清除串口工作标志
Com2Var.RxPoint = 0; // 串口接收指针清零
Com2Var.CommEnd = 0;
Com2Var.OverTimer = 0;
_CLR_IO_TXD2(); // 置高TXD2口
SETBIT(TCCR1B,ICNC1); // 输入捕捉噪声抑制允许
CLRBIT(TCCR1B,ICES1); // 下降沿捕捉
SETBIT(TIFR1,ICF1); // 清标志
SETBIT(TIMSK1,ICIE1); // 允许输入捕捉中断
}
//*************************** END OF SUB **************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -