//基于51单片机 时钟程序
#include<reg52.h>
//宏定义
#define uint unsigned int
#define uchar unsigned char
//位定义
sbit wei1=P2^7; //锁存器于P2^7(数码管位选)
sbit duan1=P2^6; //锁存器于P2^6(数码管段选)
sbit key_a=P3^4; //按键1(用于选时,分,秒)
sbit key_b=P3^5; //进行+
sbit key_c=P3^6; //进行-
//sbit shijian=P3^7;
//全局变量
uint duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴数码管段选-(无dp)
uint duandp[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //共阴数码管段选-(有dp)
uint wei[] ={0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //低电平有效位选
uint num[3][2];
char shi=0,fen=0,miao=0;
uchar t0=0,key=0,key_num=0;
//函数
void xianshi(); //显示
void kongzhi(); //按键控制
void delay(uint ms) //延时程序
{
uint i,j;
for(i=ms;i>0;i--)
for(j=115;j>0;j--);
}
void time_0()interrupt 1 //to中断函数
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
t0++;
if(t0==10)
{
key=0;
}
if(t0==20)
{
t0=0;
key=1;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
}
}
}
}
//主函数
void main()
{
TMOD=0X01;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
EA=1;
ET0=1; //开启
TR0=1; //启动
while(1)
{
xianshi();
kongzhi();
}
}
void kongzhi()
{
if(key_a ==0)
{
delay(10);
if(key_a==0)//去抖动后再次确认
{
delay(10);
key_num++;
TR0=0;
if(key_num==5)
{
TR0=1;
key_num=0;
}
while(key_a==0);//松手检测
}
}
if((key_num ==2)&&(key_b ==0))//sec +
{
delay(10);
miao++;
if(miao>59)
{
miao=0;
}
while(key_b==0);//松手检测
}
if((key_num == 2)&&(key_c == 0))//sec -
{
delay(10);
miao--;
if(miao<0)
{
miao=59;
}
while(key_c==0);//松手检测
}
if((key_num ==3)&&(key_b ==0))//min +
{
delay(10);
fen++;
if(fen>59)
{
fen=0;
}
while(key_b==0);//松手检测
}
if((key_num ==3)&&(key_c ==0))//min -
{
delay(10);
fen--;
if(fen<0)
{
fen=59;
}
while(key_c==0);//松手检测
}
if((key_num ==4)&&(key_b ==0))//shi +
{
delay(10);
shi++;
if(shi>23)
{
shi=0;
}
while(key_b==0);//松手检测
}
if((key_num ==4)&&(key_c ==0))//shi -
{
delay(10);
shi--;
if(shi<0)
{
shi=23;
}
while(key_c==0);//松手检测
}
}
void xianshi()
{
uint i;
num[0][0]=miao%10;
num[0][1]=miao/10;
num[1][0]=fen%10;
num[1][1]=fen/10;
num[2][0]=shi%10;
num[2][1]=shi/10;
for(i=0;i<6;i++)
{
P0=0XFF; //消影
wei1=1;
P0=wei[i];
wei1=0;
P0=0; //消影
if((i==2||i==4)&&key==1)
{
duan1=1;
P0=duandp[num[i/2][i%2]]; //i/2={0.1.2} i%2={0,1}
duan1=0;
delay(1);
}
else
{
duan1=1;
P0=duan[num[i/2][i%2]]; //i/2={0.1.2} i%2={0,1}
duan1=0;
delay(1);
}
}
}