/***************************************************************************
名稱:用定時(shí)器定時(shí)做時(shí)鐘
內(nèi)容,自動(dòng)從00-00-00開(kāi)始,有按鍵功能
芯片型號(hào):STC89C52RC
功能腳說(shuō)明: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; //時(shí)+
sbit K4=P1^3; //時(shí)-
uchar time; //定義中斷時(shí)間次數(shù)
uchar second; //定義秒
uchar minute; //定義分
uchar hour; //定義時(shí)
//===========延時(shí)函數(shù)============//
void delay()
{
uchar j;
for(j=0;j<200;j++);
}
//=========顯示秒函數(shù)=======//
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;
}
}
}
//========顯示分函數(shù)=============//
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;
}
//========顯示時(shí)函數(shù)==============//
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;
}
//=============主函數(shù)============//
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();
}
}
//=======定時(shí)器中斷子函數(shù)=================//
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;
}
|