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

📄 main.c

📁 电压控制程序,符合各种设备需要,核心程序,IBm专属
💻 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 + -