基于ATMEGA16的DS1302可调万年历程序 作者: 时间:2012-08-06 来源:网络 加入技术交流群 扫码加入和技术大咖面对面交流海量资料库查询 收藏 void set_rtc(void)//设置时间(初始化时间){uchar i,k;for(i=0;i7;i++)//将十进制转换为16进制{k=time_data[i]/10;//得到十位time_data[i]=time_data[i]%10;//得到个位time_data[i]=time_data[i]+k*16;//变成BCD码}write_ds1302(0x8e,0x00);//去除写保护(control寄存器)for(i=0;i7;i++)//对时{write_ds1302(write_add[i],time_data[i]);}write_ds1302(0x8e,0x80);//(wp位置1)加入写保护}void read_rtc(void)//读时钟{uchar i;for(i=0;i7;i++){time_data[i]=read_ds1302(read_add[i]);//把时钟放到数组里}}void time_pro(void)//时间处理函数(16进制转换为十进制){table[0]=time_data[6]%16;//显示秒个位table[1]=time_data[6]/16;//显示秒十位table[2]=time_data[5]%16;//显示分个位table[3]=time_data[5]/16;//显示分十位table[4]=time_data[4]%16;//显示小时个位table[5]=time_data[4]/16;//显示小时十位table[6]=time_data[3]%16;//显示日个位table[7]=time_data[3]/16;//显示日十位table[8]=time_data[2]%16;//显示月个位table[9]=time_data[2]/16;//显示月十位table[10]=time_data[1]%16;//显示星期table[12]=time_data[0]%16;//显示年个位table[13]=time_data[0]/16;//显示年十位}void hour_mode(uchar mode)//mode为12时为12小时格式,为24时为24小时格式{uint value;write_ds1302(0x8e,0x00);//去除写保护(control寄存器)if(mode==12){value=read_ds1302(0x85);//读取小时当前值value=value|0x80; //将小时数据最高位置1write_ds1302(0x84,value);//将置1后的小时数据写入小时寄存器//变为12小时格式}if(mode==24){value=read_ds1302(0x85);//读取小时当前值value=value0x7F; //将小时数据最高位置0write_ds1302(0x84,value);//将置1后的小时数据写入小时寄存器//变为24小时格式}}void int_init(void){MCUCR |= 0x00;MCUCSR|= 0x00;GICR |= 0x40;}#pragma interrupt_handler int0_isr:2void int0_isr(void)//在外部中断中进行时间设置{uchar i=0,num=0,n=0,m=0,u=0,k=0,j=0,h=0;CLI();//进制中断LCD_init();//清屏showprompt();//显示提示信息write_ds1302(0x80,0x80);//时钟停止write_ds1302(0x8e,0x00);//去除写保护(control寄存器)while(!(num==4)) //num含义:1(加一),2(选择),3(设置),4(确定){ if(key_press()) //检测是否有按键按下{num=key_scan(); //扫描并返回翻译后的键码if(num==2)//进入选择状态{i++;switch(i){ case 1://设置年LCD_init();//清屏nbs设置年LCD_init();//清屏while(!(n==2))//再次按选择键就进入下个项目的设置{if(key_press()){n=key_scan(); //扫描并返回翻译后的键码if(n==1)time_data[0]++;//按一下年加一}//以下是时间微调,因为在DS1302中写入的是BCD码,所以在实际中//可以用下面的调整方式,以下只处理到60年if(time_data[0]==0x0a){time_data[0]=0x10;}if(time_data[0]==0x1a){time_data[0]=0x20;}if(time_data[0]==0x2a){time_data[0]=0x30;}if(time_data[0]==0x3a){time_data[0]=0x40;}if(time_data[0]==0x4a){time_data[0]=0x50;}write_ds1302(write_add[0],time_data[0]);//写入地址和数据time_pro();//时间处理showyear();//显示年}// break;不用终止程序,当程序跳出上边循环时,会进入下边程序case 2://月设置LCD_init();//清屏while(!(m==2))//再次按选择键就进入下个项目的设置{if(key_press()){m=key_scan(); //扫描并返回翻译后的键码if(m==1)time_data[2]++;//按一下月加一if(time_data[2]==0x13)//一年有12个月time_data[2]=1;}//BCD码处理if(time_data[2]==0x0a){time_data[2]=0x10;}if(time_data[2]==0x1a){time_data[2]=0x20;} write_ds1302(write_add[2],time_data[2]);time_pro();//时间处理showmonth();//显示月}//break;case 3: //日设置LCD_init();//清屏while(!(u==2))//再次按选择键就进入下个项目的设置{if(key_press()){u=key_scan(); //扫描并返回翻译后的键码if(u==1)time_data[3]++;//按一下日加一if(time_data[3]==0x32)//一个月最多有31天time_data[3]=1;}//BCD码处理if(time_data[3]==0x0a){time_data[3]=0x10;}if(time_data[3]==0x1a){time_data[3]=0x20;} if(time_data[3]==0x2a){time_data[3]=0x30;} write_ds1302(write_add[3],time_data[3]);time_pro();//时间处理showdaytime();//显示日}//break;case 4: //小时设置LCD_init();//清屏while(!(k==2))//再次按选择键就进入下个项目的设置{if(key_press()){k=key_scan(); //扫描并返回翻译后的键码if(k==1)time_data[4]++;//按一下小时加一if(time_data[4]==0x25)//一天24小时time_data[4]=1;}//BCD码处理if(time_data[4]==0x0a){time_data[4]=0x10;}if(time_data[4]==0x1a){time_data[4]=0x20;} write_ds1302(write_add[4],time_data[4]);time_pro();//时间处理showhour();//显示小时} //break; case 5: //分钟设置LCD_init();//清屏while(!(j==2))//再次按选择键就进入下个项目的设置{if(key_press()){j=key_scan(); //扫描并返回翻译后的键码if(j==1)time_data[5]++;//按一下分钟加一if(time_data[5]==0x5a)//一小时60分钟time_data[5]=0x00;}//BCD码处理if(time_data[5]==0x0a){time_data[5]=0x10;}if(time_data[5]==0x1a){time_data[5]=0x20;}if(time_data[5]==0x2a){time_data[5]=0x30;}if(time_data[5]==0x3a){time_data[5]=0x40;}if(time_data[5]==0x4a){time_data[5]=0x50;}if(time_data[5]==0x5a){time_data[5]=0x60;} write_ds1302(write_add[5],time_data[5]);time_pro();//时间处理showminute();//显示分钟} 上一页 1 2 3 下一页
评论