/***************************************************************************
名稱:用定時器定時做時鐘
內容,自動從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;
}
|