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

📄 main.c

📁 SACM_D10 for SPCE061A.rar,凌阳单片机SPCE061A的语音编码资料
💻 C
字号:
//======================================================================
//	工程名称:	DVR1600_Advanced.spj
//	功能描述:	DVR1600语音录放范例--高级应用
//				该例子程序利用SPCE061A内部Flash录制语音(可录制三段,每段最长约10秒)并播放
//				使用到了DVR1600的全部API函数。
//				IOA[2:0]连接三个按键,控制录制和播放:
//					[停止状态下]
//						Key1 - 录制一段语音
//						Key2 - 无效
//						Key3 - 播放刚刚录制的语音
//					[录音状态下]
//						Key1 - 录制下一段语音
//						Key2 - 暂停录音/恢复录音
//						Key3 - 停止录音并播放本段语音
//					[放音状态下]
//						Key1 - 播放下一段语音
//						Key2 - 暂停放音/恢复放音
//						Key3 - 音量增加,当音量达到最大等级(15)后变为0,如此循环
//  IDE环境:   SUNPLUS u'nSPTM  IDE 2.0.0(or later)
//	涉及的库:	CMacro1016.lib
//              SACM_D10.lib
//	组成文件:	main.c, SACM_DVR1600_User_C.c
//				SACM_DVR1600.asm, Flash.asm, Key.asm
//				SPCE061A.h, DVR1600.h, Flash.h, Key.h
//				SPCE061A.inc, DVR1600.inc, Flash.inc, Key.inc
//	硬件连接:	IOA0 - Key1
//				IOA1 - Key2
//				IOA2 - Key3
//	维护记录:	2006-10-16	v1.0,  by Qwerty
//======================================================================
#include "SPCE061A.h"
#include "DVR1600.h"
#include "Key.h"

#define SOUND_NUM	3				 				// 语音段数

//========================================================================
//	主函数
//========================================================================
int main()
{
	unsigned int KeyCode;
	unsigned int VolumeIdx = 8;						// 音量等级,可在0~15之间变化,默认的音量等级为8。
	unsigned int SndIdx = SOUND_NUM-1;				// 语音序号,初始指向最末一段语音。
	unsigned int RecordFlag[SOUND_NUM] = {0, 0, 0};	// 该数组用来标识各段是否已经录有语音,0-该段为空,1-该段已存有录音
	
	Key_Init();										// 初始化按键扫描程序
	SACM_DVR1600_Initial();							// DVR1600初始化
	SACM_DVR1600_ADC_FIRType(ADC_FIRTYPE_2);		// 设定ADC输入滤波方式,详见DVR1600.h中的说明
	SACM_DVR1600_DAC_FIRType(DAC_FIRTYPE_3);		// 设定DAC输出滤波方式,详见DVR1600.h中的说明

	while(1)								
	{
		*P_Watchdog_Clear = 0x01;					// 清看门狗
		SACM_DVR1600_ServiceLoop();					// 执行DVR1600编解码
		
		KeyCode = Key_Get();
		switch(KeyCode)
		{
			case KEY_1:								// 按键1
				if((SACM_DVR1600_Status()&STATUS_PLAY)==0 || (SACM_DVR1600_Status()&STATUS_RECORD)!=0)
				{									// [停止状态下]或[录音状态下],录制下一段语音
					SACM_DVR1600_Stop();			// 停止正在进行的录放音操作
					SndIdx += 1;					// 语音序号指向下一段
					if(SndIdx==SOUND_NUM)
						SndIdx = 0;
					RecordFlag[SndIdx] = 1;			// 标识该段语音已存有录音
					SACM_DVR1600_Rec(SndIdx, BITRATE_10K);	// 开始录音,码率选择10Kbps
				}
				else								// [放音状态下],播放下一段语音
				{
					SACM_DVR1600_Stop();			// 停止正在进行的录放音操作
					do{
						SndIdx += 1;				// 语音序号指向下一段
						if(SndIdx==SOUND_NUM)
							SndIdx = 0;
					}while(RecordFlag[SndIdx]==0);	// 如果该段还没有录制过语音,则语音序号继续下移
					SACM_DVR1600_Play(SndIdx, DAC_1+DAC_2, RAMP_UP_DN);	// 播放该段录音
				}
				break;
			case KEY_2:								// 按键2
				if(SACM_DVR1600_Status()&STATUS_PAUSE)
					SACM_DVR1600_Resume();			// 如果当前处于暂停状态则恢复录制或播放
				else
					SACM_DVR1600_Pause();			// 如果当前处于录制或播放状态则暂停
				break;
			case KEY_3:								// 按键3
				if((SACM_DVR1600_Status()&STATUS_PLAY)==0 || (SACM_DVR1600_Status()&STATUS_RECORD)!=0)
				{									// [停止状态下]或[录音状态下],播放本段语音
					SACM_DVR1600_Stop();			// 停止正在进行的录放音操作
					if(RecordFlag[SndIdx])			// 如果当前段中已存储语音则播放
						SACM_DVR1600_Play(SndIdx, DAC_1+DAC_2, RAMP_UP_DN);
				}
				else								// [放音状态下],播放下一段语音
				{
					VolumeIdx += 1;
					if(VolumeIdx>15)				// 改变音量
						VolumeIdx = 0;
					SACM_DVR1600_Volume(VolumeIdx);
				}
				break;
			default:
				break;			
		}
	}
	
}	

//========================================================================
//	中断服务程序
//========================================================================
void FIQ(void)__attribute__((ISR));
void IRQ6(void)__attribute__((ISR));

void FIQ()
{
	*P_INT_Clear = C_FIQ_TMA;						// 清中断请求标志
	SACM_DVR1600_ISR();								// 调用中断服务子程序
}

void IRQ6()
{
	*P_INT_Clear = C_IRQ6_TMB2;						// 清中断请求标志
	Key_Scan();										// 调用按键扫描中断服务子程序
}

⌨️ 快捷键说明

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