#include <STC15F2K60S2.H>
#include <intrins.h>
#include <ds1302.h>
#include <onewire.h>
#define uchar unsigned char
#define uint unsigned int
void Write_Ds1302_Byte(unsigned char temp);
void Write_Ds1302( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302 ( unsigned char address );
void readtime();
void ds1302inits();
void Delay_OneWire(unsigned int t);
void Write_DS18B20(unsigned char dat);
unsigned char Read_DS18B20(void);
bit init_ds18b20(void);
uchar temperature();
void Delay100ms(uchar a); //@11.0592MHz
void allinits();
void display1();
void display2();
void display3();
void display4();
void delay(uchar a);
uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
uchar one,two,three,four,five,six,seven,eight;
extern uchar time[7];
uchar code mode[]={1,5,30,60};
uchar temp[10];
int key;
int count4,count6;
int actime;
int count;
int tt,times,timeh,timem,wendu_time;
int t;
bit flag_5;
uchar wendu;
bit init;//S4
bit display;//S6
bit collect;//S5
bit flag_6;
void keyscan();
void start();
void Timer0Init(void);
void Timer1Init(void);
void temp_display();
void readtemp();
void start_act();
void skip_display();
void constant_display();
void main()
{
allinits();
Timer0Init();
while(1)
{
wendu=temperature();
keyscan();
if((key==0||key==4||key==6||key==7)&&display==0&&collect==0)start();
if(key==5&&display==0){start_act();}
if((key==6||key==7||key==4)&&collect==1){count4=count6=0;start_act();key=5;}//key作为返回值时 不能强行赋值 会被键盘刷新掉
if(count==10){collect=0;display=1;}
if(display==1)
{
if(key==6){constant_display();}
else if(key!=6)
{
if(flag_6==0)skip_display();
else if(flag_6==1)constant_display();
}
}
if(count6==9&&key==7){count4=0;count6=0;count=0;display=0;flag_6=0;}
display1();
display2();
display3();
display4();
}
}
void constant_display()
{
P2=0X80;P0=0XFF;temp_display();
flag_6=1;
}
void skip_display()
{
readtime();//需要不断读取时间
EA=0;ET0=0;TR0=0;
if(time[0]%2==0){P2=0X80;P0=0XFE;}
else if(time[0]%2!=0){P2=0X80;P0=0XFF;}
temp_display();
}
void start()
{
init=1;
one=two=three=four=five=11;six=10;
seven=mode[count4]/10;eight=mode[count4]%10;
if(count4==4)count4=0;
}
void temp_display()
{
one=six=10;two=0;four=five=11;
three=count6;seven=temp[count6]%100/10;eight=temp[count6]%10;
}
void start_act()
{
init=0;collect=1;
actime=mode[count4];
EA=1;ET0=1;TR0 = 1;
if(flag_5==1)
{
ds1302inits();//不能不断赋初值 top important!
flag_5=0;
}
readtime();
if(time[0]%2==0)
{one=time[2]/10;two=time[2]%10;three=10;four=time[1]/10;five=time[1]%10;six=10;seven=time[0]/10;eight=time[0]%10;}
else if(time[0]%2!=0)
{one=time[2]/10;two=time[2]%10;three=11;four=time[1]/10;five=time[1]%10;six=11;seven=time[0]/10;eight=time[0]%10;}
}
void keyscan()
{
uchar temp;
P3=0XFF;
if(P3!=0XFF)
{
delay(5);
if(P3!=0XFF)
{
temp=P3;
switch(P3)
{
case 0xfe:key=7;break;
case 0xfd:key=6;count6++;break;
case 0xfb:key=5;flag_5=1;break;
case 0xf7:key=4;count4++;break;
}
while(temp!=0xff){temp=P3;temp=temp&0xff;display1();display2();display3(); display4();}
}
}
}
void timer0() interrupt 1
{
tt++;
if(tt==200)
{
tt=0;
wendu_time++;
}
if(wendu_time==actime)
{
wendu_time=0;
if(count<10){temp[count]=wendu;count++;}
}
}
void Timer0Init(void) //5毫秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x00; //设置定时初值
TH0 = 0x28; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 0; //定时器0开始计时
}
void delay(uchar a) //@11.0592MHz
{
do{
unsigned char i, j;
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}while(--a);
}
void allinits()
{
P2=0XA0;P0=0X00;
P2=0X80;P0=0XFF;
P2=0XC0;P0=0XFF;
P2=0XE0;P0=0XFF;
}
void display1()
{
P2=0XC0;P0=0X01;
P2=0XE0;P0=tab[one];
delay(2);
P2=0XC0;P0=0X02;
P2=0XE0;P0=tab[two];
delay(2);
}
void display2()
{
P2=0XC0;P0=0X10;
P2=0XE0;P0=tab[five];
delay(2);
P2=0XC0;P0=0X08;
P2=0XE0;P0=tab[four];
delay(2);
}
void display3()
{
P2=0XC0;P0=0X04;
P2=0XE0;P0=tab[three];
delay(1);
P2=0XC0;P0=0X20;
P2=0XE0;P0=tab[six];
delay(1);
}
void display4()
{
P2=0XC0;P0=0X40;
P2=0XE0;P0=tab[seven];
delay(2);
P2=0XC0;P0=0X80;
P2=0XE0;P0=tab[eight];
delay(2);
P2=0XC0;P0=0xff;
P2=0XE0;P0=0xff;
}