📄 main.c
字号:
a=a-Old_hours;
if(a==24) a=0;
if(Tov1==0xff) Tov1=1;
c=a/10;
if(c==0) c=10;
SENDCOMB(0x2c); //Write address
SendByte(pgm_read_byte(S+c)|(Fuse1<<4)); //write data
SendByte(pgm_read_byte(S+a%10)|(Fuse2<<4)); //write data
SendByte(pgm_read_byte(S+b/10)|(Tov1<<4));
SendByte(pgm_read_byte(S+b%10)); //write data
if(Tov1==1) Tov1=0xff;
return;
}
if(Sign1==1)
{
Sign1=0;
Old_hours=a;
Old_minutes=b;
}
a=Old_hours/10;
b=Old_minutes/10;
if(a==0) a=10;
// if(b==0) b=10;
SENDCOMB(0x2c); /* //Write address
SendByte(S[a]|(Fuse1<<4)); //write data
SendByte(S[Old_hours%10]|(Fuse2<<4)); //write data
SendByte(S[Old_minutes/10]|(1<<4)); //write data
SendByte(S[Old_minutes%10]); //write data*/
SendByte(pgm_read_byte(S+a)|(Fuse1<<4)); //write data
SendByte(pgm_read_byte(S+Old_hours%10)|(Fuse2<<4)); //write data
SendByte(pgm_read_byte(S+Old_minutes/10)|(1<<4)); //write data
SendByte(pgm_read_byte(S+Old_minutes%10)); //write data
return;
}
}
void disp1(void)
{
SENDCOMB(0x1c); //write address
SendByte(pgm_read_byte(S+tmp_old[0]/10)); //write data
SendByte(pgm_read_byte(S+tmp_old[0]%10)); //write data
SENDCOMB(0x0c); //write address
SendByte(pgm_read_byte(S+tmp_old[1]/10)|(sign2<<4)); //write data
SendByte(pgm_read_byte(S+tmp_old[1]%10)); //write data
}
void Done_adc1(void)//温度采集数据处理
{
float r1;
volatile signed char Tmp; //温度值
if(ADC_rel>=949) Tmp=-30;
else if(ADC_rel<=181) Tmp=70;
else
{
r1=(float)10/((float)1024/ADC_rel-1);
if(r1>=28.46) //-30~0
{
Tmp=-0.000031*r1*r1*r1+0.009489*r1*r1-1.155047*r1+25.894894;
}
if(r1>=8.264 && r1<28.46) //0~30
{
Tmp=-0.002114*r1*r1*r1+0.166363*r1*r1-5.233344*r1+62.928421;
}
if(r1<8.264) //30~70
{
Tmp=-0.13*r1*r1*r1+2.81*r1*r1-24.06*r1+109.99;
}
}
if(ADC_mux==0)
{
if(Tmp<0) tmp_rel[0]=0;
else tmp_rel[0]=(WORD)(Tmp);
//tmp_rel[0]=((tmp_rel[0]<<1)+(tmp_old[0]<<3))/10;
tmp_old[0]=tmp_rel[0];
}
if(ADC_mux==1)
{
if(Tmp<0) {tmp_rel[1]=(WORD)(-Tmp);sign2=1;}
else {tmp_rel[1]=Tmp;sign2=0;}
//tmp_rel[1]=((tmp_rel[1]<<1)+(tmp_old[1]<<3))/10;
tmp_old[1]=tmp_rel[1];
}
WDR();
}
//#pragma interrupt_handler int1_isr:3
//void int1_isr(void)
SIGNAL(SIG_INTERRUPT1)
{
int1_off();/*
disp_init();
WDT_init();
ADCSRA |=(1<<ADEN);*/
}
//#pragma interrupt_handler timer2_ovf:5
//void timer2_ovf(void)
SIGNAL(SIG_OVERFLOW2)
{
//CLI();
TCNT2=0x64;
Tov2++;
if(Tov2>10)
{
ADCSRA |=(1<<ADSC);
Tov2=0;
WDR();
}
//SEI();
}
//#pragma interrupt_handler timer1_ovf:9
//void timer1_ovf(void) //位闪动即修改
SIGNAL(SIG_OVERFLOW1)
{
//CLI();
TCNT1H=0xc2;
TCNT1L=0xf7;
TCCR1B=0x04;
T++;
if(Tov1==0xff) Tov1=0;
else Tov1=0xff;
if(N==3) N=0;
if(M[0]==3) M[0]=1;
if(M[1]==2) M[1]=0;
Gettime();
disp();
disp1();
WDR();
//SEI();
}
//#pragma interrupt_handler timer0_ovf:10
//void timer0_ovf(void)
SIGNAL(SIG_OVERFLOW0)
{
//CLI();
TCNT0=6;
Tov0++;
if(Tov0>500)
{
if(N!=2)
{
if(M[0]!=0) M[0]=0;
if(M[0]==0) N=0;
}
Tov0=0;
}
WDR();
//SEI();
}
//#pragma interrupt_handler adc_isr:15
//void adc_isr(void) //ADC完成中断
SIGNAL(SIG_ADC)
{
WORD adc;
adc=(WORD)(ADCH<<8)+ADCL;
ADC_rel+=adc&0x3ff;
if (ADC_ov<15) ADC_ov++;
else
{
ADC_rel=ADC_rel>>4; //16点平均滤波
Done_adc1(); //转换完数据处理
if(ADC_mux==0) ADC_mux=1;
else ADC_mux=0;
ADMUX=(1<<REFS0) | (ADC_mux&0x07);//选择外部AVCC为基准
ADC_rel=0;
ADC_ov=0;
}
WDR();
//SEI();
return;
}
/*-- N为当前显示状态 -- 0,3显示时间,1显示日期,2时间记录 --*/
/*-- M为位闪耀状态 -- 0未闪耀,1低位,2高位 --*/
void Done_C(void)//'+'键处理
{
if(N==0)
{
if(M[0]==1)
{
i2c_Write(0,0);
minutes=DEC(minutes);
minutes++;
if(minutes>59) minutes=0;
i2c_Write(BCD(minutes),1);
return;
}
if(M[0]==2)
{
hours=DEC(hours);
hours++;
if(hours>23) hours=0;
i2c_Write(BCD(hours),2);
return;
}
return;
}
if(N==1)
{
if(M[0]==1)
{
date=DEC(date);
date++;
if(date>31) date=1;
i2c_Write(BCD(date),4);
return;
}
if(M[0]==2)
{
month=DEC(month);
month++;
if(month>12) month=1;
i2c_Write(BCD(month),5);
return;
}
return;
}
return;
}
//'-'键处理
void Done_D(void)
{
if(N==0)
{
if(M[0]==1)
{
i2c_Write(0,0);
minutes=DEC(minutes);
minutes--;
if(minutes<0) minutes=59;
i2c_Write(BCD(minutes),1);
return;
}
if(M[0]==2)
{
hours=DEC(hours);
hours--;
if(hours<0) hours=23;
i2c_Write(BCD(hours),2);
return;
}
return;
}
if(N==1)
{
if(M[0]==1)
{
date=DEC(date);
date--;
if(date<0) date=31;
i2c_Write(BCD(date),4);
return;
}
if(M[0]==2)
{
month=DEC(month);
month--;
if(month<0) month=12;
i2c_Write(BCD(month),5);
return;
}
return;
}
return;
}
int main(void)
{
volatile BYTE i;
port_init();
disp_init();
I2C_init();
//time_init();
adc_init();
T_init();
int1_off();
//WDT_init();
TIMSK=0X45;
cli();
//down();
sei();
M[0]=0;
M[1]=0;
while(1)
{/*
if(!(PIND & 1<<PD3))
{*/
if(!(PIND & 1<<PD0))
{
cli();
if(M[1]!=1)
{
TCNT0=6;
Tov0=0;
if(M[0]==0) N++;
else M[0]=0;
sei();
delay_ms(500);
}
sei();
}
if(!(PIND & 1<<PD1))
{
cli();
TCNT0=6;
Tov0=0;
if(N!=2) M[0]++;
else {M[1]++;M[0]=0;}
sei();
delay_ms(500);
}
if(!(PIND & 1<<PD2))
{
cli();
TCNT0=6;
Tov0=0;
Done_C();
delay_ms(500);
sei();
}
if((PIND & 1<<PD3))
{
cli();
TCNT0=6;
Tov0=0;
Done_D();
delay_ms(500);
SEI();
disp_off();
WDT_off();
int1();
ADCSRA &=~(1<<ADEN);
sei();
SLEEP();
disp_init();
ADCSRA |=(1<<ADEN);
WDT_init();
}/**/
i=PINA;
Close[0]=(i & 1<<PA2)>>PA2;
Close[1]=(i & 1<<PA3)>>PA3;
Close[2]=(i & 1<<PA4)>>PA4;
Close[3]=(i & 1<<PA5)>>PA5;
if((i & 1<<PA6) && (i & 1<<PA7))
{
if(T>2)
{
Fuse1=0;
Fuse2=0;
T=0;
}
}
else if(i & 1<<PA6) {Fuse1=0;Fuse2=1;T=0;} //1灯丝完好
else if(i & 1<<PA7) {Fuse2=0;Fuse1=1;T=0;} //1灯丝完好
else {Fuse1=1;Fuse2=1;}
delay_ms(50);
/*}
else
{
delay_ms(1000);
if(PIND & 1<<PD3)
{
disp_off();
WDT_off();
int1();
ADCSRA &=~(1<<ADEN);
SLEEP();
}
}*/
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -