DS1302+1602+键盘调整+闹钟.docx
《DS1302+1602+键盘调整+闹钟.docx》由会员分享,可在线阅读,更多相关《DS1302+1602+键盘调整+闹钟.docx(29页珍藏版)》请在冰豆网上搜索。
DS1302+1602+键盘调整+闹钟
DS1302+1602+键盘调整+闹钟
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
//定义的的4个键盘
sbits1=P3^0;//时钟功能键
sbits2=P3^1;//加键
sbits3=P3^2;//减键
sbits4=P3^6;//确认键
sbits5=P3^3;//闹钟功能键
sbitdula=P2^6;//数码管操作
sbitwela=P2^7;
sbitlcden=P2^5;//液晶操作
sbitlcdrs=P1^0;
sbitlcdrw=P1^1;
sbitrd=P3^7;//为了分离出3个独立键盘
sbitFM=P2^3;//蜂鸣器口
sbitACC0=ACC^0;//累加器喂ACC这是位定义
sbitACC7=ACC^7;
sbitsclk=P2^1;//DS1302操作
sbitdata1=P2^0;
sbitrst=P2^4;
uchars1num,flag1,flag2,s5num;
intmiao,shi,fen,nian,yue,ri,week,afen,ashi;
intx1,x2;
ucharcodetable1[]="SUN";//星期字表
ucharcodetable2[]="MON";
ucharcodetable3[]="TUE";
ucharcodetable4[]="WED";
ucharcodetable5[]="THU";
ucharcodetable6[]="FRI";
ucharcodetable7[]="SAT";
voiddelayms(uintxms)//延时函数
{
uintx,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
voiddi()//蜂鸣器函数
{
FM=0;
delayms(100);
FM=1;
}
voidcmg88()//关数码管函数
{
dula=1;
P0=0x00;
dula=0;
}
voidwrite_com(ucharcom)//液晶写命令函数
{
lcdrs=0;
lcden=0;
P0=com;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
voidwrite_date(uchardate)//液晶写数据函数
{
lcdrs=1;
lcden=0;
P0=date;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
voidWrite1302(uchardat)//向1302写一个字节数据
{
uchari;
ACC=dat;
for(i=8;i>0;i--)
{
data1=ACC0;
sclk=1;
sclk=0;
ACC=ACC>>1;
}
}
voidWriteSet1302(ucharCmd,uchardat)//根据命令,向1302写一个字节数据
{
rst=0;
_nop_();
sclk=0;
_nop_();
rst=1;
delayms
(2);
Write1302(Cmd);
Write1302(dat);
sclk=1;
rst=0;
}
ucharRead1302()//向1302读一个字节数据
{
uchari;
for(i=8;i>0;i--)
{
ACC=ACC>>1;
ACC7=data1;
sclk=1;
sclk=0;
}
return(ACC);
}
ucharReadSet1302(ucharCmd)//根据命令,向1302读一个字节数据
{
uchardat;
rst=0;
sclk=0;
rst=1;
Write1302(Cmd);
dat=Read1302();
sclk=1;
rst=0;
return(dat);
}
voidinital_1302()//初始化DS1302函数
{
WriteSet1302(0x8e,0x00);//禁止写保护
WriteSet1302(0x90,0xaa);//定义充电
WriteSet1302(0x80,0x45);//秒
WriteSet1302(0x84,0x18);//时
WriteSet1302(0x82,0x47);//分
WriteSet1302(0x8c,0x16);//年
WriteSet1302(0x88,0x05);//月
WriteSet1302(0x86,0x23);//日
WriteSet1302(0x8a,0x01);//星期
WriteSet1302(0xc0,0x07);//闹钟小时初始化
WriteSet1302(0xfc,0x30);//闹钟分钟初始化
WriteSet1302(0x8e,0x80);//开写保护
}
voidwrite_sfm(ucharadd,uchardat)//时分秒函数
{
uchargw,sw;
gw=dat%16;
sw=dat/16;
write_com(0x80+0x40+add);
write_date(sw+0x30);
write_date(gw+0x30);
}
voidwrite_nyr(ucharadd,uchardat)//年月日函数
{
uchargw,sw;
gw=dat%16;
sw=dat/16;
write_com(0x80+add);
write_date(sw+0x30);
write_date(gw+0x30);
}
voidwrite_week(ucharxq)//写星期函数
{
ucharx;
write_com(0x80+12);
switch(xq)
{
case1:
for(x=0;x<3;x++)
{
write_date(table1[x]);
}
break;
case2:
for(x=0;x<3;x++)
{
write_date(table2[x]);
}
break;
case3:
for(x=0;x<3;x++)
{
write_date(table3[x]);
}
break;
case4:
for(x=0;x<3;x++)
{
write_date(table4[x]);
}
break;
case5:
for(x=0;x<3;x++)
{
write_date(table5[x]);
}
break;
case6:
for(x=0;x<3;x++)
{
write_date(table6[x]);
}
break;
case7:
for(x=0;x<3;x++)
{
write_date(table7[x]);
}
break;
}
write_com(0x80+12);
}
voidinit()//初始化操作
{
flag1=0;
flag2=0;
rd=0;
dula=0;
wela=0;
lcdrw=0;
lcden=0;
fen=0;
miao=0;
shi=0;
week=0;
nian=0;
yue=0;
ri=0;
s1num=0;
s5num=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80+1);//在液晶上写一些固定的数
write_date('2');
write_date('0');
delayms(5);
write_com(0x80+5);//在液晶上写一些固定的数
write_date('-');
delayms(5);
write_com(0x80+8);
write_date('-');
delayms(5);
write_com(0x80+0x40+3);//时间部分的两个冒号
write_date(':
');
delayms(5);
write_com(0x80+0x40+6);
write_date(':
');
delayms(5);
write_com(0x80+0x40+12);
write_date(':
');
delayms(5);
}
voidkeyscan()//键盘扫描操作
{
if(s1==0&&s5num==0)//时钟功能键并且闹钟不处于调整状态
{
delayms(5);
if(s1==0&&s5num==0)
{
s1num++;
flag1=1;
while(!
s1);
di();
switch(s1num)
{
case1:
write_com(0x80+0x40+8);
write_com(0x0f);//光标闪烁
break;
case2:
write_com(0x80+0x40+5);
break;
case3:
write_com(0x80+0x40+2);
break;
case4:
write_com(0x80+14);
break;
case5:
write_com(0x80+10);
break;
case6:
write_com(0x80+7);
break;
case7:
write_com(0x80+4);
break;
case8:
flag1=0;
s1num=0;
write_com(0x0c);
WriteSet1302(0x8e,0x00);//第八次按时钟功能键后,把调整了的所有数据当前状态存入到DS1302中
WriteSet1302(0x80,miao);
WriteSet1302(0x84,shi);
WriteSet1302(0x82,fen);
WriteSet1302(0x8a,week);
WriteSet1302(0x8c,nian);
WriteSet1302(0x88,yue);
WriteSet1302(0x86,ri);
WriteSet1302(0x8e,0x80);
break;
}
}
}
if(s1num!
=0&&s5num==0)//时钟加键
{
if(s2==0)
{
delayms(5);
if(s2==0)
{
while(!
s2);
di();
switch(s1num)
{
case1:
x1=miao%16;
x2=miao/16;
x1++;
if(x1==10)
{
x1=0;
x2++;
if(x2>=6)
x2=0;
}
miao=x1+x2*16;
write_sfm(7,miao);
write_com(0x80+0x40+8);
break;
case2:
x1=fen%16;
x2=fen/16;
x1++;
if(x1==10)
{
x1=0;
x2++;
if(x2>=6)
x2=0;
}
fen=x1+x2*16;
write_sfm(4,fen);
write_com(0x80+0x40+5);
break;
case3:
x1=shi%16;
x2=shi/16;
x1++;
if(x1==10)
{
x1=0;
x2++;
}
if(x2>=2&&x1>=4)
{
x1=0;
x2=0;
}
shi=x1+x2*16;
write_sfm(1,shi);
write_com(0x80+0x40+2);
break;
case4:
x1=(week)%10;
x2=(week)/10;
x1++;
if(x1==8)
x1=1;
week=x2*16+x1;
write_week(week);
write_com(0x80+14);
break;
case5:
x1=ri%16;
x2=ri/16;
x1++;
if(x1==10)
{
x1=0;
x2++;
}
if(x2==3&&x1==2)
{
x1=0;
x2=0;
}
ri=x1+x2*16;
write_nyr(9,ri);
write_com(0x80+10);
break;
case6:
x1=yue%16;
x2=yue/16;
x1++;
if(x2==1&&x1==3)
{
x1=1;
x2=0;
}
if(x1==10)
{
x1=0;
x2++;
}
yue=x1+x2*16;
write_nyr(6,yue);
write_com(0x80+7);
break;
case7:
x1=nian%16;
x2=nian/16;
x1++;
if((x2==9)&&(x1==10))
{
x1=0;
x2=0;
}
if(x1==10)
{
x2++;
x1=0;
}
nian=x1+x2*16;
write_nyr(3,nian);
write_com(0x80+4);
break;
}
}
}
if(s3==0)//时钟减键
{
delayms(5);
if(s3==0)
{
while(!
s3);
di();
switch(s1num)
{
case1:
x1=miao%16;
x2=miao/16;
x1--;
if(x1==-1)
{
x1=9;
x2--;
if(x2==-1)
x2=5;
}
miao=x1+x2*16;
write_sfm(7,miao);
write_com(0x80+0x40+8);
break;
case2:
x1=fen%16;
x2=fen/16;
x1--;
if(x1==-1)
{
x1=9;
x2--;
if(x2==-1)
x2=5;
}
fen=x1+x2*16;
write_sfm(4,fen);
write_com(0x80+0x40+5);
break;
case3:
x1=shi%16;
x2=shi/16;
x1--;
if(x1==-1)
{
x1=9;
x2--;
if(x2==-1)
{
x1=3;
x2=2;
}
}
shi=x1+x2*16;
write_sfm(1,shi);
write_com(0x80+0x40+2);
break;
case4:
x1=(week)%10;
x2=(week)/10;
x1--;
if(x1==0)
x1=7;
week=x2*16+x1;
write_week(week);
write_com(0x80+14);
break;
case5:
x1=ri%16;
x2=ri/16;
x1--;
if(x1==-1)
{
x1=9;
x2--;
if(x2==-1)
{
x1=1;
x2=3;
}
}
ri=x1+x2*16;
write_nyr(9,ri);
write_com(0x80+10);
break;
case6:
x1=yue%16;
x2=yue/16;
x1--;
if((x2==1)&&(x1==-1))
{
x1=9;
x2--;
}
if((x2==0)&&(x1==0))
{
x1=2;
x2=1;
}
yue=x1+x2*16;
write_nyr(6,yue);
write_com(0x80+7);
break;
case7:
x1=nian%16;
x2=nian/16;
x1--;
if(x1==-1)
{
x1=9;
x2--;
if(x2==-1)
{
x1=9;
x2=9;
}
}
nian=x1+x2*16;
write_nyr(3,nian);
write_com(0x80+4);
break;
}
}
}
}
if(s1num!
=0||s5num!
=0)//表示时钟或者闹钟处于调整状态
{
if(s4==0)//确定状态的按键
{
delayms(5);
if(s4==0)
{
if(s1num!
=0)//表示时钟处于调整状态
{
while(!
s4);//确定键被按下
di();
WriteSet1302(0x8e,0x00);//按了确认键后,把调整了的所有数据当前状态存入到DS1302中
WriteSet1302(0x80,miao);
WriteSet1302(0x84,shi);
WriteSet1302(0x82,fen);
WriteSet1302(0x8a,week);
WriteSet1302(0x8c,nian);
WriteSet1302(0x88,yue);
WriteSet1302(0x86,ri);
WriteSet1302(0x8e,0x80);
flag1=0;
write_com(0x0c);
s1num=0;
}
if(s5num!
=0)//表示闹钟处于调整状态
{
while(!
s4);
di();
WriteSet1302(0x8e,0x00);//调整闹钟,不能让时钟暂停,故没把时钟数据写入DS1302中
WriteSet1302(0xc0,ashi);//把闹钟数据写入DS1302中
WriteSet1302(0xfc,afen);
WriteSet1302(0x8e,0x80);
flag2=0;
s5num=0;
write_com(0x0c);
}
}
}
}
if(s5==0&&s1num==0)//闹钟功能键并且时钟不处于调整状态
{
delayms(5);
if(s5==0&&s1num==0)
{
s5num++;
flag2=1;
while(!
s5);
di();
if(s5num==1)
{
write_com(0x80+0x40+14);
write_com(0x0f);
}
if(s5num==2)
{
write_com(0x80+0x40+11);
}
if(s5num==3)
{
s5num=0;
flag2=0;
WriteSet1302(0x8e,0x00);
WriteSet1302(0xfc,afen);
WriteSet1302(0xc0,ashi);
WriteSet1302(0x8e,0x80);
write_com(0x0c);
}
}
}
if(s5num!
=0&&s1num==0)//只有闹钟处于调整状态
{
if(s2==0)//闹钟加键
{
delayms(5);
if(s2==0)
{
while(!
s2);
di();
if(s5num==1)
{
x1=afen%16;
x2=afen/16;
x1++;
if(x1==10)
{
x1=0;
x2++;
if(x2>=6)
x2=0;
}
afen=x1+x2*16;
write_sfm(13,afen);
write_com(0x80+0x40+14);
}
if(s5num==2)
{
x1=ashi%16;
x2=ashi/16;
x1++;
if(x2>=2&&x1>=4)
{
x1=0;
x2=0;
}
if(x1==10)
{
x1=0;
x2++;
}
ashi=x1+x2*16;
write_sfm(10,ashi);
write_com(0x80+0x40+11);
}
}
}
}
if(s3==0)//闹钟减键
{
delayms(5);
if(s3==0)
{
while(!
s3);
di();
if(s5num==1)
{
x1=afen%16;
x2=afen/16;
x1--;
if(x1==-1)
{
x1=9;
x2--;
if(x2==-1)
x2=5;
}
afen=x1+x2*16;
write_sfm(13,afen);
write_com(0x80+0x40+14);
}
if(s5num==2)
{
x1=ashi%16;
x2=ashi/16;
x1--;
if(x1==-1)
{
x1=9;
x2--;
if(x2==-1)
{
x1=3;
x2=2;
}
}
ashi=x1+x2*16;
write_sfm(10,ashi);
write_com(0x80+0x40+11);
}
}
}
}
voidlaba()
{
if((shi==ashi)&&(fen==afen)&&(miao<=60&&miao>=0))
{
di();
}
}
voidmain()//主函数
{
init();//大初始化
cmg88();//关数码管函数
inital_1302();//DS1302赋初值的初始化
ashi=ReadSet1302(0xc1);//从DS1302读出数据
afen=ReadSet1302(0xfd);
write_sfm(10,ashi);//读出数据送给液晶显示
write_sfm(13,afen);
while
(1)
{
keyscan();
laba();
if(flag1==0&&flag2==0)//经过一系列调整后,最终继续满足这个条件
{//从DS1302读数据
miao=ReadSet1302(0x81);//秒
fen=ReadSet1302(0x83);//分
shi=ReadSet1302(0x85);//时
ri=ReadSet1302(0x87);//日
yue=ReadSet1302(0x89);