我的時鐘程序是: /******************************/ //DS1302+數(shù)碼管+3個獨(dú)立按鍵 // // 精確定時 // // Author: matrix // // TIME:2009/3/13 // /******************************/ /****************************************************************/ // 利用ds1302精確定時,同時按鍵可調(diào)時間。 // // 每操作一次時鐘,都會有蜂鳴器響大約200ms,以提示操作。 // /***************************************************************/ #include<reg52.h> #include"ds1302.h" uchar code tab[]={ 0x3F,/*0*/ 0x06,/*1*/ 0x5B,/*2*/ 0x4F,/*3*/ 0x66,/*4*/ 0x6D,/*5*/ 0x7D,/*6*/ 0x07,/*7*/ 0x7F,/*8*/ 0x6F,/*9*/ } ;//共陰碼 void delay(uint xms) { uint x,y; for(x=xms;x>0;x--) for(y=110;y>0;y--);
}
void init()//初始化 { //RST=0; //SCLK=0; //write_1302(0x80,0x00);//寫控制字,允許寫 //write_1302(0x90,0x00);//禁止渦流充電 TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; }
void display(uchar miaog,uchar miaos,uchar feng,uchar fens,uchar shig,uchar shis)//數(shù)碼管動態(tài)顯示 { P2=0x7f; P0=tab[miaog]; delay(5); P2=0xbf; P0=tab[miaos]; delay(5); P2=0xdf; P0=0xc0; delay(5); P2=0xef; P0=tab[feng]; delay(5); P2=0xf7; P0=tab[fens]; delay(5); P2=0xfb; P0=0xc0; delay(5); P2=0xfd; P0=tab[shig]; delay(5); P2=0xfe; P0=tab[shis]; delay(5);
} write_sfm(uchar miao,uchar fen,uchar shi) //寫入到數(shù)碼管 { uchar miaog,miaos,feng,fens,shig,shis; miaog=miao%10; miaos=miao/10; feng=fen%10; fens=fen/10; shig=shi%10; shis=shi/10; display(miaog,miaos,feng,fens,shig,shis); } void didi() {
buzzer=0; delay(50); buzzer=1;
} void keyscan() { uchar temp; if(key1==0) //功能鍵 { if(key1==0) { while(!key1); key1n=key1n++; if(key1n==5) key1n=1; switch(key1n) { case 1:didi(); temp=(miao)/10*16+(miao)%10;//將秒轉(zhuǎn)化成bcd碼,沒這句秒就變化,不知為什么 write_1302 (0x8e,0x00); //禁止寫保護(hù) write_1302 (0x80,0x80|temp); //時鐘暫停 write_1302 (0x8e,0x80); //允許寫保護(hù) break; case 2 :didi(); break; case 3 :didi(); break; case 4 :didi(); temp=miao/10*16+miao%10; write_1302 (0x8e,0x00); //禁止寫保護(hù) write_1302 (0x80,0x00|temp);//時鐘開始 write_1302 (0x8e,0x80); //允許寫保護(hù) break; } } }
if(key1n!=0) //當(dāng)按下功能鍵后,才執(zhí)行以下加減鍵 { if(key2==0) //加鍵 { delay(3); if(key2==0) { while(!key2); switch(key1n) { case 1 : didi(); //秒 temp=(miao+1)/10*16+(miao+1)%10; if(miao==59) temp=0; write_1302 (0x8e,0x00); //禁止寫保護(hù) write_1302 (0x80,0x80|temp); write_1302 (0x8e,0x80); //允許寫保護(hù) break; case 2 : didi(); //分 temp=(fen+1)/10*16+(fen+1)%10; if(fen==59) temp=0; write_1302 (0x8e,0x00); //禁止寫保護(hù) write_1302 (0x82,temp); write_1302 (0x8e,0x80); //允許寫保護(hù) break; case 3 : didi(); temp=(shi+1)/10*16+(shi+1)%10; //時 if(shi==23) temp=0; write_1302 (0x8e,0x00); //禁止寫保護(hù) write_1302 (0x84,temp); write_1302 (0x8e,0x80); //允許寫保護(hù) break; } } } if(key3==0) //減鍵 { delay(3); if(key3==0) { while(!key3); switch(key1n) { case 1 :didi(); temp=(miao-1)/10*16+(miao-1)%10; //秒 if(miao==0) temp=89; write_1302 (0x8e,0x00); //禁止寫保護(hù) write_1302 (0x80,0x80|temp); write_1302 (0x8e,0x80); //允許寫保護(hù) break; case 2 :didi(); temp=(fen-1)/10*16+(fen-1)%10; //分 if(fen==0) temp=89; write_1302 (0x8e,0x00); //禁止寫保護(hù) write_1302 (0x82,temp); write_1302 (0x8e,0x80); //允許寫保護(hù) break; case 3 :didi(); temp=(shi-1)/10*16+(shi-1)%10; //時 if(shi==0) temp=35; write_1302 (0x8e,0x00); //禁止寫保護(hù) write_1302 (0x84,temp); write_1302 (0x8e,0x80); //允許寫保護(hù) break; } } } } //write_1302(0x80,miao|0x80); //miao++; /* if(key2==0) { if(key2==0) { while(!key2); write_1302(0x80,miao|0x00);//打開1302振蕩器 }
} */ } void main() { init(); //buzzer=0; //miao=20; //fen=10; //shi=23; while(1) { miao = BCD_Decimal(read_1302(0x81)); fen = BCD_Decimal(read_1302(0x83)); shi = BCD_Decimal(read_1302(0x85)); keyscan(); } } void tiemr0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; write_sfm(miao,fen,shi); }
麻煩各位大俠,幫忙加入一個鬧鐘程序! 可以的話,加我Q:770617514 請賜教! 本文來自: 電子工程師之家http://www.eehome.cn |