您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 酒店餐饮 > DS1302+1602+键盘调整+闹钟
#includereg52.h#includeintrins.h#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;x0;x--)for(y=110;y0;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;i0;i--){data1=ACC0;sclk=1;sclk=0;ACC=ACC1;}}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;i0;i--){ACC=ACC1;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;x3;x++){write_date(table1[x]);}break;case2:for(x=0;x3;x++){write_date(table2[x]);}break;case3:for(x=0;x3;x++){write_date(table3[x]);}break;case4:for(x=0;x3;x++){write_date(table4[x]);}break;case5:for(x=0;x3;x++){write_date(table5[x]);}break;case6:for(x=0;x3;x++){write_date(table6[x]);}break;case7:for(x=0;x3;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;
本文标题:DS1302+1602+键盘调整+闹钟
链接地址:https://www.777doc.com/doc-4516513 .html