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

📄 clock.c

📁 电子中开发程序 有图
💻 C
📖 第 1 页 / 共 2 页
字号:
		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)  //zm无按键
	 { 
		 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,到50时归零。
									   else if(show_status==4) 
									   hour=(hour+1)%24;       //当前时间的"时"加1,到24时归零。
									   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;   //启用标志位切换
						 }
					return;
					 }
 					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=4000;
 													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;
							}
					return;
					}
					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) 
								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=59;  sec=30;  year=8;  month=4;  day=2;
	count_down=4000;
	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[2].h=0;//zm
	   alarm[2].m=0;//zm


	  	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;                  //禁止所有中断
		TMOD=0x12;             //定时器0为模式2,定时器1为模式1
		TH0=6;    
		TL0=6;                 //定时器0为0.125ms
		TH1=0x15; 
		TL1=0xa0;              //定时器1为30ms
		TR0=1;    TR1=1;       //启动定时器0和定时器1
		ET0=1;  
		ET1=1;    
		EA=1;  				   //开定时器0中断?定时器1中断和总中断
	while(1)
	{
		if(led_on)
	 	for(i=0;i<8;i++)
		{ 
	 		//P2=0;
			P2=0xff;//zm
		if(flash || attr&(0x80>>i)) 
	 		
			{ 
		 	 	P0=display[i];  //zm原无[i] ,显示不正常,均为0			//
		 	 	P2=~(0x80>>i); DelayX1ms(1); 
				
			} 
		}
		else  P2=0xff;//zmP2=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 + -