www.pudn.com > SpeechClock11654.rar > main.c


//======================================================== 
//	The information contained herein is the exclusive property of 
//	Sunnnorth Technology Co. And shall not be distributed, reproduced, 
//	or disclosed in whole in part without prior written permission. 
//	(C) COPYRIGHT 2003 SUNNORTH TECHNOLOGY CO. 
//	ALL RIGHTS RESERVED 
//	The entire notice above must be reproduced on all authorized copies. 
//======================================================== 
 
//======================================================== 
//	工程名称:	Time 
//	功能描述:	结合"61板"的三个按键完成带有语音播报功能的电子钟: 
//		1、KEY1--按一下播放年、月、日,再按一下播放时、分;(I/O口A0) 
//		   连续按3s,则进入调整状态;调整状态下调整内容的切换 
//		2、KEY2--年、月、日、时、分的增加(I/O口A1) 
//		3、KEY3--年、月、日、时、分的减少(I/O口A2) 
//  IDE环境:   SUNPLUS u'nSPTM  IDE 1.8.0(or later) 
//	涉及的库:	CMacro.lib,sacmv26e.lib 
//	组成文件:	main.asm 
//				FIQ.asm,key.asm,system.asm,hardware.asm,Resource.asm 
//				a2000.h,consist.h,hardware.h,Time.h 
//				a2000.inc,hardware.inc,Resorce.inc 
//	硬件连接:	配合SPCE061A精简开发板使用 
//	维护记录:	2003-5-22(建立) 
//				2003-6-16(添加版本说明及版权声明) 
//				2003-7-16(代码标准化) 
//				2005-10-26(更换新的语音库) 
//======================================================== 
 
//======================================================== 
//	文件名称:	main.c 
//	功能描述:	语音播报功能的电子钟主函数 
//	维护记录:	2003-05-22	(建立) 
//				2003-06-16	(添加版本说明及版权声明) 
//				2003-07-16	(代码标准化) 
//				2005-10-26	(更换新的语音库) 
//======================================================== 
 
#include "a2000.h" 
#include "consist.h" 
unsigned int SpeechAdjustTemp=0; //读时间中间变量 
unsigned int Key=0;  
unsigned int KeyPressFlag=0;     //有键按下标志 
unsigned int TimeCount = 0;      //两分钟计时单元 
unsigned int SleepFlag=0;        //睡眠标志 
unsigned int TimeChangeCount=0;  //校时状态下按键计时 
 
unsigned int KeyStatus=0;        //校时状态还是报时状态,1-----校时 
unsigned int KeyAdjust=0;        //0-YY 1-MM 2-DD 3-hh 4-mm 5-ss 6-exit 
unsigned int YearOrTime=0;       //报时  1----year   0----time 
unsigned int TimeChangeKey = 0;  //校时状态下加减标志 
unsigned int KeyCount=0;		 //按键计数单元 
unsigned int SecondAddOne=0;     
unsigned int HourMinTemp=0;      //读时、分 
unsigned int i=0; 
unsigned int j=0; 
 
unsigned int gTimeVSShem[16]={0x0800,0x0832,0x0900,0x0932,0x0934,	//作息时间表 
                              0x0a05,0x0a0a,0x0b00,0x0b0a,0x0c00, 
                              0x0d1e,0x0e14,0x0e1e,0x0f14,0x0f15, 
                              0x0f32};                              
 
//======================================================== 
//	C格式:		PlayRespond(unsigned int Result); 
//	实现功能:	语音播放函数 
//	入口参数:	unsigned int Result ——播放序号 
//	出口参数:	无 
//	破坏寄存器:无 
//======================================================== 
void PlayRespond(unsigned int Result)       
{  SACM_A2000_Initial(1); 
   SACM_A2000_Play(Result,3,3); 
   while((SACM_A2000_Status()&0x0001) != 0) 
    { Clear_WatchDog(); 
	  SACM_A2000_ServiceLoop();  
    } 
   SACM_A2000_Stop(); 
} 
//======================================================== 
//	C格式:		Delay3ms(); 
//	实现功能:	3ms 延时 
//	入口参数:	无 
//	出口参数:	无 
//	破坏寄存器:无 
//========================================================= 
void  Delay3ms() 
{ 
    int delaytemp=0; 
	for(delaytemp=0;delaytemp<0xFFFF;delaytemp++) 
	; 
} 
 
//======================================================== 
//	C格式:		PlayAdjustTime(AdjustTemp); 
//	实现功能:	调整语音提示 
//	入口参数:	AdjustTemp——播放选择 
//				0---播放年; 
//				1---播放月; 
//				2---播放日; 
//				3---播放时; 
//				4---播放分; 
//	出口参数:	无 
//	破坏寄存器:无 
//========================================================= 
 
 PlayAdjustTime(AdjustTemp)	  						//调整时间播放       
{   	 
	switch(AdjustTemp) 
	 {   
	   case 0:    									//年                
		 SpeechAdjustTemp=ReadRealYear(); 
         PlaySpeakYear(SpeechAdjustTemp); 
		 break; 
	   case 1:    									//月  
		 SpeechAdjustTemp=ReadRealMonthDay(); 
         PlaySpeakMonth(SpeechAdjustTemp>>8); 
		 break; 
	   case 2:     									//日 
		 SpeechAdjustTemp=ReadRealMonthDay(); 
		 PlaySpeakDay(SpeechAdjustTemp & 0x00ff); 
		 break; 
	   case 3:     									//时 
	     SpeechAdjustTemp=ReadRealHourMin(); 
         PlaySpeakHour(SpeechAdjustTemp>>8); 
         break; 
	   case 4:     									//分 
		 SpeechAdjustTemp=ReadRealHourMin(); 
		 PlaySpeakMinute(SpeechAdjustTemp & 0x00ff); 
		 break; 
	   default:  break; 
	 }  
} 
 
//======================================================== 
//	C格式:		PlaySpeakYear(int YearTemp); 
//	实现功能:	年语音播报 
//	入口参数:	int YearTemp——年 
//	出口参数:	无 
//	破坏寄存器:无 
//========================================================= 
PlaySpeakYear(int YearTemp)   	//*************年 
{   
   PlayRespond((YearTemp/1000)+C_T00); 
   PlayRespond((YearTemp%1000)/100+C_T00); 
   PlayRespond((YearTemp%100)/10+C_T00); 
   PlayRespond((YearTemp%10)+C_T00); 
   PlayRespond(C_YEAR); 
} 
//======================================================== 
//	C格式:		PlaySpeakMonth(int MonthTemp); 
//	实现功能:	月语音播报 
//	入口参数:	int MonthTemp——月 
//	出口参数:	无 
//	破坏寄存器:无 
//========================================================= 
PlaySpeakMonth(int MonthTemp)    
{  
	if(MonthTemp<10)  PlayRespond(MonthTemp+C_T00); 
	else if(MonthTemp==10)  PlayRespond(C_T10); 
	else if(MonthTemp==11)  PlayRespond(C_T11); 
	else if(MonthTemp==12)  PlayRespond(C_T12); 
    PlayRespond(C_MONTH);        
} 
//======================================================== 
//	C格式:		PlaySpeakDay(int DayTemp); 
//	实现功能:	日语音播报 
//	入口参数:	int DayTemp——日 
//	出口参数:	无 
//	破坏寄存器:无 
//========================================================= 
PlaySpeakDay(int DayTemp)     
{ 	 if((DayTemp/10)> 1)   PlayRespond(DayTemp/10+C_T00);		//十位>1报  
     if((DayTemp/10)>0)    PlayRespond(C_T10);   				//报十,十位为1不报1  
     if((DayTemp%10)!= 0)  PlayRespond(DayTemp%10+C_T00); 
     PlayRespond(C_DAY); 
} 
//======================================================== 
//	C格式:		PlaySpeakHour(int DayTemp); 
//	实现功能:	时语音播报 
//	入口参数:	int DayTemp——时 
//	出口参数:	无 
//	破坏寄存器:无 
//========================================================= 
PlaySpeakHour(int DayTemp)     //*************时 
{	 	                 
	 if(DayTemp>=1 && DayTemp<=7)  
	   	{ PlayRespond(C_LINGCHEN);      		 				//1—7 凌晨 
		  if(DayTemp==2)  PlayRespond(C_S02);    				//两 
		  else  PlayRespond(DayTemp+C_T00);    
	     } 
	      
	  else if(DayTemp>=8 && DayTemp<=12)  
		  {   PlayRespond(C_NOON);     							//8--12 上午 
			  switch(DayTemp) 
			  { case 10:PlayRespond(C_T10); break;  			//十点 
			    case 11:PlayRespond(C_T11); break;  			//十一点 
			    case 12:PlayRespond(C_T12); break;  			//十二点 
			    default: PlayRespond(DayTemp+C_T00);break; 
		      } 
           }	            
	 else if(DayTemp>=13 && DayTemp<=19)  
		 { PlayRespond(C_AFTERNOON);       						//13--19 下午1--7 
		   if(DayTemp==14)  PlayRespond(C_S02);  				//两 
		   else  PlayRespond(DayTemp-12+C_T00);  
	     } 
	    
	 else if(DayTemp>=20 && DayTemp<=24)  
	      {   PlayRespond(C_NIGHT);     						//20--24 晚上8--12 
		    switch(DayTemp) 
			{  case 22:PlayRespond(C_T10); break;   			//十点 
			   case 23:PlayRespond(C_T11); break;  				//十一点 
			   case 24:PlayRespond(C_T12); break;   			//十二点 
			   default: PlayRespond(DayTemp-12+C_T00);break; 
		    } 
	      } 
	 PlayRespond(C_DIAN);      									//点 
} 
//======================================================== 
//	C格式:		PlaySpeakMinute(int MinTemp); 
//	实现功能:	分语音播报 
//	入口参数:	int MinTemp——分 
//	出口参数:	无 
//	破坏寄存器:无 
//========================================================= 
PlaySpeakMinute(int MinTemp) 
{ 
       if(MinTemp==0)  PlayRespond(C_ZHENG);     			   	//正点 
       else   
       {   if((MinTemp/10)>1)   PlayRespond(MinTemp/10+C_T00); 	//分的十位 
           if((MinTemp/10) >0)  PlayRespond(C_T10);     	   	//分的十位大于1报,为1不报1 
           if((MinTemp%10)!=0)  PlayRespond(MinTemp%10+C_T00); 	//分的个位不为0则报     
           PlayRespond(C_MIN);     								//分 
        }        
}  
//======================================================== 
//	C格式:		SpeakTime(TimeType); 
//	实现功能:	实时播报 
//	入口参数:	TimeType——播报判断 
//				0----播报年、月、日 
//				1----播报时、分 
//	出口参数:	无 
//	破坏寄存器:无 
//========================================================= 
void SpeakTime(TimeType) 
{ 
  if(TimeType == 0x01) 
   { 
     PlayAdjustTime(CON_YEAR);   						//年 
     PlayAdjustTime(CON_MONTH);  						//月 
     PlayAdjustTime(CON_DAY);    						//日 
   }    
  else 
   { 
	 PlayRespond(C_BELL);         						//报时声   
     PlayRespond(C_NOW);          						//现在时刻 
     PlayAdjustTime(CON_HOUR);    						//时 
     PlayAdjustTime(CON_MINUTE);  						//分 
   } 
} 
//======================================================== 
//	文件名称:	main.c 
//	功能描述:	语音播报功能的电子钟主函数 
//	维护记录:	2003-05-22	(建立) 
//				2003-06-16	(添加版本说明及版权声明) 
//				2003-07-16	(代码标准化) 
//				2005-10-26	(更换新的语音库) 
//======================================================== 
int main() 
{   
	System_Initial(); 
       
     while(1) 
        {	   
		   Key_Scan_ServiceLoop();        				//键盘扫描 		 
 
           if(Key==1 && KeyStatus==0 )   				//keystate 校时状态还是报时状态,1-----校时 
			{  
              	KeyCount=1;                				//按键计数单元 
		      	Key=0;    
			 } 
		   if(Key==0x8001 && KeyStatus==0 )              
		     {  
			    KeyCount++;  
			    Key=0; 
		     } 
		    
           if (KeyPressFlag==0 && KeyCount>0 )     
			{  
			    if(KeyCount<20)      					//报时 
			   		{  
				   		YearOrTime=YearOrTime ^ 0x01; 	//报年月日或时分:报时  1----year   0----time 
                 		SpeakTime(YearOrTime); 
				 		KeyCount=0; 
			    	} 
               	else if(KeyCount>=20)   				//进入调整时间状态 
			   		{	 
						 KeyCount=0; 
						 KeyStatus=1; 
						 KeyAdjust=0; 
						 TimeCount = 0; 
						 Start256HzRTC();  
				         PlayAdjustTime(KeyAdjust); 
			   		} 
		    }     
		  
			if(KeyStatus==1)            				//keystate 校时状态还是报时状态,1-----校时 
			{ 
		 	  switch(Key) 
				{ 
				  case 1: 
					    KeyAdjust++; 
					    if(KeyAdjust == 5) 				//KeyAdjust:0-YY 1-MM 2-DD 3-hh 4-mm 5-ss 6-exit 
						{  
						  	KeyStatus=0; KeyAdjust=0;  
						  	PlayAdjustTime(CON_YEAR);   //年 
		                  	PlayAdjustTime(CON_MONTH);  //月 
		                  	PlayAdjustTime(CON_DAY);    //日 
		                  	PlayAdjustTime(CON_HOUR);   //时 
				          	PlayAdjustTime(CON_MINUTE); //分 
					 	  	Stop256HzRTC();  
						} 
					        else 
					        PlayAdjustTime(KeyAdjust); 
					        Key=0; 
					        TimeCount = 0; 
					        TimeChangeKey=0;	 
						    break; 
					 
				 case 2: 
					   		Adjust_Time_Up(KeyAdjust); 
					   		TimeChangeCount = 0; 		//调校时间状态下,有键按下,计时器清0 
					   		TimeChangeKey=1;     		//调校时间状态下,有加减键按下标志 
					   		TimeCount = 0;       		//两分钟计时单元 
					   		Key=0; 
					   		break; 
					    
			   	 case 4: 
				       		Adjust_Time_Down(KeyAdjust);//KeyAdjust:0-YY 1-MM 2-DD 3-hh 4-mm 5-ss 6-exit 
					   		TimeChangeCount = 0; 
					   		TimeChangeKey=1; 
					   		TimeCount = 0;       		//两分钟计时单元 
					   		Key=0; 
					   		break;  	      
					     
			      			default: 
					    	break; 
			  } 
			if(TimeChangeKey==1 && TimeChangeCount > 40)  
			  {  
				TimeChangeKey=0; 
				PlayAdjustTime(KeyAdjust);  
			  } 
					 
			   if(TimeCount > 120)  
			  {  
				KeyStatus=0;  
				KeyAdjust=0;  
			  }	  
		  }        
	    Calendar_Counter();     						//调整万年历 
	    if(SecondAddOne==0xFFFF) 						//分加1时,与作息时间比较 
		{ 
			SecondAddOne=0; 
			HourMinTemp=ReadRealHourMin(); 
			for(i=0;i<16;i++)        					//作息时间 
			 if(HourMinTemp==gTimeVSShem[i])   
			{  
				for(j=0;j<15;j++) 
				{ 
					LightOn();   						//LED闪烁15次 
					Delay3ms(); 
					LightOff(); 
					Delay3ms(); 
				} 
			  break; 
			} 
		}	 
	    
	   if(SleepFlag == 0x01 && KeyStatus == 0 )  
	      SP_GoSleep();        							// 进入睡眠模式                
    } 
}