/***************************************************************************
名称:用定时器定时做时钟
内容,自动从00-00-00开始,有按键功能
芯片型号:STC89C52RC
功能脚说明:P0为段选脚,P3为位选脚,所有引脚低电平有效.
程序员:玄溪
日期:2012.2.6
/***************************************************************************/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbit K1=P1^0; //分+
sbit K2=P1^1; //分-
sbit K3=P1^2; //时+
sbit K4=P1^3; //时-
uchar time; //定义中断时间次数
uchar second; //定义秒
uchar minute; //定义分
uchar hour; //定义时
//===========延时函数============//
void delay()
{
uchar j;
for(j=0;j<200;j++);
}
//=========显示秒函数=======//
void displaysecond(uchar s) //带返回值
{
P3=0xbf;
P0=du[s/10];
delay();
P3=0x7f;
P0=du[s%10];
delay();
P3=0xff;
if(K2==0)
{
s++;
if(s==60)
{
s=0;
}
}
}
//========显示分函数=============//
void displayminute(uchar m)
{
P3=0xf7;
P0=du[m/10];
delay();
P3=0xef;
P0=du[m%10];
delay();
P3=0xdf;
P0=0xbf;
delay();
P3=0xff;
if(!K1)
{
delay();
if(!K1)
{
TR0=0;
m++;
if(m==60)
m=0;
}
}
if(!K2)
{
delay();
if(!K2)
{
TR0=0;
m--;
if(m==0)
m=59;
}
}
TR0=1;
}
//========显示时函数==============//
void displayhour(uchar h)
{
P3=0xfe;
P0=du[h/10];
delay();
P3=0xfd;
P0=du[h%10];
delay();
P3=0xfb;
P0=0xbf;
delay();
P3=0xff;
if(!K3)
{
delay();
if(!K3)
{
TR0=0;
h++;
if(h==24)
h=0;
}
}
if(!K4)
{
TR0=0;
delay();
if(!K4)
{
h--;
if(h==0)
h=23;
}
}
TR0=1;
}
//=============主函数============//
void main(void)
{
TMOD=0x01;
EA=1;
ET0=1;
TH0=(65536-46083)/256; //赋初值
TL0=(65536-46083)%256;
TR0=1;
while(1)
{
displaysecond(second);
delay();
displayminute(minute);
delay();
displayhour(hour);
delay();
}
}
//=======定时器中断子函数=================//
void inter0()interrupt 1
{
time++;
if(time==20)
{
time=0;
second++;
}
if(second==60)
{
second =0;
minute++;
}
if(minute==60)
{
minute=0;
hour++;
}
if(hour==24)
{
hour=0;
}
TH0=(65536-46083)/256; //赋初值
TL0=(65536-46083)%256;
}
|