DS1302+1602+键盘调整+闹钟.docx

上传人:b****8 文档编号:10285604 上传时间:2023-02-09 格式:DOCX 页数:30 大小:44.48KB
下载 相关 举报
DS1302+1602+键盘调整+闹钟.docx_第1页
第1页 / 共30页
DS1302+1602+键盘调整+闹钟.docx_第2页
第2页 / 共30页
DS1302+1602+键盘调整+闹钟.docx_第3页
第3页 / 共30页
DS1302+1602+键盘调整+闹钟.docx_第4页
第4页 / 共30页
DS1302+1602+键盘调整+闹钟.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

DS1302+1602+键盘调整+闹钟.docx

《DS1302+1602+键盘调整+闹钟.docx》由会员分享,可在线阅读,更多相关《DS1302+1602+键盘调整+闹钟.docx(30页珍藏版)》请在冰豆网上搜索。

DS1302+1602+键盘调整+闹钟.docx

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;

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);//月

week=ReadSet1302(0x8b);//星期

nian=ReadSet1302(0x8d);//年

write_sfm(7,miao);//把它们送液晶显示

write_sfm(4,fen);

write_sfm(1,shi);

write_nyr(9,ri);

write_nyr(6,yue);

write_nyr(3,nian);

write_week(week);

}

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1