//我这里有一个定时的闹钟,你把蜂鸣器的中断改为LED就行了,可以通过P2^0--P2^3实现秒表的显示和以及调时调分和调节闹钟以及闹钟的开关,有问题可以给我留言QQ834589429
#include<> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
code unsigned char tab[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//共阴数码管 0-9
sbit A1=P2^0;
sbit A2=P2^1;
sbit A3=P2^2;
sbit A4=P2^3;
sbit beep=P1^4;
unsigned char Shiwan;
unsigned char Wanwei;
unsigned char Qianwei;
unsigned char Baiwei;
unsigned char Shiwei;//定义十位
unsigned char Gewei,Naoling1,Naoling2,Naoling3,Naoling4; //定义个位
static unsigned char hour=12,minute=30,second=0,count=0;
static unsigned char alarmhour=12,alarmminute=29,i=0,j=0,k;
/******************************************************************/
/* 延时函数 */
/******************************************************************/
void delay(unsigned int cnt)
{
while(--cnt);
}
void xianshi(void)
{
Gewei=tab[second%10]; //个位显示处理
Shiwei=tab[second/10];//十位显示值处理
if(second%2==0)
{
Baiwei=tab[minute%10];
Qianwei=tab[minute/10];// 千位
}
else
{
Baiwei=(tab[minute%10]|0x80);//百位显示处理:加点的字码
Qianwei=(tab[minute/10]|0x80);
}
if(second%2!=0)
{
Wanwei=tab[hour%10];
Shiwan=tab[hour/10];
}
else
{
Wanwei=(tab[hour%10]|0x80);
Shiwan=(tab[hour/10]|0x80);
}
Naoling1=~tab[alarmhour%10];
Naoling2=~tab[alarmhour/10];
Naoling3=~tab[alarmminute%10];
Naoling4=~tab[alarmminute/10];
}
void timer0() interrupt 3 using 1
{
TH1=0x3c; //中断设置初始化
TL1=0xb0;
if(alarmhour==hour&&alarmminute==minute&&j==1)
{
beep=0;
}
}
/******************************************************************/
/* 定时器中断函数 */
/******************************************************************/
void timer1() interrupt 1 using 0
{
TH0=0xd8; //重新赋值
TL0=0xf0;
count++;
xianshi();
if (count==99) //100x10ms=1S,大致延时时间
{
count=0;
second++; //秒加1
if(second==60)
minute++;
{
if(second==60)
second=0;
{
if(minute==60)
hour++;
{
if(minute==60)
minute=0;
{
if(hour==24)
hour=0;
}
}
}
}
}
}
/******************************************************************/
/* 主函数 */
/******************************************************************/
void main()
{
TMOD |=0x01;//定时器设置 10ms in 12M crystal,工作在模式1,16位定时
TH0=0xd8;
TL0=0xf0;
IE= 0x82; //打开中断
TR0=1; //打开定时开关
xianshi();
EA=1;ET0=1;TMOD |=0x21;TR0=1; //开中断总开关,计数器0允许中断,设置中断模式,启动计数器0
ET1=1;TR1=1;
while(1)
{
{
if(!A3)
{
delay(10000);
if(!A3)
{
i++;if(i==7)i=0;
xianshi();
}
}
}
{
if(!A4)
{
delay(10000);
if(!A4)
{
i--;if(i==255)i=6;
xianshi();
}
}
}
switch(i)
{
case 0: //正常显示控制
{
P1=0x1e; //片选个位
P0=~Baiwei; //显示个位
delay(300); //短暂延时
P1=0x1d; //片选十位
P0=~Qianwei;//显示十位
delay(300); //短暂延时
P1=0x1b; //片选百位
P0=~Wanwei; //显示百位
delay(300); //短暂延时
P1=0x17; //片选千位
P0=~Shiwan; //显示千位
delay(300); //短暂延时
P1=0x1f;
P0=0xff;
delay(300);
} ;break;
case 1: //调分控制
{
if(second%2!=0)
{
P1=0x1e; //片选个位
P0=~Baiwei; //显示个位
delay(300); //短暂延时
P1=0x1d; //片选十位
P0=~Qianwei;//显示十位
delay(300); //短暂延时
P1=0x1f;
P0=0xff;
delay(300);
}
else
delay(300);
delay(300);
{
if(!A1)
{
delay(10000);//消抖
if(!A1)
{
minute++;if(minute==61)minute=0;
xianshi();
}
}//按键处理
}
{
if(!A2)
{
delay(10000);//消抖
if(!A2)
{
minute--;if(minute==255)minute=59;
xianshi();
}
}
}
};break;
case 2: //调时控制
{
if(second%2==0)
{
P1=0x1b; //片选百位
P0=~Wanwei; //显示百位
delay(300); //短暂延时
P1=0x17; //片选千位
P0=~Shiwan; //显示千位
delay(300); //短暂延时
P1=0x1f;
P0=0xff;
delay(300);
}
else
delay(300);
delay(300);
{
if(!A1)
{
delay(10000);//消抖
if(!A1)
{
hour++;if(hour==24)hour=0;
xianshi();
}
}//按键处理
}
{
if(!A2)
{
delay(10000);//消抖
if(!A2)
{
hour--;if(hour==255)hour=23;
xianshi();
}
}
}
};break;
case 3: //秒显示控制
{
P1=0x1e; //片选个位
P0=~Gewei; //显示个位
delay(300); //短暂延时
P1=0x1d; //片选十位
P0=~Shiwei;//显示十位
delay(300); //短暂延时
P1=0x1f;
P0=0xff;
delay(300);
delay(300);
delay(300);
};break;
case 4://闹钟控制
{
if((!A1)||(!A2))
{
delay(10000);
if((!A1)||(!A2))j++;
if(j==2)
j=0;
}
switch (j)
{
case 0:{
P1=0x1e; //片选个位
P0=~0x71; //显示个位
delay(300); //短暂延时
P1=0x1d; //片选十位
P0=~0x71;//显示十位
delay(300); //短暂延时
P1=0x1b; //片选百位
P0=~0x3f; //显示百位
delay(300); //短暂延时
P1=0x17; //片选千位
P0=~0x40; //显示千位
delay(300); //短暂延时
delay(300);
};break;
case 1:{
P1=0x1e; //片选个位
P0=~0x37; //显示个位
delay(300); //短暂延时
P1=0x1d; //片选十位
P0=~0x3f;//显示十位
delay(300); //短暂延时
P1=0x1b; //片选百位
P0=0xff; //显示百位
delay(300); //短暂延时
P1=0x17; //片选千位
P0=~0x40; //显示千位
delay(300); //短暂延时
delay(300);
}
}
};break;
case 5://闹铃分钟调整
{
{
P1=0x1e;
P0=Naoling3;
delay(300);
P1=0x1d;
P0=Naoling4;
delay(300);
P1=0x1f;
P0=0xff;
delay(300);
delay(300);
delay(300);
}
{
if(!A1)
{
delay(10000);//消抖
if(!A1)
{
alarmminute++;if(alarmminute==61)alarmminute=0;
}
}//按键处理
}
{
if(!A2)
{
delay(10000);//消抖
if(!A2)
{
alarmminute--;if(alarmminute==255)alarmminute=59;
}
}
}
};break;
case 6://闹铃小时调整
{
{
P1=0x1b;
P0=Naoling1;
delay(300);
P1=0x17;
P0=Naoling2;
delay(300);
P1=0x1f;
P0=0xff;
delay(300);
delay(300);
delay(300);
}
{
if(!A1)
{
delay(10000);//消抖
if(!A1)
{
alarmhour++;if(alarmhour==24)alarmhour=0;
}
}//按键处理
}
{
if(!A2)
{
delay(10000);//消抖
if(!A2)
{
alarmhour--;if(alarmhour==255)alarmhour=23;
}
}
};break;
default :break;
}
}
}
}