/********************************************************************
数字钟
*********************************************************************/
#include<reg52.h> //库文件
#define uchar unsigned char//宏定义无符号字符型
#define uint unsigned int //宏定义无符号整型
#define DUAN P0 //P0口控制段
#define WEI P2 //P2口控制位
sbit k_shi=P1^0;// 更改小时按键
sbit k_fen=P1^1;// 更改分钟按键
sbit k_miao=P1^2;// 更改秒按键
/********************************************************************
初始定义
*********************************************************************/
uchar Table[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//七段码对应值
uchar numb[8]; //定义字符串
uint miao=0,fen,shi;
/********************************************************************
延时函数
*********************************************************************/
void delay(uchar t)
{
uchar i,j;
for(i=0;i<t;i++)
{
for(j=13;j>0;j--);
{ ;
}
}
}
/********************************************************************
求值函数
*********************************************************************/
void t_to_dis()
{
numb[0]=shi/10; //显示小时十位
numb[1]=shi%10; //显示小时个位
numb[2]=10; //显示横杠
numb[3]=fen/10; //显示分十位
numb[4]=fen%10; //显示分个位
numb[5]=10; //显示横杠
numb[6]=miao/10;//显示秒十位
numb[7]=miao%10;//显示秒个位
}
/********************************************************************
显示函数
*********************************************************************/
void display()//显示函数
{
/*****************数据转换*****************************/
uchar i,j;
uchar sel;
i=30; //定义延时显示时间
sel=0x01; //扫描位初值
for(j=0;j<8;j++)
{
WEI=sel; //选通最右边的数码管
DUAN=~Table[numb[j]]; //送字型码
delay(i); //显示延时
sel=sel<<1;
}
}
/********************************************************************
按键函数
*********************************************************************/
void key()//函数
{
if(k_shi==0){shi++;while(!k_shi);if(shi>=24)shi=0;}
if(k_fen==0){fen++;while(!k_fen);if(fen>=60)fen=0;}
if(k_miao==0){miao++;while(!k_miao);if(miao>=60)miao=0;}
}
/********************************************************************
定时器中断函数
*********************************************************************/
void timer1(void)interrupt 3
{
uchar i;
TH1=0X3c;//定时初值
TL1=0Xaf;//定时初值
i++;
if(i>=20)
{i=0;
miao++;//秒加1
if(miao>=60)
{miao=0;//秒清零
fen++;//60秒后分加1
if(fen>=60)
{fen=0;//分清零
shi++;//60分后时加1
if(shi>=24)
shi=0;//时清零
}
}
}
}
/********************************************************************
中断初始化
*********************************************************************/
void cshh()
{
TMOD=0X10;//定义定时器工作方式
TH1=0X3c;
TL1=0Xaf;
ET1=1;
TR1=1;//开定时器
EA=1;//开中断
}
/********************************************************************
主函数
*********************************************************************/
main()
{
cshh(); //中断初始化
while(1)
{
key();//按键函数
t_to_dis();//确定秒分时值
display(); //显示秒分时值
}
}