📄 interrupt.c
字号:
Delay60s_num =0;
LCDCTL &= ~0x01; //关闭液晶
}
//=========================长按键功能===============================
if( (P1IN & 0x08)==0x08 )
{
display_timers++; //显示层切换计数器
clr_timers++; //清测试项数据
}
else //---没有这个else切换就会有bug,按键几十次后,再按键一下就有可能切换显示层
{
display_timers = 0;
clr_timers = 0;
}
if( (clr_timers>=3) && ((test_index_Disp==0x04)||(test_index_Disp==0x05)||(test_index_Disp==0x06)) )//清"测试热量"或"测试流量"
{
clr_timers =0;
Flux_test[0] =0; //清测试数据项
Flux_test[1] =0;
Flux_test[2] =0;
Flux_test[3] =0;
Heat_test[0] =0;
Heat_test[1] =0;
Heat_test[2] =0;
Heat_test[3] =0;
Cool_test[0] =0;
Cool_test[1] =0;
Cool_test[2] =0;
Cool_test[3] =0;
if(test_index_Disp==0x04)//-------及时刷新测试热量屏幕
Up_Datebuffer(Heat_test,4); //当前测试热量(单位:1WH)
else //-------及时刷新测试流量屏幕
Up_Datebuffer(Flux_test,4); //当前测试流量(单位:0.001L)
Up_test_Promptbuffer(test_index_Disp);//提示符更新
Lcd_buffer_update(Data_buffer); //更新LCD
}
if( (clr_timers>=3) && (test_index_Disp==0x03) )//开始或停止测试
{
clr_timers =0;
Display_symbol ^=test_off;//停止或开始测试(异或)
if((Display_symbol & test_off)==test_off)
{
Up_test_off(); //往Data_buffer寄存器内直接写段码值"TESTOFF"
Lcd_buffer_update(Data_buffer); //更新LCD
if((SVSCTL&0x01)==0x01) //MCU内置电源管理模块检测工作电压2.8V,则亮低压提示符
LCDM10 |= 0x04; //点亮低压提示符
}
else
{
Up_test_on(); //往Data_buffer寄存器内直接写段码值"TESTON"
Lcd_buffer_update(Data_buffer); //更新LCD
if((SVSCTL&0x01)==0x01) //MCU内置电源管理模块检测工作电压2.8V,则亮低压提示符
LCDM10 |= 0x04; //点亮低压提示符
}
}
if( (clr_timers>=3) && (hisHeatdata_index_Disp==0x03) )//开启或关闭测试层
{
clr_timers =0;
if( (Display_symbol & testlayer_off) ==testlayer_off)
Display_symbol &= ~testlayer_off;
else
Display_symbol |= testlayer_off;
}
if(display_timers>=5)//------------------主显示层与测试显示层切换
{
display_timers =0;
if((Display_symbol & firlayer_flag)==firlayer_flag) //若当前是第1层,则切换到第2层
{
Display_symbol &= ~firlayer_flag;
if( (Display_symbol & testlayer_off) != testlayer_off)//若没关闭,则进入测试层
Display_symbol |= seclayer_flag;
else
Display_symbol |= thilayer_flag; //测试层已关闭,则进入第3层,第2层被回避
}
else if((Display_symbol & seclayer_flag)==seclayer_flag)//若当前是第2层,则切换到第3层
{
Display_symbol &= ~seclayer_flag;
Display_symbol |= thilayer_flag;
}
else if((Display_symbol & thilayer_flag)==thilayer_flag)//若当前是第3层,切换到第4层
{
Display_symbol &= ~thilayer_flag;
Display_symbol |= foulayer_flag;
}
else if((Display_symbol & foulayer_flag)==foulayer_flag)//若当前是第4层,切换到第5层 //当前是第4层,切换到第1层
{
Display_symbol &= ~foulayer_flag;
Display_symbol |= fivlayer_flag;
}
else//若当前是第5层,切换到第1层
{
Display_symbol &= ~fivlayer_flag;
Display_symbol |= firlayer_flag;
}
Disp_Mod();
}
//====================30S自动回首屏功能===========================
if( ((Display_symbol & firlayer_flag) ==firlayer_flag)||((Display_symbol & thilayer_flag) ==thilayer_flag)||
((Display_symbol & foulayer_flag) ==foulayer_flag)||((Display_symbol & fivlayer_flag) ==fivlayer_flag) )//在第1层,第3层,第4层无条件50S后回首屏
Time30s_num +=2;
else if( ((Display_symbol & seclayer_flag) ==seclayer_flag)&&((Display_symbol & test_off)==test_off) )
Time30s_num +=2; //在第2层,必须"TEST OFF"时,不动作50S后回首屏
if(Time30s_num>=60)
{
Time30s_num =0;
if((Display_symbol & firlayer_flag) !=firlayer_flag)//不在主层,肯定不在首屏
{
Display_symbol &= 0xF0; //保持高4位,使其不受影响
Display_symbol |= firlayer_flag; //使其在主层
if(In_Temp[1] ==0x0E)//-------------------入口E01
{
turn_index_Disp = 2;
Disp_Mod();
}
else if(Out_Temp[1] ==0x0E)//------------出口E02
{
turn_index_Disp = 3;
Disp_Mod();
}
else if(Sub_Temp[1] ==0x0E)//------------温差E03
{
turn_index_Disp = 4;
Disp_Mod();
}
else//----------------------------------正常则显示热量值项
{
turn_index_Disp = 0;
Disp_Mod();
}
}
else //在主层
{
if(In_Temp[1] ==0x0E)//-------------------入口E01
{
turn_index_Disp = 2;
Disp_Mod();
}
else if(Out_Temp[1] ==0x0E)//------------出口E02
{
turn_index_Disp = 3;
Disp_Mod();
}
else if(Sub_Temp[1] ==0x0E)//------------温差E03
{
turn_index_Disp = 4;
Disp_Mod();
}
else//----------------------------------正常则显示热量值项
{
turn_index_Disp = 0;
Disp_Mod();
}
}
}
//================温度采样次数(校准采样30次,并保持6分钟;若不是校准采样,为30次)============
if((Key_symbol&adjust_flag)==adjust_flag)//若为校准采样
{
BasicSamps = 50; //基准采样次数设为50次(基准次数不能乱改,只能与普通时采样次数一样,否则校不准
Smaple_timers++; //校准取100次求平均与普通采样采50次去头去尾所得的SD值不一致
if(Smaple_timers >=180)
{
Smaple_timers = 0; //校准采样时间清0
Key_symbol &= ~adjust_flag; //结束校准采样标志
}
}
else //若不是校准采样,则基准采样次数设为10次
BasicSamps = 50;
//================30S温度处理===============================================================
Minters++;
if(Minters>=15) //30S查1次温度,并计算焓值差及1个脉冲的质量
{
Minters = 0;
Interrupt_main_symbol |=Samp_Temp30S_flag; //置起标志位,到主程序死循环中去处理,减小中断时间
__bic_SR_register_on_exit(CPUOFF+SCG0+SCG1);//使其从主程序头开始执行
}
}
/***************************************************************
SD模数转换中断
***************************************************************/
#pragma vector=SD16_VECTOR
__interrupt void SD_Conver(void)
{
SD16CCTL0 &= ~0x0004; //清中断标志
SD16CCTL1 &= ~0x0004; //清中断标志
SD16CCTL2 &= ~0x0004; //清中断标志
if(BasicSamps>=100)//校准时采样到SD值求平均处理
{
Sum_samp0 += SD16MEM0; //从转换存储寄存器0中读出转换结果
Sum_samp1 += SD16MEM1; //从转换存储寄存器1中读出转换结果
Sum_samp2 += SD16MEM2; //从转换存储寄存器2中读出转换结果
}
else//不是校准时采样,对SD值做去头去尾处理
{
BasicSD_value[Samp_times] = SD16MEM0;
InSD_value[Samp_times] = SD16MEM1;
OutSD_value[Samp_times] = SD16MEM2;
}
Samp_times++;
if( Samp_times >= BasicSamps )
{
Samp_times = 0; //采样次数清0
SD16CCTL0 &= ~0x0002; //SC三位
SD16CCTL1 &= ~0x0002; //SC三位
SD16CCTL2 &= ~0x0002; //SC三位
SD16CTL &= ~0x0008; //关闭bit.3:即Vmin (bit.3影响功耗)
// if( (Key_symbol & AdjustTemp_flag)==AdjustTemp_flag)//已经校过温度,采完后关闭恒流源
P2OUT &= ~0x08; //关闭温度测试电路电源
/*
if(BasicSamps>=100)//校准采样
{
Value_Mem0 = Sum_samp0/BasicSamps; //BasicSamps次求平均
Value_Mem1 = Sum_samp1/BasicSamps; //BasicSamps次求平均
Value_Mem2 = Sum_samp2/BasicSamps; //BasicSamps次求平均
}
else
{
Queue_SDvalue();//对3个SD数组中的SD值进行排序,并取中间30个值累加
Value_Mem0 = Sum_samp0/(BasicSamps-20); //BasicSamps次求平均
Value_Mem1 = Sum_samp1/(BasicSamps-20); //BasicSamps次求平均
Value_Mem2 = Sum_samp2/(BasicSamps-20); //BasicSamps次求平均
}
Sum_samp0 = 0; //清0
Sum_samp1 = 0; //清0
Sum_samp2 = 0; //清0
*/
if((SVSCTL&0x01)==0x01) //MCU内置电源管理模块检测工作电压2.8V,则亮低压提示符
LCDM10 |= 0x04; //点亮低压提示符
SVSCTL &= 0x0F;//关闭掉电监测模块
}
}
/*********************************************************************************
discrible: 485接收\发送处理
attention: 用UART硬件来完成
date: 05-06-01
**********************************************************************************/
/**********************************************************
485串口接收处理(包括协议解析,若解析正确,置收完标志)
***********************************************************/
#pragma vector=USART0RX_VECTOR
__interrupt void Sci_reccive(void)
{
unsigned char temp1;
IFG1 &= ~URXIFG0; //清接收标志位
if( (Comm_symbol & fReceiveComplete) == fReceiveComplete )
{
temp1 = U0RXBUF; //SCDR寄存器收到的字节
}
else
{
Comm_symbol |= fReceive; //为保证每次通讯receive_length都是0
Count_SCI_receive =0; //(和函数Process_20ms()第一部分结合)
SCI_buf[receive_length]=U0RXBUF; //SCDR寄存器收到的字节
receive_length++;
if(receive_length == 1) //0x10
{
if( (SCI_buf[0]!=0x10) && (SCI_buf[0]!=0x68) )
receive_length =0;
}
else if(receive_length == 5)//0x16
{
if( (SCI_buf[4] != 0x16) && (SCI_buf[4] != 0x73))
receive_length =0;
else//握手成功
{
// IE2 |= BTIE; // Enable BT interrupt(开启7.8125mS中断)
// Disp_symbol |=fcommOpen_BTIE; //置通讯接收好后开启7.8125mS中断标志
if(SCI_buf[1] == 0x40)//握手帧,发回0xE5
{
sci_send();//关收,开发
U0TXBUF =0xE5;//返回E5H
receive_length =0;//接收长度归0
Delay(1);//延时4ms(否则最后一个字节被自己收进)
sci_receive();//关发,开发 ================只是写命令时用到的处理,读命令这里不进来
}
else if(SCI_buf[1] == 0x7B)//读命令,发回读内容
{
receive_length =0;//接收长度归0
sci_send();//关收,开发
Read_data();//返回读数据内容
}
}
}
else if(receive_length==22)//写命令收完(个数暂定6个)
{
receive_length =0;//接收长度归0
Comm_symbol &= ~fReceive;//关闭接收标志
Write_data();
}
}
}
/*************************************************
发送处理(红外及485)
*************************************************/
#pragma vector=USART0TX_VECTOR
__interrupt void Sci_send(void)
{
IFG1 &= ~UTXIFG0; //清发送标志位
if (sending_length) //发送数据长度控制(12+数据域长度+前导符)
{
sending_length--;
sending_ptr++;
U0TXBUF = *sending_ptr;
}
else
{
Comm_symbol |= fSendComplete; //发完标志
Delay(1);//延时4ms(否则最后一个字节被自己收进)
sci_receive();//关发,开发 ================只是写命令时用到的处理,读命令这里不进来
Comm_symbol &= ~fReceive;//关闭接收标志
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -