📄 main.c
字号:
//======================================================
// The information contained herein is the exclusive property of
// Sunnnorth Technology Co. And shall not be distributed, reproduced,
// or disclosed in whole in part without prior written permission.
// (C) COPYRIGHT 2003 SUNNORTH TECHNOLOGY CO.
// ALL RIGHTS RESERVED
// The entire notice above must be reproduced on all authorized copies.
//========================================================
//============================================================
// 工程名称: SD_Recording_Demo
// 功能描述: 61板与SD卡相连
// 按下Key3键开始录音,再次按下停止录音
// 支持多段录音,Key2为播放上一曲,Key1为播放下一曲
// 长按Key1停止播放,长按Key2擦除录音
// 涉及的库: CMacro.lib
// clib.lib
// SACM_DVR1600_V40a.lib
// SDDriver_061A.lib
// 组成文件: main.c,
// .\DVRSystem\sacmv40.asm, .\DVRSystem\sacmv40.h, .\DVRSystem\sacmv40.inc, sacm_DVR1600_user.asm,
// .\DVRSystem\spce.inc, .\DVRSystem\PlaySnd.c, .\DVRSystem\PlaySnd.h,
//
// .\Driver\SD\SD_Hardware.asm, .\Driver\SD\SD_CFG.inc, .\Driver\SD\SD_Hardware.h,
//
// .\Driver\KEY\DvrKEY.c, .\Driver\KEY\DvrKEY.h, .\Driver\KEY\KEY.c, .\Driver\KEY\KEY.h,
//
// .\FS\FS.c, .\FS\FS.h,
//
// .\System\SetInterruptStatus.asm, .\System\SetInterruptStatus.h, .\System\ISR.asm
// 硬件连接: 将SD卡座模组插接到61板的IOB口的低八位
// 维护记录: 2006-9-18 v1.0
//===============================================
#include "SD_Recording_Demo.h"
#include ".\Driver\SD\SD_Driver.h"
#include ".\FS\fs.h"
#include ".\DVRSystem\sacmV40.h"
#include ".\DVRSystem\PlaySnd.h"
#include ".\System\SetInterruptStatus.h"
#include ".\Driver\KEY\Key.h"
#define ADC_Channel Mic // 0~7 (Mic, Line_In1 ~ Line_In6)
void KeyProcess();
void StatusProcess();
SysStatus Status; // 系统状态,SysStatus定义在SDDVR.h中
int SpeechIndex;
int WriteProtect;
//=============================================================
// 语法格式: int main(void)
// 实现功能: 主函数
// 参数: 无
// 返回值: 无
//=============================================================
int main()
{
SpeechIndex = 0;
WriteProtect = 0;
Status = IDLE;
DrvKeyInit();
SD_IOInit();
SetINTStatus(C_IRQ5_2Hz);
SetINTStatus(C_IRQ4_1KHz);
__asm("IRQ ON");
SACM_DVR1600_Initial(); // 语音初始化
if(0 == SD_ChkCard())
{ // 检测卡是否插入
PlaySnd(VOICE_ATTENTION, DAC1 + DAC2);
PlaySnd(VOICE_SDCARDNOTINSERT, DAC1 + DAC2);
while(0 == SD_ChkCard()); // 等待卡插入
}
if(1 == SD_ChkCardWP()) // 检测卡是否有写保护
{
WriteProtect = 1;
PlaySnd(VOICE_ATTENTION, DAC1 + DAC2);
PlaySnd(VOICE_SDCARDWRITEPROTECT, DAC1 + DAC2);
}
else
{
FS_Init(); // 没有写保护,执行初始化操作
PlaySnd(VOICE_READY, DAC1 + DAC2);
}
//-----------------------------------------------------------------
while(1)
{
KeyProcess(); // 按键处理
StatusProcess(); // 系统状态处理
SACM_DVR1600_ServiceLoop(); // 录/放音服务
}
return 0;
}
//=============================================================
// 语法格式: int StatusProcess(void)
// 实现功能: 系统状态处理函数
// 参数: 无
// 返回值: 无
//=============================================================
void StatusProcess()
{
switch(Status)
{
case RECORD:
if(FS_GetUnusedSecNum() < 1) // 检测是否超出SD卡容量范围
{
SACM_DVR1600_Stop();
Status = IDLE;
}
break;
case PLAY:
if(FS_CheckFileEnd()) // 检测当前语音是否播放完毕
{
SACM_DVR1600_Stop();
FS_CloseOpenFile();
Status = IDLE;
}
// case IDLE:
default:
break;
}
}
//=============================================================
// 语法格式: int KeyProcess(void)
// 实现功能: 按键处理函数
// 参数: 无
// 返回值: 无
//=============================================================
void KeyProcess()
{
unsigned int Key, KeyType;
Key = KeyScan_GetKey(&KeyType);
if(1 == WriteProtect) // 卡有写保护,拒绝按键操作
{
if((C_SReleaseKeyState == KeyType) || (C_LReleaseKeyState == KeyType))
{
PlaySnd(VOICE_SDCARDWRITEPROTECT, DAC1 + DAC2);
}
return;
}
switch(Key)
{
case C_Record: // Record
if(C_SReleaseKeyState == KeyType)
{ // 短按键,录/放音控制
if(PLAY == Status)
{
SACM_DVR1600_Stop(); // 如果正在放音,则先停止播放
FS_CloseOpenFile();
Status = IDLE;
}
if(IDLE == Status)
{
if((g_FileNum >= FS_MAX_FILENUM) || (FS_GetUnusedSecNum() <= 0))
{ // 文件已满,退出
PlaySnd(VOICE_DANG, DAC1 + DAC2);
break;
}
PlaySnd(VOICE_START, DAC1 + DAC2);
FS_CreatFile();
FS_WriteFile(0); // 为语音长度跳过两个word
FS_WriteFile(0);
SACM_DVR1600_Rec(RceMonitorOff, ADC_Channel, BIT_RATE_24K);
Status = RECORD;
}
else if(RECORD == Status)
{
SACM_DVR1600_Stop();
while(RECORD == Status) // 等待完成录音收尾工作
SACM_DVR1600_ServiceLoop();
PlaySnd(VOICE_OVER, DAC1 + DAC2);
SpeechIndex = g_FileNum - 1;
}
}
break;
case C_Prev: // Play Prev
if((C_SReleaseKeyState != KeyType) && (C_LReleaseKeyState != KeyType))
break;
if(g_FileNum > 0)
{
if(PLAY == Status) // 如果正在放音,则先停止播放
{
SACM_DVR1600_Stop();
FS_CloseOpenFile();
}
else if(RECORD == Status) // 如果正在录音则不处理
{
break;
}
if(C_LReleaseKeyState == KeyType)
{ // 长按键,擦除所有语音段
FS_Init();
PlaySnd(VOICE_SDCARDERASED, DAC1 + DAC2);
Status = IDLE;
break;
}
else if(C_SReleaseKeyState == KeyType)
{ // 短按键,播放上一曲
if(--SpeechIndex <= 0)
{
SpeechIndex = g_FileNum;
}
FS_OpenFile(SpeechIndex);
SACM_DVR1600_Play(Manual_Mode_Index, DAC1 + DAC2, Ramp_Up + Ramp_Dn);
Status = PLAY;
}
}
break;
case C_Next: // Play Next
if((C_SReleaseKeyState != KeyType) && (C_LReleaseKeyState != KeyType))
break;
if(g_FileNum > 0)
{
if(PLAY == Status) // 如果正在放音,则先停止播放
{
SACM_DVR1600_Stop();
FS_CloseOpenFile();
}
else if(RECORD == Status) // 如果正在录音则不处理
{
break;
}
if(C_LReleaseKeyState == KeyType)
{ // 长按键,停止当前播放
Status = IDLE;
break;
}
else if(C_SReleaseKeyState == KeyType)
{ // 短按键,播放下一曲
if(++SpeechIndex > g_FileNum)
{
SpeechIndex = 1;
}
FS_OpenFile(SpeechIndex);
SACM_DVR1600_Play(Manual_Mode_Index, DAC1 + DAC2, Ramp_Up + Ramp_Dn);
Status = PLAY;
}
}
break;
default:
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -