📄 main.c
字号:
DIDR1 = 0x02; // 禁止AIN1数字缓冲
DIDR0 = 0;
ADMUX = 0;
ADCSRB = 0;
ADCSRA = 0;
SPMCSR = 0;
SPSR = 0;
SPCR = 0;
GPIOR0 = 0;
GPIOR1 = 0;
GPIOR2 = 0;
GTCCR = 0;
//---------------------------------------------------------------------
DDRB = _DDRB_INIT; // 初始化PORTB
DDRC = _DDRC_INIT; // 初始化PORTC
DDRD = _DDRD_INIT; // 初始化PORTD
//---------------------------------------------------------------------
_LCDPOWER_ON(); // 打开LCD电源
//---------------------------------------------------------------------
EICRA = (1<<ISC10)|(1<<ISC11)|(1<<ISC01)|(1<<ISC00); // INT1为上升沿中断,INT0为上升沿
SETBIT(EIMSK,INT0); // 允许INT1中断
SETBIT(EIMSK,INT1); // 允许INT0中断
//*********************************************************************
TCCR0A = _TCCR0A_INIT; // TIMER0
TCCR0B = _TCCR0B_INIT;
TIMSK0 = _TIMSK0_INIT; // 允许TIMER0溢出中断
//---------------------------------------------------------------------
TCCR1A = 0x00; // 设置 Timer1,为系统时钟必须保证可靠工作
SETBIT(TIMSK1,TOIE1); // 只允许定时器1溢出中断
CLRBIT(TIMSK1,OCIE1A); // 禁止比较输出A中断
CLRBIT(TIMSK1,OCIE1B); // 禁止比较输出B中断
CLRBIT(TCCR1B,CS10); // 启动 Timer1 8分频 0
SETBIT(TCCR1B,CS11); // 启动 Timer1 8分频 1
CLRBIT(TCCR1B,CS12); // 启动 Timer1 8分频 0
TCCR1C = 0;
//---------------------------------------------------------------------
ASSR = 0;
TCNT2 = 0x00;
OCR2A = _OCR2A_LOAD; // 比较输出模式,OC2输出频率 37.8kHZ
TCCR2B = 0x01;
TIMSK2 = 0; // 禁止TIMER2中断
//---------------------------------------------------------------------
// 串口安全处理,使用定时器对其进行定时初始化,通讯成功时清除初始化定时器
if(Com1Var.ComInitTimer > 100 ) // 检测串口1初始化
{
Com1Var.ComInitTimer = 0;
Com1Reset();
}
if(Com2Var.ComInitTimer > 100 ) // 检测串口2初始化
{
Com2Var.ComInitTimer = 0;
Com2Reset();
}
//---------------------------------------------------------------------
CLRBIT(ADCSRB,ACME); // 由AN1输入负端 // 比较器初始化
CLRBIT(ACSR,ACD); // 使能比较器
if((ACSR&0x43)!=0x43) // 下面标志不能随便操作,中断控制有电能累加程序处理
{
ACSR = (1<<ACIE)|(1<<ACBG)|(1<<ACIS1)|(1<<ACIS0)|(1<<ACI);
}
SREG|= 0x80; // 全局中断允许
//---------------------------------------------------------------------
}
}
//*****************************************************************************
// 函 数 : void TimeEvent(void) *
// *
// 功 能 : 时间相关处理函数 *
// 注 释 : *
//*****************************************************************************
void TimeEvent(void)
{
if(CHKBIT(TimeBits,OneSecond))
{
if(ComVar.AdjustEn==0xAA) REVBIT(TimeBits,AdjustFlash);
CLRBIT(TimeBits,OneSecond); // 清秒标志
SETBIT(TimeBits,EnDisplay); // 允许显示刷新
Com1Var.ComInitTimer ++; // 串口1复位定时加
Com2Var.ComInitTimer ++; // 串口2复位定时加
if(++TimeVar.AdjustTimer>=4)TimeVar.AdjustTimer=4;
CheckProgKeyHigh(); // Check internal prog-key
CheckDisplayKey(); // Check display key
if(++TimeVar.Power10sTimer>=40)
{
TimeVar.Power10sTimer = 0;
if(PowerVar.Pulse10SecCnt < _MEASURE_FALUT_LIMIT) // 飞走检测
{
CLRBIT(PulseBits,DisMeasure);
}
PowerVar.Pulse10SecCnt = 0;
//-----------------------------------------------------------------
CheckREVP(); // 检测反向指示,反向定时处理,防止潜动反向
}
if(++TimeVar.PowerOnDelayTimer >= 120) // 上电延迟事件
{
TimeVar.PowerOnDelayTimer = 0;
PowerOnReadParameter(); // 刷新设置参数
}
//---------------------------------------------------------------------
if(++DispVar.DispTimer>(Disp_Time*2)) // 轮显时间控制
{
DispVar.DispTimer = 0;
// if(DispVar.DispCode==0x03) DispVar.DispCode=0x00;
if((DispVar.DispCode ==0x00)&&((PowerVar.DisplayCouter&0x02)==0x02))DispVar.DispCode =0x01;
else if((DispVar.DispCode ==0x01)&&((PowerVar.DisplayCouter&0x04)==0x04))DispVar.DispCode =0x02;
else DispVar.DispCode=0x00;
}
//---------------------------------------------------------------------
if(CHKBIT(ComBits,EnStatus)) // 通讯指示
{
if(++DispVar.StatusTimer > 10)
{
DispVar.StatusTimer = 0;
CLRBIT(ComBits,EnStatus);
CLRBIT(ComBits,CommFlag);
}
else
{
SETBIT(ComBits,CommFlag);
}
}
//---------------------------------------------------------------------
}
//-------------------------------------------------------------------------
}
//*****************************************************************************
// 函 数 : void PowerOnReadParameter(void) *
// *
// 功 能 : 上电读入设置参数函数 *
// 注 释 : *
//*****************************************************************************
void PowerOnReadParameter(void)
{
//CopyEEPToRam(ADDRESS_E814E,&DispVar.DispMode,1); // 读入显示方式
//-------------------------------------------------------------------------
// ReadPulseConst(); // 读入电表常数
ReadDispConst(); // 读入显示项目
ReadAdjustConst(); // 读入校准参数
//-------------------------------------------------------------------------
//CopyEEPToRam(ADDRESS_TIMECOEF,&TimeVar.TimeCoef,1); // 读入时钟校正值
}
//*****************************************************************************
// 函数 : INT8U CheckDisplayKey(void) *
// *
// 功能 : 显示开关检测 *
// *
//*****************************************************************************
void CheckDisplayKey(void)
{
if(CHKBIT(PINC,IO_DISPLAY)==0)
{
ShortDelay();
if(CheckPin(PINC,0,IO_DISPLAY))
{
DispVar.DispTimer = 0; // 循显计数时间清零
SETBIT(TimeBits,PushDispKey); // 置位键显标志
}
}
}
/*************************** END OF SUB **************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -