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

📄 lab24.c

📁 这是一个时钟程序
💻 C
字号:
/*可调时钟(无小时)和设定闹钟功能*/
#include<at89x52.h>
char code num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
char code tv[]={0xfe,0xfd,0xfb,0xf7};
char led[4];
unsigned int counter;
unsigned char s_data=50,m_data=59,n,w=4,flag,flag2,flag3,set_mdata,set_sdata,mdata,sdata;
void display(void);

void delay(unsigned int j)    
{
unsigned int i;
for(i=0;i<j;i++);
}

void delay2(void)    
{
unsigned int j;
//for(i=0;i<1000;i++)
for(j=0;j<500;j++) display();
}

void display(void)			
{
unsigned char k,i;
if(flag2==1)			//设定闹钟时不显示实际时间
{
led[0]=mdata/10;
led[1]=mdata%10;
led[2]=sdata/10;
led[3]=sdata%10;
}
else
{
led[0]=m_data/10;
led[1]=m_data%10;
led[2]=s_data/10;
led[3]=s_data%10;
}
n++;
if(n>180)
	n=0; 
for(k=0;k<4;k++)
{
	if(k==w)					//闪烁显示
	{
		if(n<90)						
 	 	{i=led[k];
     	P0=num[i];
		if(k==1)
			P0=num[i] | 0x80;	//显示小数点
	 	P2=tv[k];
	 	delay(100);
	 	}
	 	else
	 	{
	 	P0=num[10];
		if(k==1)
			P0=num[10] | 0x80;
	 	P2=tv[k];
	 	delay(100);
	 	}
	}
	else					//正常显示
	{
	  	i=led[k];
     	P0=num[i];
		if(k==1)
			P0=num[i] | 0x80;
	 	P2=tv[k];
	 	delay(100);	
	 }
}
}


void adjust(void)				//调整函数
{
	if(P3_5==0)           
	{
		while(P3_5==0)		
			display();
		if(flag2==0)		//T1,开始调整时间  ;记时停止
		{
		TR0=0;
		w=0;
		flag++;
		if(flag==2)			//第一次按下是开始调整时间,第二次按下时确定
			{flag=0;TR0=1;w=4;}
		}
		else			//开始设定闹钟,记时不停止
		{
		w=0;
		flag++;
		if(flag==2)			//第一次按下是开始调整时间,第二次按下时确定
			{flag=0;flag2=0;flag3=1;w=4;}
		}
	}




	if(P3_2==0)                  //INT0,加操作 
	{	
		while(P3_2==0)
			display();
		if(flag2==0)
		{	//显示当前时间,由于采用逐个数码管闪烁,逐个调整,所以分钟数和秒数的个位,十位分别赋值,比较麻烦
		if(w==0)
			{m_data=(m_data/10+1)*10+m_data%10;if(m_data>=60){m_data=m_data%10;}} 
		if(w==1)
			{if(m_data%10==9) m_data=m_data/10*10;else m_data=m_data%10+1+m_data/10*10; }
		if(w==2)
			{s_data=(s_data/10+1)*10+s_data%10;if(s_data>=60){s_data=s_data%10;}}
		if(w==3)
			{if(s_data%10==9) s_data=s_data/10*10;else s_data=s_data%10+1+s_data/10*10; }
		}
		else
		{					//显示闹钟时间,逐个调整,
		if(w==0)
			{mdata=(mdata/10+1)*10+mdata%10;if(mdata>=60){mdata=mdata%10;}} 
		if(w==1)
			{if(mdata%10==9) mdata=mdata/10*10;else mdata=mdata%10+1+mdata/10*10; }
		if(w==2)
			{sdata=(sdata/10+1)*10+sdata%10;if(sdata>=60){sdata=sdata%10;}}
		if(w==3)
			{if(sdata%10==9) sdata=sdata/10*10;else sdata=sdata%10+1+sdata/10*10; }
		}
	
	}
	




	if(P3_3==0)            //INT1,减操作
	{	
		while(P3_3==0)
			display();
		if(flag2==0)
		{					//显示当前时间
		if(w==0)
			{if(m_data/10==0) m_data=50+m_data%10; else m_data=(m_data/10-1)*10+m_data%10;} 
		if(w==1)
			{if(m_data%10==0) m_data=m_data/10*10+9;else m_data=m_data%10-1+m_data/10*10;}
		if(w==2)
			{if(s_data/10==0) s_data=50+s_data%10; else s_data=(s_data/10-1)*10+s_data%10;} 
		if(w==3)
			{if(s_data%10==0) s_data=s_data/10*10+9;else s_data=s_data%10-1+s_data/10*10;}
		}
		else
		{					////显示闹钟时间
		if(w==0)
			{if(mdata/10==0) mdata=50+mdata%10; else mdata=(mdata/10-1)*10+mdata%10;} 
		if(w==1)
			{if(mdata%10==0) mdata=mdata/10*10+9;else mdata=mdata%10-1+mdata/10*10;}
		if(w==2)
			{if(sdata/10==0) sdata=50+sdata%10; else sdata=(sdata/10-1)*10+sdata%10;} 
		if(w==3)
			{if(sdata%10==0) sdata=sdata/10*10+9;else sdata=sdata%10-1+sdata/10*10;}
		}
	}
	//}




	if(P3_4==0)            //T0,下一个数码管闪烁/设定闹钟开始
	{
		while(P3_4==0)
			display();
		if(flag==1)			//当flag==1时,说明P3_5按下过,开始调整时间,此时P3_4只起循环闪烁数码管的功能
		{
		w++;
		if(w==4) w=0;
		}
		else				//设定闹钟
		{
		flag2=1;
		mdata=m_data;		//读取当前时间值
		sdata=s_data;
		}
	}

}
				




void timer0() interrupt 1			
{
	counter++;
	if(counter==5000)
		{
		s_data++;
		counter=0;
		}
}



main(void)
{
	IE=0x8a;
	TMOD=0x02;
	TH0=-200;
	TL0=-200;
	TR0=1;
	
	while(1)
	{
		if(s_data==60)
		{	
			s_data=0;
			m_data++;	
		}
		if(m_data==60)
		{
			m_data=0;
		}
		
		adjust();
		if(m_data==mdata && s_data==sdata)		//判断是否等于设定的时间值,即闹钟功能,mdata,sdata为设定的闹钟时间;
			{if(flag3==1)						//m_data,s_data为当前时间值
				{P1_0=0;delay2();P1_0=1;flag3=0;}}				//  P1_0口接的数码管亮一下表示闹钟时间到
		//delay(100);                                          
		display();
	}
}

⌨️ 快捷键说明

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