新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 基于ATMEGA16的DS1302可調(diào)萬年歷程序

基于ATMEGA16的DS1302可調(diào)萬年歷程序

作者: 時間:2012-08-06 來源:網(wǎng)絡(luò) 收藏
//break;case 6: //星期設(shè)置LCD_init();//清屏while(!(h==2))//再次按選擇鍵就進入下個項目的設(shè)置{if(key_press()){h=key_scan(); //掃描并返回翻譯后的鍵碼if(h==1)time_data[1]++;//按一下小時加一if(time_data[1]==0x08)//一天24小時time_data[1]=1;}write_ds1302(write_add[2],time_data[2]);time_pro();//時間處理showweek();//顯示星期} default:LCD_init();//清屏showmessage();break;} }}}write_ds1302(0x8e,0x80);//(wp位置1)加入寫保護write_ds1302(0x80,0x00);//時鐘開始LCD_init();//清屏SEI();}key.c:#include iom16v.h>#include macros.h>#include "delay.h"#define uchar unsigned char#define uintn月設(shè)置LCD_init();//清屏while(!(m==2))//再次按選擇鍵就進入下個項目的設(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))//再次按選擇鍵就進入下個項目的設(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))//再次按選擇鍵就進入下個項目的設(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))//再次按選擇鍵就進入下個項目的設(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();//顯示分鐘} //break;case 6: //星期設(shè)置LCD_init();//清屏while(!(h==2))//再次按選擇鍵就進入下個項目的設(shè)置{if(key_press()){h=key_scan(); //掃描并返回翻譯后的鍵碼if(h==1)time_data[1]++;//按一下小時加一if(time_data[1]==0x08)//一天24小時time_data[1]=1;}write_ds1302(write_add[2],time_data[2]);time_pro();//時間處理showweek();//顯示星期} default:LCD_init();//清屏showmessage();break;} }}}write_ds1302(0x8e,0x80);//(wp位置1)加入寫保護write_ds1302(0x80,0x00);//時鐘開始LCD_init();//清屏SEI();}key.c:#include iom16v.h>#include macros.h>#include "delay.h"#define uchar unsigned char#define uint unsigned intuchar key_press()//判斷按鍵是否被按下(按下返回1,沒按下返回0){ uchar j;DDRD|=0X0F;//低四位為輸出PORTD|=0X0F;//低四位輸出低電平DDRD=0XF0;//低四位為輸入j=PIND;//讀一下輸入寄存器j=0X0F;//屏蔽高四位if(j==0X0F)//如果j沒變化,則返回0,否則返回1{return 0;}else{return 1;}}uchar key_scan()//按鍵掃描函數(shù){ uchar key;delay(10);if(key_press())//有按鍵按下時key_press()的值為1{key=PIND;//讀取PIND值key=0X0F;//去掉高4位switch(key)//開關(guān)語句,用于判斷{case 0X0E://1110連接PD0的按鍵按下key=1;break;case 0X0D://1101連接PD1的按鍵按下key=2;break; case 0X0B://1011連接PD2的按鍵按下key=3;break;case 0X07://0111連接PD3的按鍵按下key=4;break;default://都不是時隨便返回一個值key=16; }while(key_press());//在按鍵按下時執(zhí)行完上邊的程序后就執(zhí)行此循環(huán)//當(dāng)按鍵松開時就跳出循環(huán),目的是按一下就執(zhí)行一次程序}else//沒有按下時隨便返回一個值{key=16;}return key;}

程序未完,完整代碼下載: http://www.51hei.com/f/1302cc.rar


上一頁 1 2 3 下一頁

關(guān)鍵詞: ATMEGA16 DS1302 可調(diào)萬年歷

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉