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

📄 speech.c

📁 利用 SPCE061A 单片机、SPR 模组、液晶1602 制作音乐盒播放器
💻 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 + -