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

📄 good.txt

📁 利用51单片机做的一个闹钟程序
💻 TXT
📖 第 1 页 / 共 3 页
字号:
			                 if(key1_down==0)
			                     break;
                             P2 = select[j];
                             P0 = table[*p];
                             Tdelay(25);             //低电平600us
				             if(T0 == 0)
                             DelayMs(10);
		                     if(T0 == 0)
                             key1();
                             p++; 
                             P0 = 0x00;
                        }
                      P2 = 0xff;
                     for(j = 0; j<8; j++)
                       {  
		                  if(key1_down==0)
			                 break;
                          P1 = select[j];
                          P0=table[*p];
                          Tdelay(25);             
                          p++;
                         P0=0x00;
                      }
		              
                 }
          

	   }//报时处理结束
        
       
    }//state==1    
}//调整状态处理结束
 
}

/*************************按键及中断操作************************/
void key1(void)
{    
      WR=0;
      if(key1_down==0)//在正常情况下按下key1键,进入change/alarm状态
          {
             key1_down=1;
             key3_down=0;
			 state=0;
             //关闭所有的数码管子;
             for(m=0;m<16;m++)dis_buf[m]=11;
             //数码管子开始13,14输出对应的change/alarm代码;  
             if(change_alarm==0)//
                  {dis_buf[13]=0;dis_buf[14]=0;}//显示00;
             else
                  {dis_buf[13]=8;dis_buf[14]=8;}//显示88  
           }  
       else//回到正常情况下去.
          {
            key1_down=0;
            key3_down=0;
            state=0;
            if(change_alarm==0)
               {
 			     SetPCF8563(0x09,save2[1]&0x7f);
                 SetPCF8563(0x0a,save2[2]&0x7f);
                 SetPCF8563(0x0b,save2[3]&0x7f);
                 SetPCF8563(0x0c,save2[4]&0x7f);
               }
            else
                {
                 SetPCF8563(0x02,save[0]);
                 SetPCF8563(0x03,save[1]);
                 SetPCF8563(0x04,save[2]);
                 SetPCF8563(0x05,save[3]);
                 SetPCF8563(0x06,save[4]);
                 SetPCF8563(0x07,save[5]);
                 SetPCF8563(0x08,save[6]);
                 GetPCF8563(0x02,7,save);
                 save[0] = save[0]&0x7f;
                 save[1] = save[1]&0x7f;
                 save[2] = save[2]&0x3f;
                 save[3] = save[3]&0x3f;
                 save[4] = save[4]&0x07;
                 save[5] = save[5]&0x1f;
                 for(k = 0; k<7; k++)
                 ReadTime(k);
                } 
           }
    while(T0==0); //防止重复计算按键按下的次数
}


void key3(void)interrupt 0
{
    delay();
    if(INT0 != 0) 
      return;
      enc=1;
 
  while(INT0==0);	
}
void keyc(void)
{   
       enc=0;
if(key1_down==1)
  {
    if(key3_down==0)//确定change/alarm的状态.
     {      
        key3_down=1;
        state=1;//状态确定.
            
	     if(change_alarm==1)
			{
			    for(k = 0; k<7; k++)
                 ReadTime(k);
				 dis_buf[15]=8;//显示8
			}
		else
			{   
                dis_buf[15]=8;     
			}
			
      }
    else//进入数码管数值变化
      {   
          if(change_alarm==0)
             {
                    switch(key2_time)
                      {
                        case 0:
                               break;
                        case 1:
						       save2[1]++;
                               if((save2[1]&0x0f) == 0x0a)
                                  save2[1] = (save2[1]&0xf0) + 0x10;
                               if(save2[1] == 0x60)
                                  save2[1] = 0;
                               ReadTime2(key2_time);
                               break;
                        case 2:
						       save2[2]++;
                               if((save2[2]&0x0f) == 0x0a)
                                   save2[2] = (save2[2]&0xf0) + 0x10;
                               if(save2[2] == 0x24)
                                   save2[2] = 0;
                               ReadTime2(key2_time);
                               break;
                       case 3:
					           save2[3]++;
                               if((save2[3]&0x0f) == 0x0a)
                                  save2[3] = (save2[3]&0xf0) + 0x10;
                               if(save2[3] == 0x32)
                                  save2[3] = 1;
                               ReadTime2(key2_time);
                               break;
                       case 4:
					          save2[4]++;
                              if((save2[4]&0x0f) == 0x0a)
                                 save2[4] = (save2[4]&0xf0) + 0x10;
                              if(save2[4] == 0x07)
                                 save2[4] = 0;
                              ReadTime2(key2_time);
                              break;
                      case 5:
                              break;
                      case 6:
                             break;
            
                    }
                   	     
         }//for if
                
        else//时钟调节
         {
                switch(key2_time)
                   {
				   case 0:
				           save[0]++;
                           if((save[0]&0x0f) == 0x0a)
                              save[0] = (save[0]&0xf0) + 0x10;
                           if(save[0] == 0x60)
                              save[0] = 0;
                           ReadTime(key2_time);
                           break;
                    case 1:
					       save[1]++;
                           if((save[1]&0x0f) == 0x0a)
                             save[1] = (save[1]&0xf0) + 0x10;
                           if(save[1] == 0x60)
                             save[1] = 0;
                           ReadTime(key2_time);
                           break;
                   case 2:
				           save[2]++;
                           if((save[2]&0x0f) == 0x0a)
                              save[2] = (save[2]&0xf0) + 0x10;
                           if(save[2] == 0x24)
                              save[2] = 0;
                           ReadTime(key2_time);
                           break;
                  case 3:
				           save[3]++;
                           if((save[3]&0x0f) == 0x0a)
                           save[3] = (save[3]&0xf0) + 0x10;
						   if(save[5]==0x01||save[5]==0x03||save[5]==0x05||save[5]==0x07||save[5]==0x08||save[5]==0x10||save[5]==0x12)
                           {
						       if(save[3] == 0x32)
                                  save[3] = 1;
   					       }
						  if(save[5]==0x04||save[5]==0x06||save[5]==0x09||save[5]==0x11)
						   {
						       if(save[3] == 0x31)
                                  save[3] = 1;
						   }
                           if(save[5]==0x02)
						   {
						       if(((save[6]&0x0f)+(save[6]>>4)*10)%4==0)//优先级
						         {
						             if(save[3] == 0x30)
                                        save[3] = 1;
						         }
						       else
						         {
						             if(save[3] == 0x29)
                                        save[3] = 1;
						         }
						    }
                         ReadTime(key2_time);
                         break;
                  case 4:
				         save[4]++;
                         if((save[4]&0x0f) == 0x0a)
                            save[4] = (save[4]&0xf0) + 0x10;
                         if(save[4] == 0x07)
                            save[4] = 0;
                         ReadTime(key2_time);
                         break;
                  case 5:
				         save[5]++;
                         if((save[5]&0x0f) == 0x0a) 
                            save[5] = (save[5]&0xf0) + 0x10;
                         if(save[5] == 0x13)
                            save[5]=1;
						 if(save[5]==2&&save[3]>=0x29)
						 {
						     if(((save[6]&0x0f)+(save[6]>>4)*10)%4!=0)//fei闰年
						     {
                              save[3]=1;
                              ReadTime(3);
    						 }
							 if(((save[6]&0x0f)+(save[6]>>4)*10)%4==0&&save[3]>=0x30)
							 {
                              save[3]=1;
                              ReadTime(3);
							 }
						 }
						 
                         ReadTime(key2_time);
                         break;
                 case 6:
				         save[6]++;
                         if((save[6]&0x0f) == 0x0a)
                            save[6] = (save[6]&0xf0)+0x10;
                         if(save[6] == 0xa0)
                            save[6] = 1;
                         ReadTime(key2_time);
                         break;
            
                       }//时钟调整。
               
          
                 }//调节状态结束            
          }  
     }//key1_down
}

void key2(void)interrupt 2
{
     delay();
     if(INT1==1)
     return;
       enb=1;
  while(INT1==0);
}

void keyb(void)
{
  enb=0;
if(key1_down==1)
    { 
       if(state==0)
         {
                 change_alarm=~change_alarm;
                 if(change_alarm==1)
                      {
                            dis_buf[13]=8;
                            dis_buf[14]=8;//显示88,表示时钟状态。
                            dis_buf[15]=11;//灭
                      }
                 else
                      {
                            dis_buf[13]=0;
                            dis_buf[14]=0;//显示00,表示报警状态。
                            dis_buf[15]=11;//灭
                       }  
        }
      else //数码管的选择 
       {    
	             key2_time++;
                 if(key2_time == 7)
                 key2_time = 0;
	     /*  state=1;
 	      if(change_alarm==1)
		  {
	             switch(key2_time)
                 {
                  case 0: dis_buf[10]=temp[0];dis_buf[11]=temp[1];break;
                  case 1: dis_buf[8]=temp[0];dis_buf[9]=temp[1];break;
                  case 2:dis_buf[6]=temp[0];dis_buf[7]=temp[1] ;break;
                  case 3: dis_buf[4]=temp[0];dis_buf[5]=temp[1];break;
                  case 4: dis_buf[12]=temp[0];break;
                  case 5: dis_buf[2]=temp[0];dis_buf[3]=temp[1];break;
                  case 6: dis_buf[0]=temp[0];dis_buf[1]=temp[1];break;     
                 } 			
                 key2_time++;
                 if(key2_time == 7)
                 key2_time = 0;
			  
			     switch(key2_time)
                 { 
                  case 0: temp[0]=dis_buf[10];temp[1]=dis_buf[11];dis_buf[10]=11;dis_buf[11]=11;break;
                  case 1: temp[0]=dis_buf[8];temp[1]=dis_buf[9];dis_buf[8]=11;dis_buf[9]=11;break;
                  case 2:temp[0]=dis_buf[6];temp[1]=dis_buf[7];dis_buf[6]=11;dis_buf[7]=11 ;break;
                  case 3: temp[0]=dis_buf[4];temp[1]=dis_buf[5];dis_buf[4]=11;dis_buf[5]=11;break;
                  case 4: temp[0]=dis_buf[12];dis_buf[12]=11;break;
                  case 5: temp[0]=dis_buf[2];temp[1]=dis_buf[3];dis_buf[2]=11;dis_buf[3]=11;break;
                  case 6: temp[0]=dis_buf[0];temp[1]=dis_buf[1];dis_buf[0]=11;dis_buf[1]=11;break;     
                } 
		}
		else
		{

                switch(key2_time)
                 {
                   case 0: break;
                   case 1: dis_buf2[8]=temp2[0];dis_buf2[9]=temp2[1];break;
                   case 2: dis_buf2[6]=temp2[0];dis_buf2[7]=temp2[1] ;break;
                   case 3: dis_buf2[4]=temp2[0];dis_buf2[5]=temp2[1];break;
                   case 4: dis_buf2[12]=temp2[0];break;
                   case 5: break;
                   case 6: break;     
                 } 			
                 key2_time++;
                 if(key2_time == 7)
                 key2_time = 0;
			  
			     switch(key2_time)
                 {
                  case 0: break;
                  case 1: temp2[0]=dis_buf2[8];temp2[1]=dis_buf2[9];dis_buf2[8]=11;dis_buf2[9]=11;break;
                  case 2: temp2[0]=dis_buf2[6];temp2[1]=dis_buf2[7];dis_buf2[6]=11;dis_buf2[7]=11 ;break;
                  case 3: temp2[0]=dis_buf2[4];temp2[1]=dis_buf2[5];dis_buf2[4]=11;dis_buf2[5]=11;break;
                  case 4: temp2[0]=dis_buf2[12];dis_buf2[12]=11;break;
                  case 5: break;
                  case 6: break;     
                } 

		  }
       }//位移结束*/
	  }	
    }//key1_down;  
}

/************************IC PROCESING***************************/

void ic_start(void)
{   //SDA位于高电平时,将SCL拉低,时钟芯片和单片机开始传输通信
    SDA=1;
   SCL=1;
   nop;
   nop;
  
   SDA=0;
   nop;
   nop;
  

   SCL=0;
    nop;
    nop;
    nop;
	nop;
    nop;
}
void ic_end(void)

⌨️ 快捷键说明

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