📄 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.
//========================================================================
//======================================================================================================================================
// 工程名称: ex8_Record
// 功能描述: 《实验仪指导书》综合实验8
// 录音笔
// 用键盘控制语音的录放、存储和擦除。
// 1、录音键按下,开始录音
// 2、放音键按下,开始放音
// 3、停止键按下,停止录音或放音
// 4、下一段键按下,开始播放下一段
// 5、擦除键按下,开全部擦除
// 6、整个操作过程用lcd显示状态
// 涉及的库: CMacro1016.lib
// sacmv26e.lib
// 组成文件: main.c/ISR.c/SPLC501User.c
// 4096.asm/DataOSforLCD.asm/SPLC501Driver_IO.asm/hardware.asm/key.asm/sram.asm
// SPCE061A.inc/SPLC501Driver_IO.inc
// SPCE061A.h/SPLC501User.h/dvr.h/Record.h
// 硬件连接: SCK --IOB0
// SDA --IOB1
// CF --DGND
// IOB15~IOB8连接KEYPAD接口的COL1~COL8
// LCD DB0~DB7接IOA0~IOA7
// LCD EP 接IOB5
// LCD RW 接IOB4
// LCD A0 接IOB3
// LCD /CS 接IOB2 或接地也可
// 维护记录: 2005-10-18 v1.0
//===================================================================================================================================================
//========================================================================
// 文件名称: main.c
// 功能描述: 用键盘控制语音的录放、存储和擦除
// 维护记录: 2005-10-18 v1.0
//========================================================================
#include "Record.h"
#include "SPCE061A.h"
#include "dvr.h"
#include "SPLC501User.h"
#include "Key.h"
//========================================================================
// 语法格式: int main(void)
// 实现功能: 主程序
// 参数: 无
// 返回值: int 无意义
//========================================================================
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 |= 0x0100; // IOA8输出高电平
*P_IOA_Attrib |= 0x0100;
*P_IOA_Buffer |= 0x0100;
SP_SIOInitial(); // SIO初始化
Key_Init(); // 按键扫描程序初始化
Initial_INT(); // 更新中断控制变量
LCD501_Init(0x00);
SP_SIOMassErase(); // 对SPR4096的所有扇区进行擦除
LCD501_ClrScreen(0);
LCD501_SetPaintMode(4);
SACM_DVR_Initial(Manual); // DVR 初始化为手动模式
uiStatus = Stop; // 变量初始化
uiSegment = 1;
ulAddr = 0;
uiKeyCode = 0xff;
for(i=0;i<21;i++)
ulBuffer[i] = 0;
ShowLcd();
LCD501_Rectangle(68,32,120,44,PAINT_HOLLOW);
uiRet=SP_SIOReadAWord(1);
while(1)
{
*P_Watchdog_Clear = 0x01;
uiKeyCode = Key_Get(); // 按键扫描取键值
if(uiKeyCode!=0x00) // 如果有键按下,则响应按键事件
{
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 0x80: // K1, 录音
ulAddr = ulBuffer[ulBuffer[0]*2+1];
SACM_DVR_InitQueue();
SACM_DVR_InitEncoder(RceMonitorOff);
uiStatus = Record;
ShowLcd();
LCD501_Rectangle(68,4,120,16,PAINT_HOLLOW);
break;
case 0x40: // K2, 停止
uiStatus = Stop;
ShowLcd();
LCD501_Rectangle(68,32,120,44,PAINT_HOLLOW);
break;
case 0x20: // K3, 播放当前段
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();
LCD501_Rectangle(68,18,120,30,PAINT_HOLLOW);
break;
case 0x10: // K4, 播放下一段
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();
LCD501_Rectangle(68,18,120,30,PAINT_HOLLOW);
break;
case 0x08: // K5, 删除
ShowLcd();
LCD501_Rectangle(68,46,120,58,PAINT_HOLLOW);
SP_SIOMassErase();
for(i=0;i<21;i++)
ulBuffer[i]=0;
uiSegment = 1; // 变量初始化
ulAddr = 0;
uiStatus = Stop;
ShowLcd();
LCD501_Rectangle(68,32,120,44,PAINT_HOLLOW);
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();
LCD501_Rectangle(68,32,120,44,PAINT_HOLLOW);
}
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();
LCD501_Rectangle(68,32,120,44,PAINT_HOLLOW);
}
break;
case Stop:
default:
break;
}
}
return 0;
}
//=============================================================
// 语法格式: void ShowLcd(void);
// 实现功能: 在Lcd 上显示操作界面
// 参数: 无
// 返回值: 无
// 注意事项: 无
//=============================================================
void ShowLcd(void)
{
int X_Position ,Y_Position; // X_Position:横坐标 Y_Position:纵坐标
unsigned char *ucStr1 = "RECORD";
unsigned char *ucStr2 = "PLAY";
unsigned char *ucStr3 = "STOP";
unsigned char *ucStr4 = "DELETE";
unsigned char *ucCode;
LCD501_ClrScreen(0); // LCD清屏
ucCode = ucStr1;
X_Position = 4;
Y_Position = 4;
LCD501_PutString(X_Position,Y_Position,(unsigned int *)ucCode); // LCD显示ucStr1的内容
ucCode = ucStr2;
X_Position = 4;
Y_Position = 18;
LCD501_PutString(X_Position,Y_Position,(unsigned int *)ucCode); // LCD显示ucStr2的内容
ucCode = ucStr3;
X_Position = 4;
Y_Position = 32;
LCD501_PutString(X_Position,Y_Position,(unsigned int *)ucCode); // LCD显示ucStr3的内容
ucCode = ucStr4;
X_Position = 4;
Y_Position = 46;
LCD501_PutString(X_Position,Y_Position,(unsigned int *)ucCode); // LCD显示ucStr4的内容
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -