📄 main.c
字号:
//===========================================================================
//
// 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 + -