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

📄 wahaha.txt

📁 功能丰富的万年历
💻 TXT
📖 第 1 页 / 共 2 页
字号:
#include<at89x52.h>
#define uchar unsigned char
#define uint unsigned int
uchar led_code[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};  //存放数字0~9及"灭"的段码
/*******************************************************************************************/
/*key1_flag用来存放按键1状态,key2_flag用来存放按键2状态,glitter_flag用来控制数码管闪烁,*/
/*startalarm_flag用于保存闹钟开关状,key2_flag用来存放按键2状态,startalarm_flag用于保存闹 */
/*钟开关状态,alarmrunning_flag用来判断是否闹钟是否正在响                                   */
/*******************************************************************************************/
uchar key1_flag,key2_flag,glitter_flag,dispalarm_flag,startalarm_flag,alarmrunning_flag,dispwatch_flag,watchrunning_flag;  
uchar lalarmnum,malarmnum,salarmnum;    //*分别为长中短闹铃的响铃次数
uchar disp[6]=0;    //*存放要显示字符
uchar wel[30]={10,10,10,10,10,10,0,2,0,4,3,1,10,10,10,10,10,10,0,2,0,4,1,9,10,10,10,10,10,10};
uchar second,minute,hour,second_alarm,minute_alarm,hour_alarm,second_alarm_temp,tenms_watch,second_watch,minute_watch;    //*存放时分秒及闹钟的时间
unsigned long day=1,month=6,year=2005; 

/********************/
/*判断每月天数子函数*/
/********************/
uchar daynum(void)      
{
  if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)   
	return(31);
  else if(month==4||month==6||month==9||month==11)
    return(30);
  else if((year%4==0)&&(year%100!=0)||year%400==0)    //判断是否闰年
	return(29);
  else 
	return(28);
}

/***************************************************/
/*软件延时程序,用于精度不高延时,延时时间大概为xms*/
/***************************************************/
void delayXms(uint x)
{
	unsigned int i,j;
	for(i=0;i<x;i++)
	  for(j=0;j<100;j++);
}

/****************************************************/
/*显示程序,用六个数码管分别显示disp[6]数组里的数字*/
/****************************************************/
void display()    
{
  uint i;
  uchar temp;
  temp=0x01;
  for(i=0;i<6;i++)
    {
      P0=0xff;
	  P2=~temp;
	  P0=led_code[disp[i]];	  //送段码	  
	  delayXms(2);
	  temp=temp<<1;	  //移位选择点亮数码管
	}
}

/****************************************/
/*放置相应的需要进行显示的字符到dips数组*/
/****************************************/
void process()     
{
  if(dispwatch_flag==1)
    {
	  disp[5]=minute_watch/10;
	  disp[4]=minute_watch%10;
	  disp[3]=second_watch/10;
	  disp[2]=second_watch%10;	  	  
	  disp[1]=tenms_watch/10;
	  disp[0]=tenms_watch%10;	
	}
  else if(dispalarm_flag==1)        //显示闹钟标志为1,则把闹钟时间送disp数组
    {
	  disp[5]=hour_alarm/10;
	  disp[4]=hour_alarm%10;
	  disp[3]=minute_alarm/10;
	  disp[2]=minute_alarm%10;	  	  
	  disp[1]=second_alarm/10;
	  disp[0]=second_alarm%10;	  
	}
  else if(key1_flag==0)      //按键1标志为0,则把时分秒送disp数组
    {
	  disp[5]=hour/10;
	  disp[4]=hour%10;
	  disp[3]=minute/10;
	  disp[2]=minute%10;	  	  
	  disp[1]=second/10;
	  disp[0]=second%10;
	}
  else if(key1_flag==1)      //按键1标志为1,则把年月日送disp数组
    {
	  disp[5]=(year%100)/10;
	  disp[4]=year%1000;
	  disp[3]=month/10;
	  disp[2]=month%10;	  	  
	  disp[1]=day/10;
	  disp[0]=day%10;
	}
}


/*****************************************/
/*闹钟响铃类型子程序,通过参数x可响不同长*/
/*短的闹铃,其中k为响铃次数,h为响铃间隔 */
/*****************************************/
void alarmrunning(x)       
{
  uchar i,j,k,h;
  switch(x)
  {
	case 4:k=1;h=15;break;    
	case 3:k=2;h=13;break;
    case 2:k=4;h=8;break;
    case 1:k=7;h=6;break;
	default :;
  }
  for(j=0;j<k;j++)
    {
      P3_7=0;
      for(i=0;i<h;i++)
        display();
      P3_7=1;
      for(i=0;i<h;i++)
        display();
    }
}

/**********************************************************/
/*闹钟程序,响铃时间为一分钟,长响15秒,中响15秒,急响30秒*/
/**********************************************************/
void alarmclock(void)
{
   if(hour==hour_alarm&&minute==minute_alarm&&second==second_alarm&&startalarm_flag==1&&key2_flag==0&&alarmrunning_flag==0)
	{  
      lalarmnum=1;
	  alarmrunning_flag=1;     //闹钟开始响,置标志为1
	  second_alarm_temp++;
	}
   else if(second==second_alarm_temp%60&&alarmrunning_flag==1&&lalarmnum!=0)
     {
  	  alarmrunning(3);     //闹钟类型选3,为长响
      second_alarm_temp++;
	  if(++lalarmnum==16)     //长响闹钟结束,进入中响闹钟,置相应标志
	    {
	       lalarmnum=0;
		   malarmnum=1;		
		}
     }
   else if(second==second_alarm_temp%60&&alarmrunning_flag==1&&malarmnum!=0)
     {
	  alarmrunning(2);     //闹钟类型选2,为中响
      second_alarm_temp++;
	  if(++malarmnum==16)     //中响闹钟结束,进入急响闹钟,置相应标志
	    {
	       malarmnum=0;
		   salarmnum=1;		
		}
     }
   else if(second==second_alarm_temp%60&&alarmrunning_flag==1&&salarmnum!=0)
     {
	    alarmrunning(1);     //闹钟类型选1,为急响
        second_alarm_temp++;
	    if(++salarmnum==31)
		  alarmrunning_flag=0;		//闹钟停止时间到,置标志位为0	  
     }
   if(alarmrunning_flag==0)      //如果闹钟停止,清空响铃次数
     {
	    salarmnum=0;
		malarmnum=0;
		lalarmnum=0;
		second_alarm_temp=second_alarm;
	 }
}


/********************/
/*控制数码管闪烁程序*/
/********************/
void glitterprocess(void)      
{
  glitter_flag++;	  
  glitter_flag=glitter_flag%30;
	 if((key2_flag==1)&&(glitter_flag>15)&&(glitter_flag<30)&&dispwatch_flag==0)     //按键2状态标志为1,则闪烁头两个数码管
	   {
		 disp[5]=10;
		 disp[4]=10;
	   }
	 else if((key2_flag==2)&&(glitter_flag>15)&&(glitter_flag<30)&&dispwatch_flag==0)      //按键2状态标志为2,则闪烁中间两个数码管
	   {
		 disp[3]=10;
		 disp[2]=10;
	   }
	 else if((key2_flag==3)&&(glitter_flag>15)&&(glitter_flag<30)&&dispwatch_flag==0)     //按键2状态标志为3,则闪烁后两个数码管
	   {
		 disp[1]=10;
		 disp[0]=10;
	   }     
	 else if(dispalarm_flag==1&&startalarm_flag==1&&(glitter_flag>15)&&(glitter_flag<30)&&dispwatch_flag==0)     //闹钟开,则闪烁六个数码管
	   {
		 disp[5]=10;
		 disp[4]=10;
		 disp[3]=10;
		 disp[2]=10;
		 disp[1]=10;
		 disp[0]=10;	     
	   }  
}

/*void dispyear(void)
{
  uint i;
  disp[5]=(year%100)/10;
  disp[4]=year%1000;
  disp[3]=month/10;
  disp[2]=month%10;	  	  
  disp[1]=day/10;
  disp[0]=day%10;
  for(i=0;i<25;i++)
    display();
  disp[5]=(year/100)%10;
  disp[4]=(year%100)/10;
  disp[3]=year%1000;
  disp[2]=month/10;	  	  
  disp[1]=month%10;
  disp[0]=day/10;
  for(i=0;i<25;i++)
    display();
  disp[5]=year/1000;
  disp[4]=(year/100)%10;
  disp[3]=(year%100)/10;
  disp[2]=year%1000;
  disp[1]=month/10;	  	  
  disp[0]=month%10;
  for(i=0;i<300;i++)
    display();
  disp[5]=(year/100)%10;
  disp[4]=(year%100)/10;
  disp[3]=year%1000;
  disp[2]=month/10;	  	  
  disp[1]=month%10;
  disp[0]=day/10;
  for(i=0;i<25;i++)
    display();
  disp[5]=(year%100)/10;
  disp[4]=year%1000;
  disp[3]=month/10;
  disp[2]=month%10;	  	  
  disp[1]=day/10;
  disp[0]=day%10;
  for(i=0;i<25;i++)
    display();
}*/

/****************************************************************/
/*键盘扫描程序,根据相应按键及长按短按,按的次数等,置相应的标志*/
/****************************************************************/
void keyscan()     
{ uint i;
  uint lp_flag=0;
  uint temp=0;
  uint dispalarm_temp;
  if((P1&0x0f)!=0x0f)  
    {
	  display();          //调用显示子程序进行延时消抖
      if((P1&0x04)!=0x04)       //按键1按下,用于转换显示年/月/日或时/分/秒或进入闹钟时间设置  
        {
		  if( dispwatch_flag==1)
		    {
		      dispwatch_flag=0;
		      watchrunning_flag=0;
              tenms_watch=second_watch=minute_watch=0;
			  if(++key1_flag==2)
			    key1_flag=0;
			}
		  key2_flag=0;
		  dispalarm_temp=dispalarm_flag;
		  dispalarm_flag=0;
          while((P1&0x04)!=0x04)	
		  	{ 
              if(++temp==50)       //如果按键1出现长按,则显示闹钟时间
			    { 
				  if(dispalarm_temp==0)
				    alarmrunning(4);       //响铃,表示显示的为闹钟时间 
				  if(dispalarm_temp==1)
				      if(++key1_flag==2)   //按键1状态为0和1,0表示显示时分秒,1表示显示年月日
					    key1_flag=0;
				      dispalarm_flag=1;    //置显示闹钟时间标志
                      process();
				}
              display();                  	  		  
            }		  
		  TR1=1;     //开定时器
		  if(++key1_flag==2)
			key1_flag=0;
		}	  
	  else if((P1&0x01)!=0x01)       //按键2按下,用于移位校准时间及切换闹钟开关 
        {
 		  while((P1&0x01)!=0x01)         //如果按键2出现长按,则判断是否进入切换闹钟开关功能
		    {
	          process();
              glitterprocess();
			  display();			  
			  if(++temp==50)       //按键2长按且当前显示为闹钟,则切换闹钟的开和关
 			    {  
			      if(dispalarm_flag==1)
			        {
				      lp_flag=1;		  
				      startalarm_flag=!startalarm_flag;     
                      key2_flag=0;
			          alarmrunning(2);      //切换闹钟开关完成,以急促闹铃提醒
				    }
				  else if(dispwatch_flag==0)      //判断是否进入秒表
					{
                      dispwatch_flag=1;
                      alarmrunning(4); 
					}
				}
			}
		  if(lp_flag==0)
		    {
			  if(++key2_flag==4)
			    {
			      key2_flag=0;
		          TR1=1;
			    }
		      else
		        {
			      TR1=0;
			      glitter_flag=0;
		        }
			  for(i=0;i<10;i++)
              display();
		    }
	  	}
      else if((P1&0x08)!=0x08)       //按键3按下,校准时间增加数字量
        {
//          if(dispwatch_flag==0&&dispalarm_flag==0&&key1_flag==1)
//            dispyear();
		  if(dispwatch_flag==1)
		  	{		  
		      watchrunning_flag=!watchrunning_flag;              
			  while((P1&0x08)!=0x08)
                {
				  process();
                  display();
				}
			}
		  else
		  {
            while((P1&0x08)!=0x08)       //如果按键3出现持续按下,则快速增加数字量
		      {
	            process();
			    display();
			    if(++temp>=50)
			      {
				    lp_flag=1;
				    if(alarmrunning_flag==1)
			          {
					    alarmrunning_flag=0;
					    alarmrunning(4);
					  }
				    else if(dispalarm_flag==1&&key2_flag==1)      //快增调节闹钟时
  			          {
                        if(++hour_alarm==24)
 				        hour_alarm=0;
				        process();
	                    display();
			          }
			        else if(dispalarm_flag==1&&key2_flag==2)      //快增调节闹钟分
  			          {
                        if(++minute_alarm==60)
 				        minute_alarm=0;
				        process();
	                    display();
  			          }
			        else if(dispalarm_flag==1&&key2_flag==3)      //快增调节闹钟秒
  			          {
                        if(++second_alarm==60)
 				          second_alarm=0;
				        process();
	                    display();
				        second_alarm_temp=second_alarm;      

⌨️ 快捷键说明

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