1615788998(1).jpg (114.9 KB, 下載次數(shù): 26)
下載附件
2021-3-15 14:18 上傳
由于本論壇禁止直接求程序,禁止伸手黨,所以向大家請教一下大致的實現(xiàn)方法與思路,理清頭緒后我自己來寫程序去實現(xiàn)
- #include<reg52.h>
- #include<intrins.h>
- #include<string.h>
- #include"DS1302.h"
- uchar Adjust_Index=-1;
- uchar MonthsDays[]={0,31,0,31,30,31,30,31,31,30,31,30,31};
- //****************************************************************************
- void Write_Byte(uchar x)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- IO=x&1;
- SCLK=1;
- _nop_();_nop_();_nop_();_nop_();_nop_();
- SCLK=0;
- x>>=1;
- }
- }
- //***********************************************************************
- uchar Get_Byte()
- {
- uchar i,b,t;
- for(i=0;i<8;i++)
- {
- b>>=1;t=IO;b|=t<<7;
- SCLK=1;
- _nop_();_nop_();_nop_();_nop_();_nop_();
- SCLK=0;
- }
- t=b/16*10+b%16;
- return t;
- }
- //*************************************************************************
- uchar Read_Data(uchar addr)
- {
- uchar t;
- RST=0;SCLK=0;RST=1;
- Write_Byte(addr);
- _nop_();_nop_();_nop_();_nop_();_nop_();
- t=Get_Byte();
- SCLK=1;RST=0;
- return t;
- }
- //*****************************************************************************
- void Write_DS1302(uchar addr,uchar dat)
- {
- SCLK=0;RST=1;
- Write_Byte(addr);
- Write_Byte(dat);
- SCLK=1;RST=0;
- }
- //****************************************************************************
- void Set_Time()
- {
- uchar i;
- Write_DS1302(0x8e,0x00);
- for(i=0;i<7;i++)
- Write_DS1302(0x80+2*i,(DateTime[i]/10<<4|DateTime[i]%10));
- Write_DS1302(0x8e,0x80);
- }
- //*****************************************************************************
- void Get_Time()
- {
- uchar i;
- for(i=0;i<7;i++)
- DateTime[i]=Read_Data(0x81+2*i);
- }
- //********************************************************************************
- void DateTime_Adjust(char x)
- {
- uchar y;
- switch(Adjust_Index)
- {
- case 0://Ãëμ÷Õû
- if(x==1&&DateTime[0]<59)DateTime[0]++;
- if(x==-1&&DateTime[0]>0)DateTime[0]--;
- break;
- case 1://·Ö0-59
- if(x==1&&DateTime[1]<59)DateTime[1]++;
- if(x==-1&&DateTime[1]>0)DateTime[1]--;
- break;
- case 2://ê±0-23
- if(x==1&&DateTime[2]<23)DateTime[2]++;
- if(x==-1&&DateTime[2]>0)DateTime[2]--;
- break;
- case 3: //èÕ
- y=2000+DateTime[6];
- if((y%4==0&&y%100!=0)||(y%400==0))
- MonthsDays[2]=29;
- else
- MonthsDays[2]=28;
- if(x==1&&DateTime[3]<MonthsDays[DateTime[4]])DateTime[3]++;
- if(x==-1&&DateTime[3]>0)DateTime[3]--;
- break;
- case 4: //ÔÂ
- if(x==1&&DateTime[4]<12)DateTime[4]++;
- if(x==-1&&DateTime[4]>0)DateTime[4]--;
- y=2000+DateTime[6];
- if((y%4==0&&y%100!=0)||(y%400==0))
- MonthsDays[2]=29;
- else
- MonthsDays[2]=28;
- if(DateTime[3]<MonthsDays[DateTime[4]])
- DateTime[3]=MonthsDays[DateTime[4]];
- break;
- case 5://DÇÆú
- if(x==1&&DateTime[5]<7)DateTime[5]++;
- if(x==-1&&DateTime[5]>1)DateTime[5]--;
- break;
- case 6: //Äê
- if(x==1&&DateTime[6]<99)DateTime[6]++;
- if(x==-1&&DateTime[6]>0)DateTime[6]--;
- y=2000+DateTime[6];
- if((y%4==0&&y%100!=0)||(y%400==0))
- MonthsDays[2]=29;
- else
- MonthsDays[2]=28;
- if(DateTime[3]<MonthsDays[DateTime[4]])
- DateTime[3]=MonthsDays[DateTime[4]];
- break;
- }
- }
復制代碼
|