我的时钟程序是: /******************************/ //DS1302+数码管+3个独立按键 // // 精确定时 // // Author: matrix // // TIME:2009/3/13 // /******************************/ /****************************************************************/ // 利用ds1302精确定时,同时按键可调时间。 // // 每操作一次时钟,都会有蜂鸣器响大约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)//数码管动态显示 { 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) //写入到数码管 { 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;//将秒转化成bcd码,没这句秒就变化,不知为什么 write_1302 (0x8e,0x00); //禁止写保护 write_1302 (0x80,0x80|temp); //时钟暂停 write_1302 (0x8e,0x80); //允许写保护 break; case 2 :didi(); break; case 3 :didi(); break; case 4 :didi(); temp=miao/10*16+miao%10; write_1302 (0x8e,0x00); //禁止写保护 write_1302 (0x80,0x00|temp);//时钟开始 write_1302 (0x8e,0x80); //允许写保护 break; } } }
if(key1n!=0) //当按下功能键后,才执行以下加减键 { 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); //禁止写保护 write_1302 (0x80,0x80|temp); write_1302 (0x8e,0x80); //允许写保护 break; case 2 : didi(); //分 temp=(fen+1)/10*16+(fen+1)%10; if(fen==59) temp=0; write_1302 (0x8e,0x00); //禁止写保护 write_1302 (0x82,temp); write_1302 (0x8e,0x80); //允许写保护 break; case 3 : didi(); temp=(shi+1)/10*16+(shi+1)%10; //时 if(shi==23) temp=0; write_1302 (0x8e,0x00); //禁止写保护 write_1302 (0x84,temp); write_1302 (0x8e,0x80); //允许写保护 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); //禁止写保护 write_1302 (0x80,0x80|temp); write_1302 (0x8e,0x80); //允许写保护 break; case 2 :didi(); temp=(fen-1)/10*16+(fen-1)%10; //分 if(fen==0) temp=89; write_1302 (0x8e,0x00); //禁止写保护 write_1302 (0x82,temp); write_1302 (0x8e,0x80); //允许写保护 break; case 3 :didi(); temp=(shi-1)/10*16+(shi-1)%10; //时 if(shi==0) temp=35; write_1302 (0x8e,0x00); //禁止写保护 write_1302 (0x84,temp); write_1302 (0x8e,0x80); //允许写保护 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 |