📄 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.
//========================================================
//============================================================
// 工程名称: 61_Record
// 功能描述: 61板程序示例--简易复读机
// 使用61板上的三个按键控制录放音,约可录制20秒的声音
// Key1 - 录音
// Key2 - 播放录音
// Key3 - 停止录/放音
// 涉及的库: CMacro1016.lib
// SacmV26e.lib
// 组成文件: main.c
// Flash.asm, hardware.asm, ISR.asm, Key.asm, sram.asm
// Flash.h, DVR.h, Key.h, SPCE061A.h, DVR.inc, Key.inc, SPCE061A.inc
// 硬件连接: 61板自带的三个按键已经连接在IOA0~IOA2上
// 维护记录: 2006-8-30 v1.0
//===============================================
//======================================================
// 文件名称: main.c
// 功能描述: 主程序以及录音、放音子程序
// 维护记录: 2006-08-30 v1.0
//======================================================
#include "spce061a.h"
#include "Flash.h"
#include "DVR.h"
#include "Key.h"
#define START_ADDR 0xA000 // 定义录音起始地址
#define END_ADDR 0xFBFF // 定义录音结束地址
//=============================================================
// 语法格式: void PlayRecord(void);
// 实现功能: 播放录音
// 参数: 无
// 返回值: 无
//=============================================================
void PlayRecord()
{
unsigned long Addr,EndAddr;
unsigned int Ret;
SACM_DVR_Initial(0); // 初始化放音
SACM_DVR_InitQueue(); // 初始化解码队列
SACM_DVR_InitDecoder(3); // 初始化解码算法,声音由DAC1和DAC2输出
Addr = START_ADDR + 1;
EndAddr = Flash_ReadWord(START_ADDR); // 从录音首地址中读出录音结束地址
while(1)
{
*P_Watchdog_Clear = 0x01; // 清看门狗
while(SACM_DVR_TestQueue()!=1) // 如果解码队列未满
{
Ret = Flash_ReadWord(Addr); // 取录音数据
SACM_DVR_FillQueue(Ret); // 填充入解码队列
Addr++;
if(Addr > EndAddr) break;
}
if((SACM_DVR_Status()&0x01)==0 || Key_Get()==KEY_3) // 如果播放完毕或Key3键按下则停止
{
SACM_DVR_Stop(); // 停止播放
break;
}
else
SACM_DVR_Decoder(); // 数据解码
}
}
//=============================================================
// 语法格式: void Record(void);
// 实现功能: 录制声音
// 参数: 无
// 返回值: 无
//=============================================================
void Record(void)
{
unsigned int Addr;
unsigned int Ret;
for(Addr=START_ADDR;Addr<=END_ADDR;Addr+=0x0100)
{
Flash_Erase(Addr); // 擦除录音所需Flash空间
*P_Watchdog_Clear = 0x01;
}
SACM_DVR_Initial(0); // 初始化录放音
SACM_DVR_InitQueue(); // 初始化编码队列
SACM_DVR_InitEncoder(0,0); // 初始化编码算法
Addr = START_ADDR + 1; // 第一个单元用于保存录音结束地址
while(1) // 录音循环
{
*P_Watchdog_Clear = 0x01; // 清看门狗
SACM_DVR_Encoder(); // 对AD采集到的数据编码
if(SACM_DVR_TestQueue()!=2) // 如果编码队列不为空
{
Ret = SACM_DVR_FetchQueue(); // 从编码队列中取数据
Flash_WriteWord(Addr, Ret); // 将数据写入flash
Addr += 1;
if(Addr>END_ADDR || Key_Get()==KEY_3) // 如果到达尾地址或Key3键按下则结束录音
{
Flash_WriteWord(START_ADDR, Addr-1); // 录音结束地址保存在[START_ADDR]中
SACM_DVR_Stop(); // 停止录音
break;
}
}
}
if(Addr > END_ADDR) // 如果是空间被录满导致的录音结束则播放录音
PlayRecord();
}
//=============================================================
// 语法格式: int main(void);
// 实现功能: 主函数
// 参数: 无
// 返回值: 无
//=============================================================
int main()
{
unsigned int KeyCode;
Key_Init(); // 初始化按键扫描程序
while(1)
{
KeyCode = Key_Get();
switch(KeyCode)
{
case KEY_1: // Key1键按下则录音
Record();
break;
case KEY_2: // Key2键按下则放音
PlayRecord();
break;
default:
break;
}
*P_Watchdog_Clear = 0x01;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -