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

📄 原始.txt

📁 可设置八个闹钟的智能时钟程序
💻 TXT
📖 第 1 页 / 共 2 页
字号:

void Timer1ISR(void) interrupt 3 using 2		//定时器2中断,用于按键扫描
{unsigned char keytmp;
 char tmp;

  TH1=0x15; TL1=0xa0;      // 每30ms中断一次

                 /***  当前显示的内容 ***/
  if(show_status==0)   //当前正在设置闹钟项
    { display[0]=cur_alarm_set;               display[1]=0xf;
     display[2]=alarm[cur_alarm_set].h/10;      display[3]=alarm[cur_alarm_set].h%10;
	 display[4]=alarm[cur_alarm_set].m/10;      display[5]=alarm[cur_alarm_set].m%10;
     display[6]=(alarm_wk>>cur_alarm_set)&1;  display[7]=(alarm_en>>cur_alarm_set)&1;
     }

  if(show_status==1 || show_status==3)         //当前显示或设置日期
    { display[0]=year/10;	  display[1]=year%10;	  display[2]=month/10;	  
	  display[3]=month%10;    display[4]=day/10;	  display[5]=day%10;
	  display[6]=0xf;         display[7]=weekday;
     }

  if(show_status==2 || show_status==4)         //当前显示或设置时间
    { display[0]=hour/10;	  display[1]=hour%10;	  display[2]=min/10;
 	  display[3]=min%10;	  display[4]=sec/10;	  display[5]=sec%10;
	  display[6]=0xf;	      display[7]=0xf;   //最后两后无显示
	 }

                    /***  按键扫描及处理  ***/
  keytmp=~(P1) & 0x0f;
  if(keytmp==0)  { km=0;  kp=0; }   
  else 
   { if(km==0)   km=1;   
	 else
     { if(kp==0)
        { kp=1;
		  if(keytmp==1)			//第一个按钮
		   { if(sound) { alarm_stop=1; sound=0; }   	//如果闹钟正响,按此键停止
		     else if((show_status==1 || show_status==2) && led_on)  //正显示日期或时间
		     { show_status=0;  cur_alarm_set=0;  attr=0x3f; }  //进入闹钟设置
			 else if(show_status==0)                //如正在设置闹钟时间项
			 { show_status=2;  new_alarm_info=1; attr=0xff; }  //返回当前时间显示
			 return;
			}
		     
		  if(keytmp==2 && led_on)    //第二个按钮,仅当数码管打开时有效
		   { switch(attr)
		     { case 0xff: if(show_status==1) show_status=2;   //在显示时间与日期间切换
			           else if(show_status==2) show_status=1;  
					   break;  
			   case 0x3f: if(show_status==0) cur_alarm_set=(cur_alarm_set+1)%8;
                      else if(show_status==3) 
                             year=(year+1)%50;       //当前日期的“年”加1
	              else if(show_status==4) 
                         hour=(hour+1)%24;       //当前时间的“时”加1
		              break;    
	   case 0xcf: if(show_status==0) 		       //闹钟设置的“时”加1
  alarm[cur_alarm_set].h=(alarm[cur_alarm_set].h+1)%24;
            else if(show_status==3) 
   { month++;                //当前日期的“月”加1
     if(month==13) month=1; } 
	                    else if(show_status==4) 
                            min=(min+1)%60;         //当前时间的“分”加1
			            break;  
                case 0xf3: if(show_status==0) 
                           alarm[cur_alarm_set].m=(alarm[cur_alarm_set].m+1)%60;
                         else if(show_status==3) 
                           {day++;                  //当前日期的“日”加1
                            if(day==32) day=1; }
                         else if(show_status==4) 
                           {count_down=8000; 
                            sec=(sec+1)%60; }        //当前时间的“秒”加1
		                break;                 
            case 0xfd: if(show_status==0)
			                 alarm_wk^=0x1<<cur_alarm_set;   //周末标志位切换
						  break;
			    case 0xfe: if(show_status==0)
			                 alarm_en^=0x1<<cur_alarm_set;   //启用标志位切换
			  }       //end of switch(attr)
			 return;
			}         //end of if(keytmp==1)

		  if(keytmp==4)		//第三个按钮
		   { switch(attr)
		     { case 0xff: if(show_status==1 || show_status==2) 
			              led_on=~led_on;        //打开或关闭数码管显示
						  break; 
			   case 0x3f: if(show_status==0)         //如果正在设置闹钟
						   { if(cur_alarm_set==0)  cur_alarm_set=7; 
                             else cur_alarm_set--;}
                        else if(show_status==3)     //当前日期的“年”减1
			               { if(year==0)  year=49;  else year--; }
			            else if(show_status==4)     //当前时间的“时”减1
						   { tmp=hour-1;  if(tmp<0) hour=23;  else  hour=tmp;  }
				          break;
			   case 0xcf: if(show_status==0)          //闹钟设置的“时”减1
						   { tmp=alarm[cur_alarm_set].h-1;
						     if(tmp<0)    alarm[cur_alarm_set].h=23;
							 else         alarm[cur_alarm_set].h=tmp;
							}
                          else if(show_status==3)          
			               { month--;             //当前日期的“月”减1
                             if(month==0)  month=12; }
						  else if(show_status==4)          
                           { tmp=min-1;           //当前时间的“分”减1
                            if(tmp<0) min=59;   else  min=tmp;   }
   						  break;
			   case 0xf3: if(show_status==0)          //闹钟设置的“分钟”减1
						   { tmp=alarm[cur_alarm_set].m-1;
						     if(tmp<0)    alarm[cur_alarm_set].m=59;
							 else         alarm[cur_alarm_set].m=tmp;
							}
                          else if(show_status==3)      
			               { day--;                 //当前日期的“日”减1
                             if(day==0)  day=31; }
						  else if(show_status==4)         
                           { tmp=sec-1;             //当前时间的“秒”减1
                             count_down=8000;
                             if(tmp<0) sec=59;   else  sec=tmp; }
						  break;
			   case 0xfd: if(show_status==0)			  //切换周末标志
			                 alarm_wk^=0x1<<cur_alarm_set;
						  break;
			   case 0xfe: if(show_status==0)			  //切换启用标志
			                 alarm_en^=0x1<<cur_alarm_set;
			  }       //end of switch(attr)
			 return;
			}         //end of if(keytmp==2)

		  if(keytmp==8 & led_on)    //第四个按钮,仅当数码管打开时有效
		   { switch(attr)
			 { case 0xff: if(show_status==1) 		//如果当前显示日期
                         show_status=3;       //切换到调准日期状态
			          else if(show_status==2) 	//如果当前显示时间
                          show_status=4;      //切换到调准时间状态
					  attr=0x3f; break;			//第一、二个数码管闪烁
			   case 0x3f: attr=0xcf; break;		//第三、四个数码管闪烁
			   case 0xcf: attr=0xf3; break;		//第五、六个数码管闪烁
			   case 0xf3: if(show_status==0) attr=0xfd;   //第七个数码管闪烁
                        else if(show_status==3) 
                           { show_status=1; attr=0xff; }  //恢复正常显示日期
			            else if(show_status==4) 
                            { show_status=2; attr=0xff; }  //恢复正常显示时间
						break;
			   case 0xfd: if(show_status==0) attr=0xfe;     //第八个数码管闪烁
			              break;
			   case 0xfe: if(show_status==0) attr=0x3f;     //第一、二个数码管闪烁
			 }
			}   // end of if(keytmp==4)
		 }      // end of if(kp==0)
  	  }         // end of if(km==0)
   }            // end of if(keytmp!=0)
}

main()
{unsigned char i;

  hour=23;  min=58;  sec=30;  year=2;  month=4;  day=25;
  count_down=8000;

  flash=0;    attr=0xff;      led_on=1;
  km=0;     kp=0;          show_status=2;     //加电后显示当前时间

  new_alarm_info=0;  sound=0;   alarm_stop=0;   
  
  for(i=0;i<8;i++)           //从EEPROM中读入8个闹钟设置
    { alarm[i].h=myread(i*2);  alarm[i].m=myread(i*2+1); }  
      alarm_en=myread(i*2);        alarm_wk=myread(i*2+1);

  IE=0;  IP=0;             //disable all interrupt and lower priority
  TMOD=0x12;             //timer 0 is set to mode 2,auto_reloading,timer1,mode 1
  TH0=6;    TL0=6;        //timer0 parameters for 0.125ms
  TH1=0x15; TL1=0xa0;      //timer1 parameters for 30ms
  TR0=1;    TR1=1;        //timer0 interrupt most important
  ET0=1;    ET1=1;    EA=1;     //enable interrupt function

  while(1)
  { if(led_on)
      for(i=0;i<8;i++)
	   { P2=0; 
         if(flash || attr&(0x80>>i))  
		   { P0=display[i];  P2=0x80>>i; DelayX1ms(1); }
		}
    else  P2=0;   

    if(new_alarm_info)
     { P2=0;                  //暂时关闭数码管
	   new_alarm_info=0;      //写入EEPROM
       for(i=0;i<8;i++)  { mywrite(i*2,alarm[i].h);  mywrite(i*2+1,alarm[i].m); }  
	   mywrite(i*2,alarm_en);   mywrite(i*2+1,alarm_wk);
	  }
  }   
}

⌨️ 快捷键说明

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