DS1302C程序.docx
- 文档编号:5879208
- 上传时间:2023-05-09
- 格式:DOCX
- 页数:23
- 大小:18.17KB
DS1302C程序.docx
《DS1302C程序.docx》由会员分享,可在线阅读,更多相关《DS1302C程序.docx(23页珍藏版)》请在冰点文库上搜索。
DS1302C程序
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitdula=P2^6;
sbitwela=P2^7;
sbitSCK=P3^2;
sbitSDA=P2^4;
sbitRST=P3^3;//DS1302復位
sbitrs=P3^5;
sbitlcden=P3^4;
sbitwr=P3^6;
sbitset=P3^0;//定義按鍵端口
sbits2=P3^1;
sbitrd=P3^7;
ucharshi,ge,setn=0;
bitflag;
ucharcodetime0[]="DATE:
--";
ucharcodetime1[]="TIME:
:
:
";
uchartime_dat[7]={30,59,23,30,11,2,13};//秒分時日月周年//可隨時更改
ucharwrite_add[]={0x80,0x82,0x84,0x86,
0x88,0x8a,0x8c};//秒分時日月周年寫的寄存器地址
ucharread_add[]={0x81,0x83,0x85,0x87,
0x89,0x8b,0x8d};//秒分時日月周年讀的寄存器地址
voiddelayms(ucharms)
{
ucharj,k;
for(j=ms;j>0;j--)
for(k=110;k>0;k--);
}
voiddelayus(uchart)
{
while(--t);//12M晶振,t自減一次約2微秒
}
/**********十進制轉換成十六進制***********/
ucharchange_to16(ucharx)
{
uchartep,y;
y=x;
tep=y/16;
y=y%16;
y=y+tep*10;
returny;
}
/**********十六進制轉換成十進制***********/
ucharchange_to10(ucharx)
{
uchartep,y;
y=x;
tep=y/10;
y=y%10;
y=y+tep*16;
returny;
}
/***********往DS1302寫入一個字節********/
voidwrite_ds1302_byte(uchardat)
{
uchari;
for(i=0;i<8;i++)
{
SCK=0;
SDA=dat&0x01;
dat>>=1;
SCK=1;
}
}
/*************往DS1302寄存器寫數據**************/
voidwrite_ds1302(ucharadd,uchardat)
{
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;
write_ds1302_byte(add);
write_ds1302_byte(dat);
RST=0;
SCK=0;
SDA=1;
}
/****************讀一個字節****************/
ucharRead_Ds1302_Byte()
{
uchari,temp;
for(i=0;i<8;i++)//循環8次讀取數據
{
temp>>=1;
SCK=0;//先讀出數據,然後才進行判斷SDA是0還是1
if(SDA)
temp|=0x80;//每次傳輸低字節
SCK=1;
}
return(temp);
}
/*************從寄存器讀數據***********/
ucharRead_Ds1302(ucharadd)
{
uchardate;
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;
write_ds1302_byte(add);
date=Read_Ds1302_Byte();
/*for(i=0;i<8;i++)
{
temp>>=1;
SCK=0;
if(SDA)
temp=temp|0x80;
SCK=1;
}*/
RST=0;
SCK=0;
SDA=1;
returndate;
}
/***************設定日曆************/
voidSet_RTC(void)
{
uchari,*P;
if(Read_Ds1302(0xc1!
=0xf0))//讀RAM看是否需要寫入時間
{
for(i=0;i<7;i++)//BCD處理,將十六進制轉換成十進制
{
time_dat[i]=change_to10(time_dat[i]);
}
write_ds1302(0x8e,0x00);//關閉寫保護
P=write_add;//傳要寫的寄存器地址
for(i=0;i<7;i++)//7次寫入時分秒日月周年
{
write_ds1302(*P,time_dat[i]);
P++;
}
write_ds1302(0x8e,0x80);//打開寫保護
}
}
/****************讀取日曆****************/
voidread_rtc()
{
uchari,*P;
P=read_add;
for(i=0;i<7;i++)
{
time_dat[i]=Read_Ds1302(*P);
P++;
}
}
voidwrite_com(ucharcom)
{
rs=0;
lcden=0;
P0=com;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
voidwrite_date(uchardate)
{
rs=1;
lcden=0;
P0=date;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
voidinit_1602()//液晶初始化
{
ucharnum;
dula=0;
wela=0;
lcden=0;
wr=0;
write_com(0x38);//顯示模式設置
write_com(0x0c);
write_com(0x06);
write_com(0x01);//顯示清屏
write_com(0x80);
for(num=0;num<16;num++)
{
write_date(time0[num]);
delayms(3);
}
write_com(0x80+0x40);
for(num=0;num<13;num++)
{
write_date(time1[num]);
delayms(3);
}
}
/**************1602寫數據***************/
voiddisp1602()
{
staticuchari=0;
switch(i)
{
case0:
write_com(0x80+0x40+11);break;//鏃華硊
case1:
write_com(0x80+0x40+8);break;//煦華硊
case2:
write_com(0x80+0x40+5);break;//華硊
case3:
write_com(0x80+11);break;//華硊
case4:
write_com(0x80+8);break;//堎華硊
case5:
write_com(0x80+0x0e);break;//陎華硊
case6:
write_com(0x80+5);break;//爛華硊
}
shi=time_dat[i]/16;
ge=time_dat[i]%16;
write_date(0x30+shi);
write_date(0x30+ge);
i++;
if(i==7)
i=0;
}
/****************鍵盤掃描****************/
voidkeyscan()
{
uchartem[2],i;//存儲要更改的時間數據
rd=0;
if(set==0)
{
flag=1;//時間停止
delayus(500);//去鍵盤按下抖動
if(set==0)
{
delayus(500);
while(!
set);
delayus(500);//去鍵盤抬起抖動
while(!
set);
delayus(500);
setn++;
if(setn==1)
{
write_com(0x80+0x40+12);//將光標移動到秒個位
write_com(0x0f);//顯示光標並且閃爍
}
if(setn==2)
{
write_com(0x80+0x40+9);//將光標移動到分個位
write_com(0x0f);//顯示光標並且閃爍
}
if(setn==3)
{
write_com(0x80+0x40+6);//將光標移動到時個位
write_com(0x0f);//顯示光標並且閃爍
}
if(setn==4)
{
write_com(0x80+15);
write_com(0x0f);
}
if(setn==5)
{
write_com(0x80+12);
write_com(0x0f);
}
if(setn==6)
{
write_com(0x80+9);
write_com(0x0f);
}
if(setn==7)
{
write_com(0x80+6);
write_com(0x0f);
}
if(setn==8)
{
setn=0;
write_ds1302(0x8e,0x00);//關閉寫保護
for(i=0;i<7;i++)
{
write_ds1302(write_add[i],time_dat[i]);
}
write_ds1302(0x8e,0x80);//打開寫保護
flag=0;//時間正常運行
write_com(0x0c);//光標停止閃爍
}
}
}
if(setn!
=0)//更改時間
{
/*if(s1==0)//增加時間
{
delayus(5000);
if(s1==0)
{
while(!
s1);
delayus(5000);//去鍵盤抬起時抖動
while(!
s1);
if(setn==1)
{
time_dat[0]=change_to16(time_dat[0]);
time_dat[0]++;
if(time_dat[0]>=60)
time_dat[0]=0;
{//將秒增加後的值轉換後寫入DS1302秒寄存器
time_dat[0]=change_to10(time_dat[0]);
//write_ds1302(0x8e,0X00);//關閉寫保護
//write_ds1302(write_add[0],time_dat[0]);
//write_ds1302(0x8e,0x80);//打開寫保護
}
write_com(0x80+0x40+11);//將秒增加後的值轉換後寫入1602秒位置
tem[0]=time_dat[0]/16;
tem[1]=time_dat[0]&0x0f;//數據的轉換
write_date(0x30+tem[0]);
write_date(0x30+tem[1]);
write_com(0x80+0x40+12);
}
if(setn==2)
{
time_dat[1]=change_to16(time_dat[1]);
time_dat[1]++;
if(time_dat[1]==60)
time_dat[1]=0;
{
time_dat[1]=change_to10(time_dat[1]);
//write_ds1302(0x8e,0X00);//關閉寫保護
//write_ds1302(write_add[1],time_dat[1]);
//write_ds1302(0x8e,0x80);//打開寫保護
}
write_com(0x80+0x40+8);
tem[0]=time_dat[1]/16;//數據的轉換
tem[1]=time_dat[1]&0x0f;
write_date(0x30+tem[0]);
write_date(0x30+tem[1]);
write_com(0x80+0x40+9);
}
if(setn==3)
{
time_dat[2]=change_to16(time_dat[2]);
time_dat[2]++;
if(time_dat[2]>=24)
time_dat[2]=0;
{
time_dat[2]=change_to10(time_dat[2]);
//write_ds1302(0x8e,0X00);//關閉寫保護
//write_ds1302(write_add[2],time_dat[2]);
//write_ds1302(0x8e,0x80);//打開寫保護
}
write_com(0x80+0x40+5);
tem[0]=time_dat[2]/16;//數據的轉換
tem[1]=time_dat[2]&0x0f;
write_date(0x30+tem[0]);
write_date(0x30+tem[1]);
write_com(0x80+0x40+6);
}
if(setn==4)
{
time_dat[5]=change_to16(time_dat[5]);
time_dat[5]++;
if(time_dat[5]==8)
time_dat[5]=1;
{
time_dat[5]=change_to10(time_dat[5]);
//write_ds1302(0x8e,0X00);//關閉寫保護
//write_ds1302(write_add[5],time_dat[5]);
//write_ds1302(0x8e,0x80);//打開寫保護
}
write_com(0x80+14);
tem[0]=time_dat[5]/16;//數據的轉換
tem[1]=time_dat[5]&0x0f;
write_date(0x30+tem[0]);
write_date(0x30+tem[1]);
write_com(0x80+15);
}
if(setn==5)
{
time_dat[3]=change_to16(time_dat[3]);
time_dat[3]++;
if(time_dat[3]==32)
time_dat[3]=0;
{
time_dat[3]=change_to10(time_dat[3]);
//write_ds1302(0x8E,0X00);//關閉寫保護
//write_ds1302(write_add[3],time_dat[3]);
//write_ds1302(0x8E,0x80);//打開寫保護
}
write_com(0x80+11);
tem[0]=time_dat[3]/16;//數據的轉換
tem[1]=time_dat[3]&0x0f;
write_date(0x30+tem[0]);
write_date(0x30+tem[1]);
write_com(0x80+12);
}
if(setn==6)
{
time_dat[4]=change_to16(time_dat[4]);
time_dat[4]++;
if(time_dat[4]==13)
time_dat[4]=0;
write_com(0x80+8);
{
time_dat[4]=change_to10(time_dat[0]);
//write_ds1302(0x8E,0X00);//關閉寫保護
//write_ds1302(write_add[4],time_dat[4]);
//write_ds1302(0x8E,0x80);//打開寫保護
}
tem[0]=time_dat[4]/16;//數據的轉換
tem[1]=time_dat[4]&0x0f;
write_date(0x30+tem[0]);
write_date(0x30+tem[1]);
write_com(0x80+9);
}
if(setn==7)
{
time_dat[6]=change_to16(time_dat[6]);
time_dat[6]++;
if(time_dat[6]==100)
time_dat[6]=0;
write_com(0x80+5);
{
time_dat[6]=change_to10(time_dat[0]);
//write_ds1302(0x8E,0X00);//關閉寫保護
//write_ds1302(write_add[6],time_dat[6]);
//write_ds1302(0x8E,0x80);//打開寫保護
}
tem[0]=time_dat[6]/16;//數據的轉換
tem[1]=time_dat[6]&0x0f;
write_date(0x30+tem[0]);
write_date(0x30+tem[1]);
write_com(0x80+6);
}
}
}*/
if(s2==0)//減少時間
{
delayus(5000);
if(s2==0)
{
while(!
s2);
delayus(5000);//去鍵盤抬起時抖動
while(!
s2);
if(setn==1)
{
time_dat[0]=change_to16(time_dat[0]);
if(time_dat[0]==0)
time_dat[0]=60;
time_dat[0]--;
{
time_dat[0]=change_to10(time_dat[0]);
}
write_com(0x80+0x40+11);
tem[0]=time_dat[0]/16;//數據的轉換
tem[1]=time_dat[0]&0x0f;
write_date(0x30+tem[0]);
write_date(0x30+tem[1]);
write_com(0x80+0x40+12);
}
if(setn==2)
{
time_dat[1]=change_to16(time_dat[1]);
time_dat[1]--;
if(time_dat[1]==-1)
time_dat[1]=59;
{
time_dat[1]=change_to10(time_dat[1]);
}
write_com(0x80+0x40+8);
tem[0]=time_dat[1]/16;//數據的轉換
tem[1]=time_dat[1]&0x0f;
write_date(0x30+tem[0]);
write_date(0x30+tem[1]);
write_com(0x80+0x40+9);
}
if(setn==3)
{
time_dat[2]=change_to16(time_dat[2]);
if(time_dat[2]!
=0)
time_dat[2]--;
if(time_dat[2]==0)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DS1302C 程序