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

📄 main.c

📁 SpeechClock是在凌阳提供的电子钟的范例的基础之上实现的电子时钟的源程序 调试环境:unSPIDE184 运行设备:SPCE061A+LED&KEY模板 功能:时钟显示(日期与时间) L
💻 C
📖 第 1 页 / 共 2 页
字号:
//===========================================================================
//
//        The information contained herein is the exclusive property of
//      Sunplus Technology Co. And shall not be distributed, reproduced,
//      or disclosed in whole in part without prior written permission.
//
//            (C) COPYRIGHT 2001   SUNPLUS TECHNOLOGY CO.
//                           ALL RIGHTS RESERVED
//
//    The entire notice above must be reproduced on all authorized copies.
//
//============================================================================
//  工程名称:   Time.scs;	Time.spj  "语音播报电子钟"
//  功能描述:    结合"61板"的三个按键完成带有语音播报功能的电子钟:
//		1、KEY1--按一下播放年、月、日,再按一下播放时、分;(I/O口A0)
//		   		   连续按3s,则进入调整状态;调整状态下调整内容的切换
//		2、KEY2--年、月、日、时、分的增加(I/O口A0)
//		3、KEY3--年、月、日、时、分的减少(I/O口A0)
//		在校正时间的状态下,如果连续1分钟键没有被按下,则自动退出
//  文件来源:   61板说明书
//  IDE环境:   SUNPLUS u'nSPTM  IDE 1.8.0(or later)
//
//  涉及的库:	(a) C-Lib:  (CMacro.lib);
//            	(b) SACM-Lib: SacmV25.lib;Sacmv32e.lib
//	硬件连接:  针对配合SPCE061A精简开发板使用
//  组成文件:
//    	main.c
//		FIQ.asm/key.asm/system.asm
//     	hardware.asm/Resource.asm
//		Time.h/Resource.inc
//  日期:          	2003-5-22(建立)
//					2003-6-16(添加版本说明及版权声明)
//					2003-7-16(代码标准化)
//==============================================================================
#include "a2000.h"
#include "consist.h"
#define P_WatchDog_Clear (volatile unsigned int *)0x7012
#define P_IOA_Data (volatile unsigned int *)0x7000
#define P_IOA_Buffer (volatile unsigned int *)0x7001
#define P_IOA_Dir (volatile unsigned int *)0x7002
#define P_IOA_Attrib (volatile unsigned int *)0x7003
#define P_IOB_Data (volatile unsigned int *)0x7005
#define P_IOB_Buffer (volatile unsigned int *)0x7006
#define P_IOB_Dir (volatile unsigned int *)0x7007
#define P_IOB_Attrib (volatile unsigned int *)0x7008

unsigned int SpeechAdjustTemp=0; //读时间中间变量
unsigned int Key=0; 			 //保存键盘扫描程序中取得的键值,若为连续按键,则最高位为1
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 Disp_Dig=0;		 //LED显示的位
unsigned int DateOrTime=0;		 //LED显示标志,=1显示Date
unsigned int i=0;
unsigned int j=0;

//作息时间表                           
unsigned int gTimeVSShem[2]={0x061e,0x1628};     	//6:30,10:40                        
//段码值
const int Disp[10] = { 0x003F,0x0006,0x005B,0x004F,0x0066,
                      0x006D,0x007D,0x0007,0x007F,0x006F};
//LED显示缓冲区
unsigned int LED_Date[6];		//六位的日期(年月日)缓冲区
unsigned int LED_Time[6];		//六位的时间(时分秒)缓冲区
unsigned int *Disp_Pointer;		//指向需显示的缓冲区(在这里LED_Date或LED_Time)

//************************播放提示语音*********************//
//input: 播放序号
//*********************************************************//
void PlayRespond(unsigned int Result)      
{  
   SACM_A2000_Initial(1);
   SACM_A2000_Play(Result,3,3);
   while((SACM_A2000_Status()&0x0001) != 0)
    { Clear_WatchDog();
	  __asm("IRQ OFF");
	  SACM_A2000_ServiceLoop(); 
	  __asm("IRQ ON");
    }
   SACM_A2000_Stop();
}

//***************语音报时**********************************//
//函数:PlayAdjustTime(AdjustTemp)
//描述:调用子函数:
//     ReadRealYear():		年---16进制  低14位
//     ReadRealMonthDay():	月----高8位  日---低8位 16进制 
//     ReadRealHourMin(): 	时----高8位  分---低8位  16进制 
//     ReadRealSecond():  	秒  16进制 
//参数:0---年;1---月;2--日;3--时;4---分;5---秒
//返回:无
//*********************************************************//
 PlayAdjustTime(AdjustTemp)	  		//*************调整时间播放      
{   	
	*P_WatchDog_Clear=1;
	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;
//	   case 5:     //秒
//	     SpeechAdjustTemp=ReadRealSecond();
//		 PlaySpeakSecond(SpeechAdjustTemp);
//	     break;
	   case 5: break;
	   default:  break;
	 } 
}
//***************语音报时子函数****************************//
//函数:PlayAdjustTime(AdjustTemp)
//描述:调用子函数:
//     PlaySpeakYear():		报年
//     PlaySpeakMonth():	报月
//     PlaySpeakDay(): 	    报日
//     PlaySpeakHour():  	报时
//	   PlaySpeakMinute():   报分
//参数:年;月;日;时;分;数据均为16进制
//返回:无
//*********************************************************//
//input: 年-----16进制
//*********************************************************//
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);
}

//input:月------16进制
//*********************************************************//
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);       
}

//input:日 ------16进制
//*********************************************************//
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);
}
 
//input: 时------16进制
//*********************************************************//    
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<=23) 
	      {   PlayRespond(C_NIGHT);     						//20--23 晚上8--11
		    switch(DayTemp)
			{  case 22:PlayRespond(C_T10); break;   			//十点
			   case 23:PlayRespond(C_T11); break;  				//十一点
			   default: PlayRespond(DayTemp-12+C_T00);break;
		    }
	      }
	 else if(DayTemp==0){										//0		晚上12
	 		   PlayRespond(C_NIGHT);    
	 		   PlayRespond(C_T12); 					  			//十二点	 		   
	 		   }
	 PlayRespond(C_DIAN);      									//点
}
//input: 分 ------16进制
//*********************************************************//
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);     //分
        }       
} 
//input:秒------16进制
//*********************************************************//
PlaySpeakSecond(int SecondTemp)    //*************秒
{ 	if(SecondTemp == 0)     PlayRespond(SecondTemp + C_T00);   //0秒
	if((SecondTemp/10)>1)   PlayRespond(SecondTemp/10+C_T00);  //秒的十位大于1报,为1只报十 
    if((SecondTemp/10)> 0)  PlayRespond(C_T10);    
    if((SecondTemp%10)!= 0) PlayRespond(SecondTemp%10+C_T00);

⌨️ 快捷键说明

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