//LCD显示 lcdshow()
{ P0=0XC; //显示器开、光标关 enable();
P0=0x80; //第一行0~15 enable();
write1(time1,16);
P0=0xc1; //第二行1~14 enable();
write1(time2,15); }
//DS1302读写子程序 write(uchar address) { uchar i; clk=0;
_nop_(); rst=1; _nop_();
for(i=0;i<8;i++) { dat=address&1; _nop_(); clk=1;
address>>=1; clk=0; } }
uchar read() { uchar i,j=0; for(i=0;i<8;i++) { j>>=1; _nop_(); clk=0; _nop_(); if(dat)
j|=0x80; _nop_(); clk=1; }
return(j); }
//部分显示数据初始化 timestart() {
time1[6]=time1[9]='-';
time1[2]='2',time1[3]='0'; time2[2]=time2[5]=':'; write(0xc1);
alarm[0]=read(); rst=0;
write(0xc3);
alarm[1]=read(); rst=0;
write(0xc5); time1[0]=read(); rst=0; }
//读取时间 readtime()
{ uchar i,m,n;
write(0x8d); //读取年份
m=read(); rst=0;
time1[4]=m/16+0x30; time1[5]=m+0x30;
time1[15]=m+0x30;
for(i=7,n=0x89;i<11;i+=3,n-=2) //读取月份和日期 { write(n); m=read(); rst=0;
time1[i]=m/16+0x30; time1[i+1]=m+0x30; }
for(m=0,i=0,n=0x85;i<7;i+=3,n-=2,m++) //读取时,分,秒 { write(n);
time[m]=read(); //将实时的时分秒给time[] rst=0;
time2[i]=time[m]/16+0x30; time2[i+1]=time[m]+0x30; } }
baoshi() //整点报时 { beep=1;
if(time[1]==0) if(time[2]==0)
{beep=0;delay(10);beep=1;} }
//闹钟部分 showalarm() { uchar i;
for(i=1;i<10;i++)
{beep=0;delay(1000);beep=1;} }
//根据日期的变动自动调整星期
//设置时间 settime() {
uchar i=0x85,year,month,day,n;
time2[6]=time2[7]=0x30,time1[14]=time1[15]=0x20;
lcdshow(); while(1) {
P0=0x0e; //显示器开显示、开光标 enable();
P0=i; //定光标 enable(); P1=0xf0;
if(P1!=0Xf0) //有按钮按下 {
delay1ms(100); //延时0.1s去抖动 if(P1!=0Xf0) {
j=7;
if(P1==0X70) //K1,设置时钟 {
i+=3;
if(i==0x8e) i=0xc2;
else if(i>0xc5) i=0x85; }
else if(P1==0xb0) //K2,上调 {
year=(time1[4]&0xf)*10+(time1[5]&0xf); month=(time1[7]&0xf)*10+(time1[8]&0xf); day=(time1[10]&0xf)*10+(time1[11]&0xf); if(i==0x85) {
year++; if(year>99) year=0;
if((year%4)!=0)
if(month==2&&day==29) day=28; }
else if(i==0x88) {
month++; if(month>12) month=1;
if(day>Day[month-1]) {
day=Day[month-1];
if(month==2&&(year%4)==0)
}
day=29;
} }
else if(i==0x8b) {
day++;
if(day>Day[month-1]) {
if(month==2&&(year%4)==0) {
if(day>29) day=1; }
if(month!=2) day=1; } }
else if(i==0xc2) {
n=(time2[0]&0xf)*10+(time2[1]&0xf); n++; if(n>23) n=0;
time2[0]=n/10+0x30; time2[1]=n+0x30; } else {
n=(time2[3]&0xf)*10+(time2[4]&0xf); n++; if(n>59) n=0;
time2[3]=n/10+0x30; time2[4]=n+0x30; }
time1[4]=year/10+0x30; time1[5]=year+0x30; time1[7]=month/10+0x30; time1[8]=month+0x30; time1[10]=day/10+0x30; time1[11]=day+0x30; lcdshow();
else if(P1==0xd0) //K3,下调