我的时钟程序是:
/******************************/
//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
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |