原创 时钟C程序

2011-2-28 10:58 1187 2 2 分类: MCU/ 嵌入式
原创作品,水平有限,看着见谅,嘴下留情。

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x76,0x79,0x38,0x3f,0};
sbit dula=P2^6;
sbit wela=P2^7;
//sbit key=P3^4;
uchar hour2, hour1, min2, min1, sec2, sec1, t, flag;
uint num=43180, num1=8765;
void delay(uchar);
void display(uchar, uchar, uchar, uchar, uchar, uchar);
void display1(uchar, uchar, uchar, uchar, uchar, uchar);
void init();
void deb_clock();
void ala_clock();
void main()							  //主函数
{
	init();
	while(1)
	{
		P3=0xfb;
		if(P3==0xfb)
    	{
			display(hour2, hour1, min2, min1, sec2, sec1);	 
		    deb_clock();
    	}
		else if(P3!=0xfb)
		{
		 
			display1(hour2, hour1, min2, min1, sec2, sec1);
			ala_clock();
		}
	    
	}
}
void delay(uchar z)	   //延时函数
{
	uint x, y;
	for(x=z; x>0; x--)
		for(y=110; y>0; y--);
}
void display(uchar hour2, uchar hour1, uchar min2, uchar min1,
              uchar sec2, uchar sec1)		  //时钟显示函数
{
	hour2=num/3600/10;
	hour1=num/3600%10;
	min2=num%3600/60/10;
	min1=num%3600/60%10;
	sec2=num%60/10;
	sec1=num%60%10;
	dula=1;				   //秒
	P0=table[sec1];
	dula=0;
	P0=0xff;
	wela=1;
	P0=0xdf;
	wela=0;
	delay(1);
	dula=1;				   
	P0=table[sec2];
	dula=0;
	P0=0xff;
	wela=1;
	P0=0xef;
	wela=0;
	delay(1);
	dula=1;				  //分
	P0=table[min1];
	dula=0;
	P0=0xff;
	wela=1;
	P0=0xf7;
	wela=0;
	delay(1);
	dula=1;
	P0=table[min2];
	dula=0;
	P0=0xff;
	wela=1;
	P0=0xfb;
	wela=0;
	delay(1);
	dula=1;			      //小时
	P0=table[hour1];
	dula=0;
	P0=0xff;
	wela=1;
	P0=0xfd;
	wela=0;
	delay(1);
	dula=1;
	P0=table[hour2];
	dula=0;
	P0=0xff;
	wela=1;
	P0=0xfe;
	wela=0;
	delay(1);
}
void display1(uchar hour2, uchar hour1, uchar min2, uchar min1,
              uchar sec2, uchar sec1)		  //闹钟显示函数
{
	hour2=num1/3600/10;
	hour1=num1/3600%10;
	min2=num1%3600/60/10;
	min1=num1%3600/60%10;
	sec2=num1%60/10;
	sec1=num1%60%10;
	dula=1;				   //秒
	P0=table[sec1];
	dula=0;
	P0=0xff;
	wela=1;
	P0=0xdf;
	wela=0;
	delay(1);
	dula=1;				   
	P0=table[sec2];
	dula=0;
	P0=0xff;
	wela=1;
	P0=0xef;
	wela=0;
	delay(1);
	dula=1;				  //分
	P0=table[min1];
	dula=0;
	P0=0xff;
	wela=1;
	P0=0xf7;
	wela=0;
	delay(1);
	dula=1;
	P0=table[min2];
	dula=0;
	P0=0xff;
	wela=1;
	P0=0xfb;
	wela=0;
	delay(1);
	dula=1;			      //小时
	P0=table[hour1];
	dula=0;
	P0=0xff;
	wela=1;
	P0=0xfd;
	wela=0;
	delay(1);
	dula=1;
	P0=table[hour2];
	dula=0;
	P0=0xff;
	wela=1;
	P0=0xfe;
	wela=0;
	delay(1);
}
void timer() interrupt 1	 //定时器0中断设置
{
	t++;
	if(t==20)
	{
		t=0;
		num++;
		if(num==46800)
		{
			num=3600;
		}
	}
	if(num==num1)
	{
		P1=0;
	}
	TH0=0x3c;
	TL0=0xb0;
}
void init()		 //对定时器0进行初始化
{
	TMOD=0x01;
	TH0=0x3c;
	TL0=0xb0;
	EA=1;
	ET0=1;
	TR0=1;
}
void deb_clock() //校时,利用第二行矩阵键盘分别调节十,分,秒
{	 
	P3=0xfd;
	if(P3!=0xfd)
	{
		delay(5);
		if(P3!=0xfd)
		{
			TR0=0;
			switch(P3)
			{
				case 0xcd: 		   //调秒
					num++;
					while(P3!=0xed);  //松手检测
					break;
				case 0xad: 		   //调分
					num=num+60;
					while(P3!=0xed);
					break;
				case 0x6d: 			//调小时
					num=num+3600;
					if(num/3600==13)
					{
						num=3600;
					}
					while(P3!=0xed);
					break;
			}
			while(P3==0xed)		 	//松手检测 
			{
				display(hour2, hour1, min2, min1, sec2, sec1);
			}
			TR0=1;
		}
	}
}  
void ala_clock()				 //闹钟设置函数
{
	//uint num1;
//	P3=0xfb;
	if(P3!=0xfb)
	{
		delay(5);
		if(P3!=0xfb)
		{
			switch(P3)
			{
				case 0xcb: 		   //调秒
					num1++;
					while(P3!=0xeb);  //松手检测
					break;
				case 0xab: 		   //调分
					num1=num1+60;
					while(P3!=0xeb);
					break;
				case 0x6b: 			//调小时
					num1=num1+3600;
					if(num1/3600==13)
					{
						num1=3600;
					}
					while(P3!=0xeb);
					break;
			}
			while(P3==0xeb)		 	//松手检测 
			{
				display1(hour2, hour1, min2, min1, sec2, sec1);
			}
		}
	}
//	return num1;
}


PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
2
关闭 站长推荐上一条 /4 下一条