为什么用注释掉的逻辑写,4T测评led会有问题,这两种写法结果不是相同的吗
main.c 完整代码
#include <STC15F2K60S2.H>
#include "ds1302.h"
#include "iic.h"
#include "init.h"
#include "key.h"
#include "led.h"
#include "onewire.h"
#include "seg.h"
idata unsigned long int uwtick;
idata unsigned char seg_pos;
pdata unsigned char seg_buf[8]={10,10,10,10,10,10,10,10};
idata unsigned char key_val,key_up,key_down,key_old;
pdata unsigned char ucLed[8]={0,0,0,0,0,0,0,0};
idata unsigned int frequency;
idata unsigned int timer_1s;
idata unsigned char seg_mode_disp;//0-时间界面 1-回显界面 2-参数界面
idata unsigned char echo_mode;//0-温度回显 1-湿度回显 2-时间回显
idata unsigned char temperature_para=30;//温度参数0-99
idata bit long_press_flag;
idata unsigned int timer_2s;
idata unsigned char trigger_count;
pdata unsigned char ucRtc[3]={23,59,55};
idata unsigned char rtc_index;//0-hour 1-minute 2-second
pdata unsigned char ctrlRtc[3]={0,0,0};
idata unsigned char temperature_max;
idata unsigned int temperature_average_10x;
idata float temperature;
idata unsigned char temperature_old;//上一次采集的温度
idata bit riseT_flag;//温度升高标志位
idata unsigned long int temperature_sum;
idata unsigned char humidity_max;
idata unsigned int humidity_average_10x;
idata unsigned char humidity;//测量的湿度
idata unsigned char humidity_old;//上一次采集的湿度
idata bit hu_valid_flag;//湿度有效标志位
idata bit riseH_flag;//湿度升高标志位
idata unsigned long int humidity_sum;
idata unsigned char brightness;
idata bit bright_flag;//亮的标志位
idata bit display_flag;//显示温湿度界面标志位
idata unsigned int timer_3s;//温湿度界面显示时间
idata bit pick_flag;//采集标志位
idata unsigned char timer_100ms;
idata bit blink_flag;
idata bit data_up;
void key_proc()
{
key_val=key_read();
key_down=key_val&(key_val^key_old);
key_up=~key_val&(key_val^key_old);
key_old=key_val;
switch(key_down)
{
case 4:
// if(seg_mode_disp==0)
// echo_mode=0;
// if(++seg_mode_disp==3)
// seg_mode_disp=0;
if(++seg_mode_disp==3)
seg_mode_disp=0;
if(seg_mode_disp==1)
echo_mode=0;
break;
case 5:
if(seg_mode_disp==1)
{
if(++echo_mode==3)
echo_mode=0;
}
break;
case 8:
if(seg_mode_disp==2)
{
temperature_para=(temperature_para==99)?99:temperature_para+1;
}
break;
}
if(seg_mode_disp==1&&echo_mode==2)
{
if(key_down==9)
{
long_press_flag=1;
timer_2s=0;
}
}
if(key_up==9)
{
if(timer_2s>=2000)
{
trigger_count=0;
temperature_max=0;
temperature_average_10x=0;
temperature_old=0;
humidity_max=0;
humidity_average_10x=0;
humidity_old=0;
ctrlRtc[0]=0;
ctrlRtc[1]=0;
temperature_para=30;
humidity_sum = 0;
temperature_sum = 0;
}
else if(seg_mode_disp==2)
temperature_para=(temperature_para==0)?0:temperature_para-1;
long_press_flag=0;
}
}
void seg_proc()
{
switch(seg_mode_disp)
{
case 0:
seg_buf[0]=ucRtc[0]/10;
seg_buf[1]=ucRtc[0]%10;
seg_buf[2]=11;
seg_buf[3]=ucRtc[1]/10;
seg_buf[4]=ucRtc[1]%10;
seg_buf[5]=11;
seg_buf[6]=ucRtc[2]/10;
seg_buf[7]=ucRtc[2]%10;
break;
case 1:
switch(echo_mode)
{
case 0:
seg_buf[0]=12;
seg_buf[1]=10;
seg_buf[2]=10;
seg_buf[3]=10;
seg_buf[4]=10;
seg_buf[5]=10;
seg_buf[6]=10;
seg_buf[7]=10;
if(trigger_count)
{
seg_buf[2]=temperature_max/10;
seg_buf[3]=temperature_max%10;
seg_buf[4]=11;
seg_buf[5]=temperature_average_10x/100;
seg_buf[6]=temperature_average_10x/10%10+',';
seg_buf[7]=temperature_average_10x%10;
}
break;
case 1:
seg_buf[0]=13;
seg_buf[1]=10;
seg_buf[2]=10;
seg_buf[3]=10;
seg_buf[4]=10;
seg_buf[5]=10;
seg_buf[6]=10;
seg_buf[7]=10;
if(trigger_count)
{
seg_buf[2]=humidity_max/10;
seg_buf[3]=humidity_max%10;
seg_buf[4]=11;
seg_buf[5]=humidity_average_10x/100;
seg_buf[6]=humidity_average_10x/10%10+',';
seg_buf[7]=humidity_average_10x%10;
}
break;
case 2:
seg_buf[0]=14;
seg_buf[1]=trigger_count/10;
seg_buf[2]=trigger_count%10;
seg_buf[3]=10;
seg_buf[4]=10;
seg_buf[5]=10;
seg_buf[6]=10;
seg_buf[7]=10;
if(trigger_count)
{
seg_buf[3]=ctrlRtc[0]/10;
seg_buf[4]=ctrlRtc[0]%10;
seg_buf[5]=11;
seg_buf[6]=ctrlRtc[1]/10;
seg_buf[7]=ctrlRtc[1]%10;
}
break;
}
break;
case 2:
seg_buf[0]=16;
seg_buf[1]=10;
seg_buf[2]=10;
seg_buf[3]=10;
seg_buf[4]=10;
seg_buf[5]=10;
seg_buf[6]=temperature_para/10;
seg_buf[7]=temperature_para%10;
break;
}
if(display_flag==1)
{
seg_buf[0]=15;
seg_buf[1]=10;
seg_buf[2]=10;
seg_buf[3]=(unsigned char)temperature/10;
seg_buf[4]=(unsigned char)temperature%10;
seg_buf[5]=11;
seg_buf[6]=hu_valid_flag?humidity/10:17;
seg_buf[7]=hu_valid_flag?humidity%10:17;
}
}
void led_proc()
{
ucLed[0]=(seg_mode_disp==0);
ucLed[1]=(seg_mode_disp==1);
ucLed[2]=display_flag;//看错指示灯要求了,认真读题
if(temperature>temperature_para)
ucLed[3]=blink_flag;
else
ucLed[3]=0;
ucLed[4]=(hu_valid_flag==0);
ucLed[5]=data_up;
led_disp(ucLed);
}
void get_time()
{
Read_Rtc(ucRtc);
}
void AD_DA()
{
brightness=AD_Read(0x41);
if(brightness>100)
bright_flag=1;
else if(bright_flag==1&&brightness<50)
{
display_flag=1;
pick_flag=1;
bright_flag=0;
}
}
void get_frequency()
{
if(pick_flag)//允许采集温度和湿度
{
temperature=Temperature_Read();
if(frequency>=200&&frequency<=2000)//有效数据
{
hu_valid_flag=1;
trigger_count++;
humidity=10+(frequency-200)* (80.0 / 1800.0);
if(trigger_count>=2)
{
// 核心逻辑:先比较,再更新
// 比较当前值和旧值,设置上升标志位
if(temperature > temperature_old)
riseT_flag = 1;
else
riseT_flag = 0;
if(humidity>humidity_old)
riseH_flag=1;
else
riseH_flag=0;
temperature_old=temperature;
humidity_old=humidity;
}
else if(trigger_count==1)
{
// 仅记录当前值作为“旧值”,不进行比较
temperature_old = temperature;
humidity_old = humidity;
riseT_flag = 0; // 第一次不判断上升
riseH_flag = 0;
}
if(temperature_max<temperature)
temperature_max=temperature;
temperature_sum+=temperature;
temperature_average_10x=(temperature_sum*10/trigger_count);
if(humidity_max<humidity)
humidity_max=humidity;
humidity_sum+=humidity;
humidity_average_10x=(humidity_sum*10/trigger_count);
ctrlRtc[0]=ucRtc[0];
ctrlRtc[1]=ucRtc[1];
}
//无效数据要怎么样处理
else
{
hu_valid_flag=0;
riseH_flag = 0;
}
pick_flag=0;
if((trigger_count>=2)&&(riseT_flag)&&(riseH_flag))
data_up = 1; // 设置标志位
else
data_up = 0;
}
}
void Timer0Init(void) //1毫秒@12.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x05; //设置定时器模式
TL0 = 0x00; //设置定时初值
TH0 = 0x00; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
void Timer1Init(void) //1毫秒@12.000MHz
{
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x18; //设置定时初值
TH1 = 0xFC; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
ET1=1;
EA=1;
}
void Timer1Service() interrupt 3
{
uwtick++;
seg_pos=(++seg_pos)%8;
if(seg_buf[seg_pos]>20)
seg_disp(seg_pos,seg_buf[seg_pos]-',',1);
else
seg_disp(seg_pos,seg_buf[seg_pos],0);
if(++timer_1s==1000)
{
timer_1s=0;
frequency=TH0<<8|TL0;
TH0=TL0=0;
}
if(display_flag==1)
{
if(++timer_3s==3000)
{
display_flag=0;
timer_3s=0;
}
}
//如果没有触发采集
if(pick_flag==0)
{
if(long_press_flag)
{
if(++timer_2s>=2000)
timer_2s=2001;
}
else
timer_2s=0;
}
else
{
timer_2s=0;
long_press_flag=0;
}
if(++timer_100ms==100)
{
blink_flag^=1;
timer_100ms=0;
}
}
typedef struct
{
void(*task_func)(void);
unsigned long int rate_ms;
unsigned long int last_ms;
}task_t;
idata task_t scheduler_task[]=
{
{key_proc,10,0},
{seg_proc,100,0},
{led_proc,1,0},
{get_time,100,0},
{AD_DA,100,0},
{get_frequency,100,0}
};
idata unsigned char task_num;
void scheduler_init()
{
task_num=sizeof(scheduler_task)/sizeof(task_t);
}
void scheduler_run()
{
unsigned char i;
for(i=0;i<task_num;i++)
{
unsigned long int now_time=uwtick;
if(now_time>scheduler_task[i].last_ms+scheduler_task[i].rate_ms)
{
scheduler_task[i].last_ms=now_time;
scheduler_task[i].task_func();
}
}
}
void main()
{
system_init();
while(Temperature_Read()==85);
Set_Rtc(ucRtc);
scheduler_init();
Timer0Init();
Timer1Init();
while(1)
{
scheduler_run();
}
}

