⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 数字时钟最终显示程序.c

📁 数字时钟 c语言程序 基于单片机8051 LED显示
💻 C
字号:
	   
//P3口控制按键,P0口控制哪个数码管亮,P1口控制数码管亮的数字



#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key0=P3^0;
sbit key1=P3^1;
sbit key2=P3^2;
sbit key3=P3^3;
//sbit P0_7=P0^7;//控制冒号闪烁,可不用

//--------字表----------
uchar code dispcode[]=
{0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};

//-------显示位置-------
uchar dispbitcode[]={0xa0,0x90,0x88,0x84,0x82,0x81};

uchar second=0;		//秒
uchar minite=0;		//分
uchar hour=12;		//小时
uchar ms=0;			//时间累加数
uchar keynum=0;		//按键次数


  //-----延迟------
void delay(uint z)
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=110;y>0;y--);
}

//-------时间显示---------
void display()
{		
	uchar m;

	
	 for(m=0;m<6;m++)
		{
			delay(2);
			P0=dispbitcode[m]; 	  //控制显示位
            switch(m)			 // 设置显示数
            {
			    case 0:	P1=dispcode[second%10];	 break;
			   	case 1:	P1=dispcode[second/10];	 break;
				case 2:	P1=dispcode[minite%10];	 break;
				case 3:	P1=dispcode[minite/10];  break;
				case 4:	P1=dispcode[hour%10];    break;
				case 5:	P1=dispcode[hour/10];    break;
			}
		}
}


//---buzhidao -----
void sdisplay(uchar dw)
{	 
	uchar cc,i;
	cc=0x03;	  //buzhidao 
	cc=~(cc<<dw);
	  for(i=0;i<6;i++)
		{
			delay(2);			
			P0=dispbitcode[i]&cc;
            switch(i)
            {
			    case 0:	P1=dispcode[second%10];	 break;
			   	case 1:	P1=dispcode[second/10];	 break;
				case 2:	P1=dispcode[minite%10];	 break;
				case 3:	P1=dispcode[minite/10];  break;
				case 4:	P1=dispcode[hour%10];    break;
				case 5:	P1=dispcode[hour/10];    break;
			}
		}
}                       

  //--------分秒时调节时的闪烁--------
void shan()
{
	uchar i;

	if(keynum==1)
	{
		for(i=0;i<4;i++)
			{			
				display();
			} 
			
		for(i=0;i<4;i++)
		 {	
			sdisplay(4);		
			
		 }
	}
	if(keynum==2)
	{
		for(i=0;i<4;i++)
		{
			display();
			
		} 
		for(i=0;i<4;i++)
		{
			sdisplay(2);
		
		} 	
	}
	if(keynum==3)
	{
		for(i=0;i<4;i++)
			{
				display();
				
			} 

		for(i=0;i<4;i++)
		{
			sdisplay(0);
			
		} 
	}
}

//--------键盘扫描-----------
void skycon()
{
	if(key0==0)
	{
		delay(5);
		if(key0==0)
		{
			 TR0=0;//接受终端位复位,不允许中断,也就是按键按下时,开始调时,秒钟不动		 				 		 	
			while(!key0)//按键按下时依然显示时间
			{
				display();
			}
			keynum++;			
			if(keynum==4)	//退出时间调试
			{
				keynum=0;
				TR0=1;	 //接受中断位打开,秒钟开始动
			} 

		}
	}
	
	shan();		 //被选位闪烁

	if(keynum!=0)	 
	 {	 
	 	 if(key1==0 ) //加1
		   {		    
		   	 delay(5);



			 if(key1==0 )
			 {
				 	if(keynum==1)
					{
       					second++;	 
						if(second==60)
						{
							second=0;
						} 		
					}
				 	if(keynum==2)
					{
						minite++;
						if(minite==60)
						{
							minite=0;
						}
					 }
				
		 			if(keynum==3)
					{
						hour++;
						if(hour==24)
						{
							hour=0;
						}
			   		}
							
				   while(!key1)	   //去抖动,且一直显示时间
				   {
			   			display();
				   }
				
				}
							
			
			}  

			if(key2==0 )		//减1
			   {
			    
			   	 delay(5);
				 if(key2==0 )
				 {
					 	if(keynum==1)
						{
							second--;
							shan();
							if(second==-1)
							{
								second=59;
							}
						}
					 	if(keynum==2)
						{
							minite--;
							shan();
							if(minite==-1)
							{
								minite=59;
							}
						 }
					
			 			if(keynum==3)
						{
							hour--;
							shan();
							if(hour==-1)
							{
								hour=23;
							}
				   		}
									
					   while(!key2)
					   	{
					   		display();
						}
					 
					}
				
	

			
}	 
}	  
 if(key3==0)		  //退出时间调试
	  {	
	   delay(5);
	    if(key3==0)
		{
	  	keynum=0;
		TR0=1;
		}
		while(!key3)
		 {display();}
	
    	}				
}

void main()
{
	TMOD=0x01;				 // 中断始终以方式1打开
	TH0=(65535-50000)/256;	  //每50ms 一次中断
	TL0=(65535-50000)%256;
	TR0=1;					//启动定时器0
	ET0=1;
	EA=1;
	while(1)
	{
	  skycon();	
	  display();
	  shan();
	  
	}
}	
void time0() interrupt 1 
{
	TH0=(65535-50000)/256;		//除中断2可以自动分配时间外,其余中断都得从新声明
	TL0=(65535-50000)%256;
	ms++;
	 if(ms==20)					//50x20=1000ms=1s
	    {	
			ms=0;
//			P0_7=!P0_7;
			second++;
			if(second==60)
			{
				second=0;
				minite++;
				if(minite==60)
				{
					minite=0;
					hour++;
					if(hour==24)
					{
						hour=0;
					}
				}
			}
		}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -