for(j=0;j<110;j++);
}
voidstart()//开始函数
{SDA=1;
delay();
SCL=1;
delay();
SDA=0;
delay();
}
voidstop()//停止函数
{SDA=0;
delay();
SCL=1;
delay();
SDA=1;
delay();
}
voidrespons()//应答函数
{uchari;
SCL=1;
delay();
while((SDA==1)&&(i<250))i++;
SCL=0;
delay();
}
voidwrite_byte(uchardate)//写一字节
{uchari,temp;
temp=date;
for(i=0;i<8;i++)
{temp=temp<<1;
SCL=0;
delay();
SDA=CY;
delay();
SCL=1;
delay();
}
SCL=0;
delay();
SDA=1;
delay();
}
ucharread_byte()
{uchari,k;
SCL=0;
delay();
SDA=1;
delay();
for(i=0;i<8;i++)
{SCL=1;
delay();
k=(k<<1)|SDA;
SCL=0;
delay();
}
returnk;
}
voidwrite_add(ucharaddress,uchardate)
{start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
write_byte(date);
respons();
stop();
}
ucharread_add(ucharaddress)
{uchardate;
start();
write_byte(0xa0);//
respons();
write_byte(address);
respons();
start();
write_byte(0xa1);//芯片寻址(1010001)读
respons();
date=read_byte();
stop();
returndate;
}
voidinitial()
{ucharrd_value;
rd_value=read_add(100);delay_icc(250);
if(rd_value==88)
{set1_dat[0]=read_add(80);delay_icc(250);
set1_dat[1]=read_add(81);delay_icc(250);
set2_dat[0]=read_add(90);delay_icc(250);
set2_dat[1]=read_add(91);delay_icc(250);
}
TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
TR0=1;
ET0=1;
ET1=1;
TR1=1;
EA=1;
}
/********************************************************/
voidtime0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
deda++;
if(deda>=20){deda=0;sec++;}
if(sec>9){sec=0;min++;}
if(min>9){min=0;hour++;}
if(hour>23){hour=0;}
}
/*********************************************************/
voidtime1()interrupt3
{
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
time_cnt++;
bit_flag=~bit_flag;
if(status==0){if(time_cnt>3)time_cnt=0;}
else{if(time_cnt>9)time_cnt=0;}
}
ucharkey()
{uchartemp;
P3=0xff;
temp=P3;
if(temp!
=0xff)
{delay_icc(30);
P3=0xff;
temp=P3;
}
return(temp);
}
voidpout()//输出判断子函数
{
if((min==set1_dat[0])&&(hour==set1_dat[1]))P1=0x00;
if((min==set2_dat[0])&&(hour==set2_dat[1]))P1=0xff;
}
/*********************/
voidmain()
{
ucharkey_value;
initial();
for(;;)
{
key_value=key();
pout();
if(key_value==STATUS_KEY)//如果S4键按下
{status++;
if(status==6)
{status=0;
EA=0;
pout();
write_add(100,88);delay_icc(250);
write_add(80,set1_dat[0]);delay_icc(250);
write_add(81,set1_dat[1]);delay_icc(250);
write_add(90,set2_dat[0]);delay_icc(250);
write_add(91,set2_dat[1]);delay_icc(250);
write_add(70,(uchar)set1_flag);delay_icc(250);
write_add(71,(uchar)set2_flag);delay_icc(250);
EA=1;
}
delay1ms(300);
}
if(key_value==INC_KEY)//如果S1键按下
{pout();
switch(status)
{case1:
if(set1_dat[0]<60)set1_dat[0]++;delay1ms(300);break;
case2:
if(set1_dat[1]<23)set1_dat[1]++;delay1ms(300);break;
case3:
if(set2_dat[0]<60)set2_dat[0]++;delay1ms(300);break;
case4:
if(set2_dat[1]<23)set2_dat[1]++;delay1ms(300);break;
case5:
if(min<60)min++;delay1ms(300);break
default:
break;
}
}
if(key_value==DEC_KEY)
{pout();
switch(status)
{pout();
case1:
if(set1_dat[0]>0)set1_dat[0]--;delay1ms(300);break;
case2:
if(set1_dat[1]>0)set1_dat[1]--;delay1ms(300);break;
case3:
if(set2_dat[0]>0)set2_dat[0]--;delay1ms(300);break;
case4:
if(set2_dat[1]>0)set2_dat[1]--;delay1ms(300);break;
case5:
if(min>0)min--;delay1ms(300);break;
default:
break;}
}
if(key_value==OK_KEY)
{if((status==1)||(status==2)){set1_flag=!
set1_flag;delay1ms(300);}
if((status==3)||(status==4)){set1_flag=!
set1_flag;delay1ms(300);}
}
if(status==0)
{pout();
switch(time_cnt)
{case0:
P0=SEG7[sec%10];P2=ACT[5];break;
case1:
P0=SEG7[sec/10];P2=ACT[4];break;
case2:
P0=SEG7[min%10];P2=ACT[3];break;
case3:
P0=SEG7[min/10];P2=ACT[2];break;
case4:
P0=SEG7[hour%10];P2=ACT[1];break;
case5:
P0=SEG7[hour/10];P2=ACT[0];break;
default:
break;
}
}
if(status==1)
{pout();
switch(time_cnt)
{case0:
P0=SEG7[status];P2=ACT[0];break;
case1:
P0=0xff;P2=ACT[1];break;
case2:
P0=SEG7[set1_dat[0]%10];P2=ACT[3];break;
case3:
P0=SEG7[set1_dat[0]/10];P2=ACT[2];break;
default:
if(bit_flag){P0=SEG7[set1_dat[0]%10];P2=ACT[3];}
elseP0=SEG7[set1_dat[0]/10];P2=ACT[2];
break;
}
}
if(status==2)
{pout();
switch(time_cnt)
{case0:
P0=SEG7[status];P2=ACT[0];break;
case1:
if(set1_flag)P0=0xfb;
elseP0=0xff;P2=ACT[1];break;
case2:
P0=SEG7[set1_dat[1]%10];P2=ACT[3];break;
case3:
P0=SEG7[set1_dat[1]/10];P2=ACT[2];break;
default:
if(bit_flag){P0=SEG7[set1_dat[1]%10];P2=ACT[3];}
else{P0=SEG7[set1_dat[1]/10];P2=ACT[2];}break;
}
}
if(status==3)
{switch(time_cnt)
{case0:
P0=SEG7[status];P2=ACT[0];break;
case1:
P0=0xff;P2=ACT[1];break;
case2:
P0=SEG7[set2_dat[0]%10];P2=ACT[3];break;
case3:
P0=SEG7[set2_dat[0]/10];P2=ACT[2];break;
default:
if(bit_flag){P0=SEG7[set2_dat[0]%10];P2=ACT[3];}
elseP0=SEG7[set2_dat[0]/10];P2=ACT[2];
break;
}
}
if(status==4)
{
switch(time_cnt)
{
case0:
P0=SEG7[status];P2=ACT[0];break;
case1:
if(set1_flag)P0=0xfb;
elseP0=0xff;P2=ACT[1];break;
case2:
P0=SEG7[set2_dat[1]%10];P2=ACT[3];break;
case3:
P0=SEG7[set2_dat[1]/10];P2=ACT[2];break;
default:
if(bit_flag){P0=SEG7[set2_dat[1]%10];P2=ACT[3];}
else{P0=SEG7[set2_dat[1]/10];P2=ACT[2];}break;
}
}
if(status=5)
{switch(time_cnt)
{case0:
P0=SEG7[status];P2=ACT[0];break;
case1:
P0=0xff;P2=ACT[1];break;
case2:
P0=SEG7[min%10];P2=ACT[3];break;
case3:
P0=SEG7[min/10];P2=ACT[2];break;
default:
if(bit_flag){P0=SEG7[min%10];P2=ACT[3];}
elseP0=SEG7[min/10];P2=ACT[2];
break;}
}
}
}
参考文献:
1、郭天祥,《新概念单片机C语言教程》,电子工业出版社,2003年
2、童诗白华成英,《模拟电子技术基础》,高等教育出版社,2009年
3、杨路明,《C语言程序设计教程》,北京邮电大学出版社,2007年
4、胡汉才,《单片机接口技术》,清华大学出版社,2009年
5、丁明亮唐前辉,《单片机应用设计与仿真》,北京航空航天大学出版社2009年