基于ATMEGA16的DS1302可調(diào)萬年歷程序 作者: 時間:2012-08-06 來源:網(wǎng)絡(luò) 加入技術(shù)交流群 掃碼加入和技術(shù)大咖面對面交流海量資料庫查詢 收藏 void set_rtc(void)//設(shè)置時間(初始化時間){uchar i,k;for(i=0;i7;i++)//將十進(jìn)制轉(zhuǎn)換為16進(jìn)制{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);//去除寫保護(hù)(control寄存器)for(i=0;i7;i++)//對時{write_ds1302(write_add[i],time_data[i]);}write_ds1302(0x8e,0x80);//(wp位置1)加入寫保護(hù)}void read_rtc(void)//讀時鐘{uchar i;for(i=0;i7;i++){time_data[i]=read_ds1302(read_add[i]);//把時鐘放到數(shù)組里}}void time_pro(void)//時間處理函數(shù)(16進(jìn)制轉(zhuǎn)換為十進(jìn)制){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);//去除寫保護(hù)(control寄存器)if(mode==12){value=read_ds1302(0x85);//讀取小時當(dāng)前值value=value|0x80; //將小時數(shù)據(jù)最高位置1write_ds1302(0x84,value);//將置1后的小時數(shù)據(jù)寫入小時寄存器//變?yōu)?2小時格式}if(mode==24){value=read_ds1302(0x85);//讀取小時當(dāng)前值value=value0x7F; //將小時數(shù)據(jù)最高位置0write_ds1302(0x84,value);//將置1后的小時數(shù)據(jù)寫入小時寄存器//變?yōu)?4小時格式}}void int_init(void){MCUCR |= 0x00;MCUCSR|= 0x00;GICR |= 0x40;}#pragma interrupt_handler int0_isr:2void int0_isr(void)//在外部中斷中進(jìn)行時間設(shè)置{uchar i=0,num=0,n=0,m=0,u=0,k=0,j=0,h=0;CLI();//進(jìn)制中斷LCD_init();//清屏showprompt();//顯示提示信息write_ds1302(0x80,0x80);//時鐘停止write_ds1302(0x8e,0x00);//去除寫保護(hù)(control寄存器)while(!(num==4)) //num含義:1(加一),2(選擇),3(設(shè)置),4(確定){ if(key_press()) //檢測是否有按鍵按下{num=key_scan(); //掃描并返回翻譯后的鍵碼if(num==2)//進(jìn)入選擇狀態(tài){i++;switch(i){ case 1://設(shè)置年LCD_init();//清屏nbs設(shè)置年LCD_init();//清屏while(!(n==2))//再次按選擇鍵就進(jìn)入下個項目的設(shè)置{if(key_press()){n=key_scan(); //掃描并返回翻譯后的鍵碼if(n==1)time_data[0]++;//按一下年加一}//以下是時間微調(diào),因為在DS1302中寫入的是BCD碼,所以在實際中//可以用下面的調(diào)整方式,以下只處理到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]);//寫入地址和數(shù)據(jù)time_pro();//時間處理showyear();//顯示年}// break;不用終止程序,當(dāng)程序跳出上邊循環(huán)時,會進(jìn)入下邊程序case 2://月設(shè)置LCD_init();//清屏while(!(m==2))//再次按選擇鍵就進(jìn)入下個項目的設(shè)置{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: //日設(shè)置LCD_init();//清屏while(!(u==2))//再次按選擇鍵就進(jìn)入下個項目的設(shè)置{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: //小時設(shè)置LCD_init();//清屏while(!(k==2))//再次按選擇鍵就進(jìn)入下個項目的設(shè)置{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: //分鐘設(shè)置LCD_init();//清屏while(!(j==2))//再次按選擇鍵就進(jìn)入下個項目的設(shè)置{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 下一頁
評論