📄 main.c
字号:
//===============================================================
//
// The information contained herein is the exclusive property of
// Sunplus Technology Co. And shall not be distributed, reproduced,
// or disclosed in whole in part without prior written permission.
//
// (C) COPYRIGHT 2001 SUNPLUS TECHNOLOGY CO.
// ALL RIGHTS RESERVED
//
// The entire notice above must be reproduced on all authorized copies.
//
//==============================================================
//============================================================
// 工程名称: Record.spj
// 功能描述: 按键控制的录音笔。
// 文件来源:《SPCE061A单片机实验指导书》,"实验四十 录音笔" 第139页
// IDE环境: SUNPLUS u'nSPTM IDE 1.8.4
//
// 涉及的库:
// 组成文件:
// main.c 4096.asm isr.asm key.asm system.asm SPLC501DisplayTAB.asm SPLC501Hardware.asm
// Splc501sys.asm Splc501var.asm sram.asm
//===============================================
//============================================================
// 文件名称:main.c
// 实现功能: 按键控制的录音笔
//============================================================
#include "Record.h"
#include "SPCE061V004.H"
#include "unSPMACRO.h"
#include "dvr.h"
#include "lab_parameter.h"
//=============================================================
// 函数名称: int main()
// 功能描述: 按键控制的录音笔
// 语法格式: int main()
//入口参数: 无
// 出口参数: 无
// 注意事项: 仅为用户模型
//=============================================================
int main(void)
{
unsigned int uiKeyCode; // 键值
unsigned int uiSegment; // 录音段值
unsigned int uiStatus; // 系统状态标志
enum uiStatus{Stop=0,Record,Play}; // 系统状态
unsigned int uiRet,uiTemp,i;
unsigned long int ulAddr; // 串行Flash 地址
unsigned long int ulBuffer[21]; // 录音索引表
// Buffer[0]---------录音段数
// Buffer[2*i+1]-----第i段录音的开始地址,i = { 0,1,2,3,...,9};
// Buffer[2*i+2]-----第i段录音的结束地址,i = { 0,1,2,3,...,9};
*P_IOA_Dir = 0x01ff; //
*P_IOA_Attrib = 0x01ff;
*P_IOA_Data = 0x01ff;
// uiRet = *P_IOB_Buffer;
// uiRet &= 0xffff; // IOB2:低电平,选择LCD
// *P_IOB_Data = uiRet;
SP_SIOInitial(); // SIO初始化
Init_sys(); // LCD初始化
FG_InitGraphic();
SP_SIOMassErase(); // 对SPR4096的所有扇区进行擦除
FG_ClearScreen(0); // LCD清屏
FG_SetLineStyle(DG_RECT_HOLLOW);
FG_SetRectStyle(DG_RECT_HOLLOW);
SACM_DVR_Initial(Manual); // DVR 初始化为手动模式
uiTemp = *P_INT_Mask;
*P_INT_Ctrl = uiTemp|C_IRQ5_2Hz; // 开2Hz中断,用来定时清看门狗
INT_FIQ_IRQ();
uiStatus = Stop; // 变量初始化
uiSegment = 1;
ulAddr = 0;
uiKeyCode = 0xff;
for(i=0;i<21;i++)
ulBuffer[i] = 0;
ShowLcd();
while(1)
{
uiKeyCode = F_Key_Scan(); // 按键扫描取键值
*P_IOA_Dir = 0x01ff; //
*P_IOA_Attrib = 0x01ff;
*P_IOA_Data = 0x01ff;
if(uiKeyCode!=0xff) // 如果有键按下(uiKeyCode!=0xff),则响应按键事件
{
SACM_DVR_Stop();
if(uiStatus == Record)
{
while(SACM_DVR_TestQueue() != Empty) // 存储语音队列中的剩余数据
{
uiRet = SACM_DVR_FetchQueue();
SP_SIOSendAWord(ulAddr,uiRet);
ulAddr += 2;
}
ulBuffer[0]+=1; // 修改索引表
uiRet=ulBuffer[0]*2;
ulBuffer[uiRet]=ulAddr;
uiTemp=0;
for(i=1;(i<256)&&((uiTemp<ulAddr)||(uiTemp==ulAddr));i++)
uiTemp=2048*i;
ulBuffer[uiRet+1]=uiTemp;
}
switch(uiKeyCode)
{
case 0: // 录音
ulAddr = ulBuffer[ulBuffer[0]*2+1];
SACM_DVR_InitQueue();
SACM_DVR_InitEncoder(RceMonitorOff);
uiStatus = Record;
ShowLcd();
FG_Rectangle(112,48,128,62);
break;
case 1: // 播放当前段
ulAddr=ulBuffer[uiSegment*2-1];
SACM_DVR_InitQueue(); // 语音队列初始化
while(SACM_DVR_TestQueue() != Full) // 把语音队列填满
{
uiRet=SP_SIOReadAWord(ulAddr); // 从SPR4096取数据
SACM_DVR_FillQueue(uiRet); // 填充到语音队列
ulAddr += 2;
}
SACM_DVR_InitDecoder(DAC1+DAC2);
uiStatus = Play;
ShowLcd();
FG_Rectangle(112,34,128,48);
break;
case 2: // 停止录音或停止播放
uiStatus = Stop;
ShowLcd();
// FG_Rectangle( 4, 20, 66, 34);
FG_Rectangle(46,34,62,48);
break;
case 3: // 删除
ShowLcd();
// FG_Rectangle( 4, 6, 66, 20);
SP_SIOMassErase();
for(i=0;i<21;i++)
ulBuffer[i]=0;
uiSegment = 1; // 变量初始化
ulAddr = 0;
uiStatus = Stop;
ShowLcd();
FG_Rectangle(112, 20,128, 34);
break;
case 4: // 播放下一段
if(uiSegment<ulBuffer[0])
{
uiSegment++;
ulAddr=ulBuffer[uiSegment*2-1];
}
else
{
uiSegment=1;
ulAddr=ulBuffer[1];
}
SACM_DVR_InitQueue(); // 语音队列初始化
while(SACM_DVR_TestQueue() != Full) // 把语音队列填满
{
uiRet=SP_SIOReadAWord(ulAddr); // 从SPR4096取数据
SACM_DVR_FillQueue(uiRet); // 填充到语音队列
ulAddr += 2;
}
SACM_DVR_InitDecoder(DAC1+DAC2);
uiStatus = Play;
ShowLcd();
// FG_Rectangle(112,6,128,20);
FG_Rectangle(112,34,128,48);
break;
default:
break;
}
}
switch(uiStatus)
{
case Record: // 录音
if(ulAddr < C_SflashSize)
{
SACM_DVR_Encode(); // 如果SPR4096未满,则继续往里存放数据
if(SACM_DVR_TestQueue() != Empty)
{
uiRet = SACM_DVR_FetchQueue();
SP_SIOSendAWord(ulAddr,uiRet);
ulAddr += 2;
}
}
else // 否则,停止录音
{
SACM_DVR_Stop();
while(SACM_DVR_TestQueue() != Empty) // 存储语音队列中的剩余数据
{
uiRet = SACM_DVR_FetchQueue();
SP_SIOSendAWord(ulAddr,uiRet);
ulAddr += 2;
}
ulBuffer[0]+=1; // 修改索引表
uiRet=ulBuffer[0]*2;
ulBuffer[uiRet]=ulAddr;
uiTemp=0;
for(i=1;(i<256)&&((uiTemp<ulAddr)||(uiTemp==ulAddr));i++)
uiTemp=2048*i;
ulBuffer[uiRet+1]=uiTemp;
uiStatus = Stop;
ShowLcd();
}
break;
case Play: // 播放
if(SACM_DVR_Status()&0x01) // 检查是否还在播放
{
if(SACM_DVR_TestQueue() != Full) // 填充语音队列
{
uiRet = SP_SIOReadAWord(ulAddr);
SACM_DVR_FillQueue(uiRet);
ulAddr += 2;
}
SACM_DVR_Decode();
}
else
{
SACM_DVR_Stop();
uiStatus = Stop;
ShowLcd();
}
break;
case Stop:
default:
break;
}
}
return 0;
}
//=============================================================
// 函数名称: ShowLcd()
// 功能描述: 在Lcd 上显示操作界面
// 语法格式: void ShowLcd(void);
// 入口参数: 无
// 出口参数: 无
// 注意事项: 无
//=============================================================
void ShowLcd(void)
{
int X_Position ,Y_Position; // X_Position:横坐标 Y_Position:纵坐标
unsigned char *ucStr1 = "K1-RECORD";
unsigned char *ucStr2 = "K2-PLAY";
unsigned char *ucStr3 = "K3-STOP";
unsigned char *ucStr4 = "K4-DELETE";
unsigned char *ucStr5 = "K5-PLAYNEXT";
unsigned char *ucCode;
FG_ClearScreen(0); // LCD清屏
ucCode = ucStr1;
X_Position = 127;
Y_Position = 60;
FG_PutStr(ucCode,large,X_Position,Y_Position); // LCD显示ucStr1的内容
ucCode = ucStr2;
X_Position = 127;
Y_Position = 46;
FG_PutStr(ucCode,large,X_Position,Y_Position); // LCD显示ucStr2的内容
ucCode = ucStr3;
X_Position = 61;
Y_Position = 46;
FG_PutStr(ucCode,large,X_Position,Y_Position); // LCD显示ucStr3的内容
ucCode = ucStr4;
X_Position = 127;
Y_Position = 32;
FG_PutStr(ucCode,large,X_Position,Y_Position); // LCD显示ucStr4的内容
ucCode = ucStr5;
X_Position = 127;
Y_Position = 18;
FG_PutStr(ucCode,large,X_Position,Y_Position); // LCD显示ucStr4的内容
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -