?? 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 + -