📄 speech.c
字号:
//========================================================
// 文件名称: Speech.c
// 功能描述: MusicBox.spj工程播放语音的文件
// 维护记录: 2005-12-14 v1.0
//========================================================
#include "spce061a.h"
#include "a2000.h"
#include "spr4096_user.h"
#include "key.h"
#include "LCD1602_User.h"
#define BASE_START_ADDRESS 0x0012
#define BASE_END_ADDRESS 0x0016
unsigned int g_uiDAC;
extern unsigned int g_uiIndex;
extern unsigned int g_uiData[];
//========================================================
// 语法格式: void Delay(unsigned int uitime)
// 实现功能: 延时
// 参数: 延时时间
// 返回值: 无
//========================================================
void Delay(unsigned int uitime)
{
while(uitime > 0)
{
uitime--;
*P_Watchdog_Clear = 0x0001;
*P_Watchdog_Clear = 0x0001;
*P_Watchdog_Clear = 0x0001;
*P_Watchdog_Clear = 0x0001;
*P_Watchdog_Clear = 0x0001;
*P_Watchdog_Clear = 0x0001;
*P_Watchdog_Clear = 0x0001;
*P_Watchdog_Clear = 0x0001;
*P_Watchdog_Clear = 0x0001;
}
}
//========================================================
// 语法格式: void PlaySnd_A2000(void)
// 实现功能: A2000放音函数
// 参数: SndIndex:语音放音序号
// DAC_Channal:选择DA通道
// 返回值: 无
//========================================================
void PlaySnd_A2000(void)
{
unsigned int uiStatus; // 语音播放状态
unsigned int uiRet; // 存储语音资源
unsigned int uiKey; // 键盘值
unsigned int uiTemp;
unsigned long ulCon_AddrHighest; // 语音资源的最高字节地址
unsigned long ulCon_AddrHigh; // 语音资源的高字节地址
unsigned long ulCon_AddrLow; // 语音资源的低字节地址
unsigned long ulCon_AddrLowest; // 语音资源的最低字节地址
unsigned long ulCon_EndAddr; // 语音资源的末地址
unsigned long ulCon_StartAddr;
L_Addr:
ulCon_AddrHighest = SP_SIOReadAByte(BASE_START_ADDRESS + g_uiIndex*12); // 第一个播放文件地址
ulCon_AddrHighest = ulCon_AddrHighest << 24;
ulCon_AddrHigh = SP_SIOReadAByte(BASE_START_ADDRESS + g_uiIndex*12+1);
ulCon_AddrHigh = ulCon_AddrHigh << 16;
ulCon_AddrLow = SP_SIOReadAByte(BASE_START_ADDRESS + g_uiIndex*12+2);
ulCon_AddrLow = ulCon_AddrLow << 8;
ulCon_AddrLowest = SP_SIOReadAByte(BASE_START_ADDRESS + g_uiIndex*12+3);
ulCon_StartAddr = ulCon_AddrHighest | ulCon_AddrHigh // 开始地址
| ulCon_AddrLow | ulCon_AddrLowest;
ulCon_AddrHighest = SP_SIOReadAByte(BASE_END_ADDRESS + 4*12);
ulCon_AddrHighest = ulCon_AddrHighest << 24;
ulCon_AddrHigh = SP_SIOReadAByte(BASE_END_ADDRESS + 4*12+1);
ulCon_AddrHigh = ulCon_AddrHigh << 16;
ulCon_AddrLow = SP_SIOReadAByte(BASE_END_ADDRESS + 4*12+2);
ulCon_AddrLow = ulCon_AddrLow << 8;
ulCon_AddrLowest = SP_SIOReadAByte(BASE_END_ADDRESS + 4*12+3);
ulCon_EndAddr = ulCon_AddrHighest | ulCon_AddrHigh // 结束地址
| ulCon_AddrLow | ulCon_AddrLowest;
SACM_A2000_Initial(0); //初始化放音
SACM_A2000_InitQueue(); //初始化队列
SACM_A2000_InitDecoder(3); //初始化解码
while(1)
{
uiTemp = *P_DAC1;
while(SACM_A2000_TestQueue() != 1) //解码队列是否为空
{
if(ulCon_StartAddr >= ulCon_EndAddr) //文件结束?
{
break;
}
uiRet = SP_SIOReadAWord(ulCon_StartAddr);//取得语音资源
SACM_A2000_FillQueue(uiRet); //填充解码队列
ulCon_StartAddr++; //移动资源指针
ulCon_StartAddr++;
}
if(SACM_A2000_Status()&0x0001) //解码
{
SACM_A2000_Decoder();
}
else //停止放音
{
SACM_A2000_Stop();
g_uiIndex++;
if(g_uiIndex == 5)
g_uiIndex = 0;
break;
}
*(unsigned int *)0x7012 = 0x0001;
uiKey = Key_Get();
switch(uiKey)
{
case KEY_1:
while(1)
{
SACM_A2000_Pause(); // 暂停
uiKey = 0;
uiKey = Key_Get();
Write_Command(0x00c7);
Write_Data('P');
Write_Data('A');
Write_Data('U');
Write_Data('S');
Write_Data('E');
Write_Data(' ');
if(uiKey == KEY_1)
{
SACM_A2000_Resume(); // 继续
break; // 跳出while
}
*(unsigned int *)0x7012 = 0x0001;
}
break;
case KEY_2:
SACM_A2000_Stop(); // 停止播放本首曲目
g_uiIndex++; // 曲目跳到下一首
if(g_uiIndex == 5)
{
g_uiIndex = 0; // 如果播放到头了,跳到第一首
}
goto L_Addr; // 跳到函数重新计算地址的地方
break;
case KEY_3:
SACM_A2000_Stop(); // 停止
g_uiIndex--; // 跳到上一首
if(g_uiIndex == 0xffff)
{
g_uiIndex = 4;
}
goto L_Addr;
break;
case KEY_1_THREE:
break;
case KEY_2_THREE:
break;
case KEY_3_THREE:
SACM_A2000_Stop();
uiStatus = 0; // 停止播放
g_uiIndex = 0;
break;
default:
break;
}
}
}
//========================================================
// 语法格式: void EQ()
// 实现功能: 在LCD1602上实现均衡器效果
// 参数: 无
// 返回值: 无
//========================================================
void EQ()
{
Write_Command(0x0001); // 清屏
if(g_uiDAC > 0xf000)
{
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
}
else if(g_uiDAC > 0xe000)
{
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
}
else if(g_uiDAC > 0xd000)
{
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
}
else if(g_uiDAC > 0xc000)
{
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
}
else if(g_uiDAC > 0xb000)
{
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
}
else if(g_uiDAC > 0xa000)
{
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
}
else if(g_uiDAC > 0x9000)
{
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
}
else if(g_uiDAC > 0x8000)
{
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
}
else if(g_uiDAC > 0x7000)
{
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
}
else if(g_uiDAC > 0x6000)
{
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
}
else if(g_uiDAC > 0x5000)
{
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
}
else if(g_uiDAC > 0x4000)
{
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
}
else if(g_uiDAC > 0x3000)
{
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
}
else if(g_uiDAC > 0x2000)
{
Write_Data(0xff);
Write_Data(0xff);
Write_Data(0xff);
}
else if(g_uiDAC > 0x1000)
{
Write_Data(0xff);
Write_Data(0xff);
}
else
{
Write_Data(0xff);
}
Write_Command(0x00c8); // 选择下行
Write_Data('P');
Write_Data('L');
Write_Data('A');
Write_Data('Y');
Write_Data(' ');
Write_Data(g_uiData[g_uiIndex]);
Write_Data('/');
Write_Data('5');
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -