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

📄 keypad.c

📁 这个程序是一个用于多功通电子钟,通过调试成功,可以直接使用
💻 C
📖 第 1 页 / 共 2 页
字号:
					   return;	
					  }
			 
			      if((data_deal==8)&(month==2)&(keypad<=8)) 					    
			         {
			            day=day/10*10+(uchar)keypad;
						data_deal=0x00;	
					    return;	
				     }
				  if((data_deal==8)&(month!=2)&(day/10<=2))
				     {
					  day=day/10*10+(uchar)keypad;
					  data_deal=0x00;	
					   return;	
					 }
				 if((data_deal==8)&(day/10==3)&(keypad<=1))
				         {
					      if((keypad==0)&((month==4)|(month==6)|(month==9)|(month==11)))
					         {
						      day=day/10*10+(uchar)keypad;
					          data_deal=0x00;	
					          return;	
						      }
						   else
						     {
						   	  day=day/10*10+(uchar)keypad;
					          data_deal=0x00;	
					          return;	
						     }
					     }
			   }
	

     }
 /*******************************************************************************
*File: Main.c
*功能: LED数码管显示0-F字符,同时控制4个LED显示对应的十六进制
*******************************************************************************/

////////////////////////////////////////////////////////////////////////////////////////////////////
  void dis_deal(uchar *x,uchar *y,uchar *z,uchar *a,uchar *b)	 //显示缓冲处理
             {
			  dis[0]=*x%10;
	          dis[1]=*x/10;
	          dis[2]=*y%10;
	          dis[3]=*y/10;
	          dis[4]=*z%10;
	          dis[5]=*z/10;
	          dis[6]=*a;
	          dis[7]=*b;
			 }
 //////////////////////////////////////////////////////////////////////////////////////////////////显示
 /*******************************************************************************
*File: Main.c
*功能: LED数码管显示0-F字符,同时控制4个LED显示对应的十六进制
*******************************************************************************/

  void display()
   {
     uchar a,b,c,d;
	 if((st_control==0)&(data_deal_flag==0)&(alarm_key_flag==0)&(down_key_flag==0))	  //如果是时钟,秒分时,进显示缓存
	   {
	        b=14;c=14;								   //时钟时高两位不显示

		if((switchover==0)|((hour>=1)&(hour<=12)))			//24小时转12小时
		       {
		       	
	           dis_deal(&second,&minute,&hour,&b,&c);
		       }
		  else
		       {
			     if(hour==0x00)hour_12=12;
				 else hour_12=hour-12;
				 dis_deal(&second,&minute,&hour_12,&b,&c);
			   }
        }



	 if(st_control!=0)	  //如果秒表,秒表显示进显示缓存
	    {
		 b=13;c=12;
         dis_deal(&st_10ms,&st_s,&st_minute,&b,&c);
	     }


	 if(data_deal_flag!=0)	//日期显示
	     {
		  b=year_higher%10;
		  c=year_higher/10;
		  dis_deal(&day,&month,&year,&b,&c);
		 }
	 if(alarm_key_flag!=0)	//闹钟显示
	     {
		  if(alarm_flag==1){b=10,c=0;}
		  else {b=10;c=10;}
		  dis_deal(&alarm_second,&alarm_minute,&alarm_hour,&b,&c);
		 }	 	 
	 if(down_key_flag!=0)	//倒计时显示
	     {
		   b=13;c=11;
           dis_deal(&down_second,&down_minute,&down_hour,&b,&c);
		 }	 	 	 
	 
		 										
	for(a=0;a<8;a++)
	    {
	   
	    d=dis_7[dis[a]];
	    if((a==4)|(a==2))d=d&0x7f;
	    pb8255=d;
	    P1=scan_con[a];
	    delay(5);
	    P1=0x00;

        }

   	
   }


 
/*******************************************************************************
*File: Main.c
* 
*功能: 多功能时钟
*******************************************************************************/
void main(void)
{
  
  init();
  
 
 while(1)
   {
     keypad=keyscan();
	 if(flag==1)out_time();	      //时钟时间到外部处理
	 if(st_flag==1)st_outtime(); //秒表时间到外部处理
     if(keypad>=0)key_deal();
	 if((alarm_flag==1)&(alarm_hour==hour)&(alarm_minute==minute)&(alarm_second==second))	//闹钟到响铃判断
	     {
		   ring_second=second;
		   ring_minute=minute;
		   sign=0;
		   ring();							  // 响铃,sign用来判断是闹钟响铃还是倒计时响铃
		   }
	   if(down_ring==1)							 //倒计时判断
	     {
		   ring_second=second;
		   ring_minute=minute;
		   sign=1;
		   ring();
		 }
	  display();
	}
}
//////////////////////////////////////////////////////////
 /*******************************************************************************
*File: Main.c
*功能: LED数码管显示0-F字符,同时控制4个LED显示对应的十六进制
*******************************************************************************/

 void quit(void)		  //响铃声按键退出
  {
    keypad=keyscan();
	if(keypad==0x0a)
	  {
		  if(sign==0)
			{
			ring_second=0x00;
			ring_minute=0x00;
			alarm_flag=0;         
			}
		 else
		    {
			down_ring=0;
			down_flag=0;
			down_key_flag=0;
			down_deal=0x00;
		    }
		p2_0=0;
	  }         
  }

/////////////////////////////////////////////////////////////////////////////////以下为时钟处理的
 /*******************************************************************************
*File: Main.c
*功能: LED数码管显示0-F字符,同时控制4个LED显示对应的十六进制
*******************************************************************************/

void ring()
 {
         while(1)
		 { 
		   
            p2_0=0;display();display();display();display();display();display();display();display();p2_0=1;         //响铃三短第一短
             
			 
			 quit();									//查看有没按键要退出响铃
			 if(flag==1)out_time();	                   //时钟1妙时间到外部处理
			 if(keypad==0x0a)
			 { 
			 	p2_0=1;
			 	return;
		 	} 		          
             display();display();display();

			 p2_0=0;display();display();display();display();display();display();display();display();p2_0=1;		 //	二短


			 quit();
			 if(keypad==0x0a)
			 { 
			 	p2_0=1;
			 	return;
		 	} 		     
			 if(flag==1)out_time();				  
			 display();display();display();


 			 p2_0=0;display();display();display();display();display();display();display();display();p2_0=1;		 //	三短


			 quit();
			 if(keypad==0x0a)
			 { 
			 	p2_0=1;
			 	return;
		 	} 		     
			 if(flag==1)out_time();				  
			 display();display();display();

			 p2_0=0;display();display();display();display();display();display();display();display();
			        display();display();display();display();display();display();display();display();
			 p2_0=1;	   //一长


			 quit();
			 if(keypad==0x0a)
			 { 
			 	p2_0=1;
			 	return;
		 	} 		     
			 if(flag==1)out_time();
			 display();


			 
			 if((ring_second==second)&((minute-ring_minute)==1))	//响铃一分钟到退出处理
		         {
			      if(sign==0)						  //sign用来判断事倒计时还是闹钟响铃,
			         {
		            	ring_second=0x00;
			            ring_minute=0x00;
		            	alarm_flag=0;         //*等下定时的标志也清掉
		            	}
		         else
		            {
		            	down_ring=0;
		             	down_flag=0;
		            	down_key_flag=0;
			            down_deal=0x00;
		                }      
			     return;
			     }
		   }
 }

/*******************************************************************************
*File: Main.c
*功能: LED数码管显示0-F字符,同时控制4个LED显示对应的十六进制
*******************************************************************************/

void init(void)
{
   P0=0xff;
   P1=0xff;
   P2=0xff;
   P3=0xff;
   p2_0=1;
  comm8255=0x81;
  pb8255=0xff;

   TMOD=0x01;
   TH0=0x3c;	      //定时50ms
   TL0=0xb0;
   ET0=1;
   TR0=1;
   EA=1;
}


	///////////////////////////////////////////////////////////
/*******************************************************************************
*File: Main.c
*功能: LED数码管显示0-F字符,同时控制4个LED显示对应的十六进制
*******************************************************************************/

void out_time(void) 
{
 if(second>=60)
	   {
	   	second=0x00;
		minute++;
		if(minute>=60)
		  {
		  	minute=0x00;
			hour++;
			if(hour>=24)
			 {
			   hour=0x00;
			   day++;

			  /////////////////////////////////////////////////////////
			   if((day>=29)&(month==2)&(year%4!=0))						   //二月28号非闰年判断
			      {
			       day=0x01;
			       month++;
			       }
			   if((day>=30)&(month==2)&(year%4==0))						   //闰年二月判断
			      {
			       if(year%10!=0)
				   {day=0x01;month++;}
				   if((year%100==0)&(year%400==0))
				   {day=0x01;month++;}
			       }
			   if((day>=31)&((month==4)|(month==6)|(month==9)|(month==11)))//30号月判断
			       {
			   	    day=0x01;
			        month++;
			        }
			   if((day>=32)&((month==1)|(month==3)|(month==5)|(month==7)|(month==8)|(month==10)|(month==12)))//31号月判断
			        {
			   	      day=0x01;
			          month++;
			         }
			    if(month>=13)
			         {
			         month=0x01;
			         year++;
			         }

			 //////////////////////////////////////////////////////////////////////////

			  }

			}
  
        }
	   
	     	  
  	 flag=0;
  }



///////////////////////////////////////////////////////////
 /*******************************************************************************
*File: Main.c
*功能: LED数码管显示0-F字符,同时控制4个LED显示对应的十六进制
*******************************************************************************/

void time_int0(void) interrupt 1 using 1          //50ms中断
{
   ET0=0; TR0=0;
   TH0=0x3c;
   TL0=0xb0;
   TR0=1;
   count++;
   if(count==20)
   {
     count=0x00;
	 second++;
	    if(down_flag==1)
	        {
			    if((down_second<=0x00)&(down_minute==0x00)&(down_hour==0x00))
			       {
				   down_second=0x01;
			       down_ring=1;					  //倒计时到--响铃
			       down_flag=0;					  //关倒计时
			       }

	     	   if((down_second<=0x00)&((down_minute>=1)|(down_hour>=1)))
	               {
	     	        down_second=59;
					if((down_minute<=0x00)&(down_hour>=1))
					     {
						 down_minute=59;
						 down_hour--;
						 }
					 else down_minute--;
		            }
				 else down_second--;
			  
	        }		    

	 flag=1;
	 }
	
	ET0=1;
}
 /*******************************************************************************
*File: Main.c
*功能: LED数码管显示0-F字符,同时控制4个LED显示对应的十六进制
*******************************************************************************/

void time_int1(void) interrupt 3 using 2           //10ms(百分秒)秒表中断
 {
     ET1=0; TR1=0;
	 TH1=0xd8;
     TL1=0xf0;
	 TR1=1;
	 st_count++;
	 if(st_count>=10)
	 {
	 st_count=0x00;
	 st_10ms++;
	 st_flag=1;
	 }
     ET1=1;
 }
 /*******************************************************************************
*File: Main.c
*功能: LED数码管显示0-F字符,同时控制4个LED显示对应的十六进制
*******************************************************************************/

void st_outtime(void)
   {
	if(st_10ms>=100)
	   {
	   st_10ms=0x00;
	   st_s++;
	     if(st_s>=60)
		   {
		    st_s=0x00;
			st_minute++;
			if(st_minute>=60)
			    {
			    st_10ms=0x00;
			    st_s=0x00;
			    st_minute=0x00;
			   }
		    }
	     }
		 st_flag=0;
    }


//键盘说明:0x0c为进入和退出调时的控制键

⌨️ 快捷键说明

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