⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 实现了这样一个录音笔
💻 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 + -