📄 main.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 + -