程序如下:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define unit unsigned int
#define anod_combit P2
#define seg7 P1
sbit DS1302_CLK = P3^2;
sbit DS1302_IO = P3^3;
sbit DS1302_RST = P3^4;
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
sbit Tiaoshi=P3^7;
sbit Inck=P3^6;
unit count;
uchar temp,readdata;
bit Inck_flag=0x20;
typedef struct
{
uchar Second;
uchar Minute;
uchar Hour;
uchar TimeStr[6];
}SYSTEMTIME;
SYSTEMTIME CurrentTime;
#define DS1302_SECOND 0x80
#define DS1302_MINUTE 0x82
#define DS1302_HOUR 0x84
void mdelay(unit count)
{
uchar i,j;
for(i=0;i<count;i++)
{
for(j=0;j<106;j++);
}
}
void DS1302InputByte(uchar d)
{
uchar i;
ACC = d;
for(i=8;i>0;i--)
{ DS1302_IO = ACC0;
DS1302_CLK = 1;
DS1302_CLK = 0;
ACC = ACC >>1;
}
}
uchar DS1302OutputByte(void)
{
uchar i;
ACC=0;
for(i=8;i>0;i--)
{ ACC = ACC >>1;
ACC7 = DS1302_IO;
DS1302_CLK = 1;
DS1302_CLK = 0;
}
return(ACC);
}
void Write1302(uchar ucAddr,uchar ucDa)
{ DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(ucAddr);
DS1302InputByte(ucDa);
DS1302_CLK = 1;
DS1302_RST = 0;
}
uchar Read1302(uchar ucAddr)
{ uchar ucData;
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(ucAddr|0x01);
ucData = DS1302OutputByte();
DS1302_CLK = 1;
DS1302_RST = 0;
return(ucData);
}
void DS1302_GetTime(SYSTEMTIME *Time)
{ uchar ReadValue;
ReadValue = Read1302(DS1302_SECOND);
Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_MINUTE);
Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_HOUR);
Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
}
void TimeToStr(SYSTEMTIME *Time)
{
Time->TimeStr[0] = Time->Hour/10;
Time->TimeStr[1] = Time->Hour%10;
Time->TimeStr[2] = Time->Minute/10;
Time->TimeStr[3] = Time->Minute%10;
Time->TimeStr[4] = Time->Second/10;
Time->TimeStr[5] = Time->Second%10;
}
void Dis( SYSTEMTIME *Time )
{ uchar disbit,shitfb;
DS1302_GetTime(Time);
TimeToStr(Time);
disbit=1;
switch(count)
{ case 0:
for(shitfb=0;shitfb<6;shitfb++)
{ _nop_(); _nop_();
seg7=Time->TimeStr[shitfb];
anod_combit=_crol_(disbit,shitfb);
mdelay(6);
anod_combit =0;
}
break;
case 1:
for(shitfb=0;shitfb<2;shitfb++)
{ _nop_(); _nop_();
seg7=Time->TimeStr[shitfb];
anod_combit=_crol_(disbit,shitfb);
mdelay(6);
anod_combit =0;
}break;
case 2:
for(shitfb=2;shitfb<4;shitfb++)
{ _nop_(); _nop_();
seg7=Time->TimeStr[shitfb];
anod_combit=_crol_(disbit,shitfb);
mdelay(6);
anod_combit =0;
}break;
case 3:
for(shitfb=4;shitfb<6;shitfb++)
{ _nop_(); _nop_();
seg7=Time->TimeStr[shitfb];
anod_combit=_crol_(disbit,shitfb);
mdelay(6);
anod_combit =0;
}break;
default:break;
}
}
void Setkey()
{ if(Tiaoshi==0)
{ mdelay(8);
if(Tiaoshi==0)
{ count=count+1;
if (count==4)
{ count=0;
readdata=(Read1302(0x80))&0X7F;
Write1302(0x80,readdata);
Write1302(0x8e,0x80);
}
while(Tiaoshi==0);
}
}
}
void Inckey()
{ if(Inck==0)
{ mdelay(8);
switch(count)
{ case 1:
temp=Read1302(DS1302_HOUR);
temp=((temp&0x70)>>4)*10+(temp&0x0f);
temp=temp+1;
if(temp>=24)
temp=0;
Inck_flag=1;
break;
case 2:
temp=Read1302(DS1302_MINUTE);
temp=((temp&0x70)>>4)*10+(temp&0x0f);
temp=temp+1;
Inck_flag=1;
if(temp>=60)
temp=0;
break;
case 3:
temp=Read1302(DS1302_SECOND);
temp=((temp&0x70)>>4)*10+(temp&0x0f);
temp=temp+1;
Inck_flag=1;
if(temp>=60)
temp=0;
break;
default: Inck_flag=0; break;
}
while(Inck==0);
}
}
void Keydone()
{ Write1302(0x8e,0x00);
readdata=Read1302(0x80);
Write1302(0x80,readdata|0x80);
switch(count)
{case 1:do
{ Inckey();
if(Inck_flag==1)
{ temp=(temp/10)<<4|temp%10;
Write1302(0x84,temp);
Inck_flag=0;
}
Dis(&CurrentTime);
}while(count==2);break;
case 2:do
{ Inckey();
if(Inck_flag==1)
{ temp=(temp/10)<<4|temp%10;
Write1302(0x82,temp);
Inck_flag=0;
}
Dis(&CurrentTime);
}while(count==3);break;
case 3:do
{ Inckey();
if(Inck_flag==1)
{ temp=(temp/10)<<4|temp%10;
Write1302(0x80,temp|0x80);
Inck_flag=0;
}
Dis(&CurrentTime);
}while(count==4);break;
default:break;
}
}
main()
{ Inck_flag=0;
mdelay(100);
readdata=Read1302(0x80);
Write1302(0x80,readdata&0x7f);
while(1)
{ DS1302_GetTime(&CurrentTime);
TimeToStr(&CurrentTime);
Dis(&CurrentTime);
Setkey();
if(count!=0)
Keydone();
}
}