ds1302时钟程序Word文档下载推荐.docx
《ds1302时钟程序Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《ds1302时钟程序Word文档下载推荐.docx(24页珍藏版)》请在冰点文库上搜索。
//时间初始化
voidread_rtc(void);
//读时间
voidtime_pros(void);
//时间处理
voiddelay(uintx);
voidinit(void);
//液晶初始化
voidwrite_com(ucharcom);
//写指令
voidwrite_date(uchardate);
//写数据
voidlcd_pos(ucharX,ucharY);
//voidwrite_sfm(ucharadd,uchardate);
//时分秒的写
voidkeyscan();
sbitkey1=P3^0;
//移
sbitkey2=P3^1;
//加
sbitkey3=P3^3;
//减
uchars1num;
charshi,fen,miao,zhou,yue,ri,nian;
voidmain()
{
uchari;
//set_rtc();
delay(30);
init();
//液晶初始化
//LCD(0,'
9'
);
//在第一个位置显示9
//LCD(1,'
//LCD(2,'
lcd_pos(2,0);
for(i=0;
i<
16;
i++)
{
write_date(table1[i]);
delay(20);
}
lcd_pos(3,0);
write_date(table2[i]);
while
(1)
{
read_rtc();
//读数据
keyscan();
//键盘扫描
time_pros();
//处理数据
write_com(0x99);
//秒地址
write_date(0x30+disp[4]);
//秒个位
write_date(0x30+disp[5]);
//秒十位
write_com(0x9b);
write_date(0x30+disp[2]);
write_date(0x30+disp[3]);
write_com(0x9d);
write_date(0x30+disp[0]);
write_date(0x30+disp[1]);
write_com(0x8f);
write_date(0x30+disp[10]);
write_date(0x30+disp[11]);
write_com(0x8d);
write_date(0x30+disp[6]);
write_date(0x30+disp[7]);
write_com(0x8b);
write_date(0x30+disp[8]);
write_date(0x30+disp[9]);
write_com(0x89);
write_date(0x30+disp[12]);
write_date(0x30+disp[13]);
}
voidkeyscan()
uchara,b;
if(key1==0)
delay(5);
s1num++;
while(key1==0);
if(s1num==1)
{
//write_com(0c);
//write_com(0x0f);
//write_com(0x98+5);
//写入光标位置
if(s1num==2)
write_com(0x98+3);
if(s1num==3)
write_com(0x98+1);
if(s1num==4)
write_com(0x88+7);
if(s1num==5)
write_com(0x88+5);
if(s1num==6)
write_com(0x88+3);
if(s1num==7)
write_com(0x88+1);
if(s1num>
=8)
{s1num=0;
write_com(0x0c);
write_ds1302(0x80,0x00);
//时钟正常工作
}
if(s1num!
=0)
if(key2==0)
if(key2==0)
while(!
key2);
{delay(20);
time_data[6]=read_ds1302(0x81);
//读取当前时间(bcd码)
a=time_data[6]/16;
b=time_data[6]%16;
miao=a*10+b;
miao++;
if(miao==60)
miao=0;
a=miao/10;
b=miao%10;
time_data[6]=a*16+b;
write_ds1302(0x8e,0x00);
//去除写保护
write_ds1302(0x80,time_data[6]);
write_ds1302(0x8e,0x80);
//加上写保护
time_data[5]=read_ds1302(0x83);
a=time_data[5]/16;
b=time_data[5]%16;
fen=a*10+b;
fen++;
if(fen==60)
fen=0;
a=fen/10;
b=fen%10;
time_data[5]=a*16+b;
write_ds1302(0x82,time_data[5]);
time_data[5]=read_ds1302(0x81);
time_data[4]=read_ds1302(0x85);
a=time_data[4]/16;
b=time_data[4]%16;
shi=a*10+b;
shi++;
if(shi==24)
shi=0;
a=shi/10;
b=shi%10;
time_data[4]=a*16+b;
write_ds1302(0x84,time_data[4]);
time_data[4]=read_ds1302(0x81);
time_data[3]=read_ds1302(0x8b);
a=time_data[3]/16;
b=time_data[3]%16;
zhou=a*10+b;
zhou++;
if(zhou==8)
zhou=1;
a=zhou/10;
b=zhou%10;
time_data[3]=a*16+b;
write_ds1302(0x8a,time_data[3]);
time_data[3]=read_ds1302(0x81);
time_data[2]=read_ds1302(0x87);
a=time_data[2]/16;
b=time_data[2]%16;
ri=a*10+b;
ri++;
if(ri==32)
ri=1;
a=ri/10;
b=ri%10;
time_data[2]=a*16+b;
write_ds1302(0x86,time_data[2]);
time_data[2]=read_ds1302(0x81);
time_data[1]=read_ds1302(0x89);
a=time_data[1]/16;
b=time_data[1]%16;
yue=a*10+b;
yue++;
if(yue==13)
yue=1;
a=yue/10;
b=yue%10;
time_data[1]=a*16+b;
write_ds1302(0x88,time_data[1]);
time_data[1]=read_ds1302(0x81);
time_data[0]=read_ds1302(0x8d);
a=time_data[0]/16;
b=time_data[0]%16;
nian=a*10+b;
nian++;
if(nian==99)
nian=0;
a=nian/10;
b=nian%10;
time_data[0]=a*16+b;
write_ds1302(0x8c,time_data[0]);
time_data[0]=read_ds1302(0x81);
if(key3==0)
key3);
miao--;
if(miao==-1)
miao=59;
{delay(20);
fen--;
if(fen==-1)
fen=59;
shi--;
if(shi==-1)
shi=24;
zhou--;
if(zhou==0)
zhou=7;
ri--;
if(ri==0)
ri=31;
yue--;
if(yue==0)
yue=12;
nian--;
if(nian==0)
nian=99;
voidwrite_ds1302_byte(uchardat)//写一个字节
for(i=0;
8;
{
clk=0;
io=dat&
0x01;
//准备数据
dat=dat>
>
1;
//移位
clk=1;
}
voidwrite_ds1302(ucharadd,uchardat)//写地址写数据
rst=0;
_nop_();
rst=1;
write_ds1302_byte(add);
//传地址
write_ds1302_byte(dat);
//传数据
io=1;
ucharread_ds1302(ucharadd)//写地址读数据
uchari,value;
rst=0;
_nop_();
clk=0;
rst=1;
write_ds1302_byte(add);
//低电平数据不变,数据可读
value=value>
if(io)
value=value|0x80;
}
returnvalue;
//voidset_rtc(void)//校准初始时间
//{
//uchari,j;
//for(i=0;
7;
i++)//十进制数转换为BCD码
//{
//j=time_data[i]/10;
//十位
//time_data[i]=time_data[i]%10;
//个位
//time_data[i]=time_data[i]+j*16;
//十进制数转换为BCD码
//}
//write_ds1302(0x8e,0x00);
//write_ds1302(write_add[i],time_data[i]);
//写地址传数据
//}//对时完成
////write_ds1302(0x8e,0x80);
//加上写保护(防止误动作)
//}
voidread_rtc(void)//读时间
uchari;
time_data[i]=read_ds1302(read_add[i]);
voiddelay(uintx)
{
uinta,b;
for(a=x;
a>
0;
a--)
for(b=110;
b>
b--);
voidwrite_com(ucharcom)//写指令数据
LCD_RS=0;
LCD_RW=0;
LCD_EN=0;
P0=com;
LCD_EN=1;
voidwrite_date(uchardate)//写指令数据
LCD_RS=1;
P0=date;
voidlcd_pos(ucharX,ucharY)
ucharpos;
if(X==0)
{X=0x80;
elseif(X==1)
{X=0x90;
elseif(X==2)
{X=0x88;