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

📄 main.c

📁 这个是录音琴的程序,用光电感应器来检测琴键的动作.并且将他记录下来,可以回放.
💻 C
📖 第 1 页 / 共 2 页
字号:
/*******************************Copyright (c)***************************************

        录音钢琴主程序.

************************************************************************************/

#include 	"common.h"
#include   	"file.h"
#include	"midi.h"
#include 	"hpi.h"
#include 	"lcd.h"
#include	"usb.H"

/*-----------------------------------------------------------------------------------
名称: void SystemInital(void)
功能: 系统初始化.
-----------------------------------------------------------------------------------*/
void SystemInital(void)
{
	AUXR = 3;           //外部RAM,平时ALE无输出
	SetSystemTimer0();  //设定系统定时器0
	SetSystemUart();    //设定串行端口
	RamAreaSelect(0);   //RAM区域选择
	FileListInital();   //文件管理初始设定
	IrqEnable();        //中断允许
}

/*-----------------------------------------------------------------------------------
名称: void main(void)
功能: 主程序.
-----------------------------------------------------------------------------------*/
void main(void)
{
	SystemInital();                    //系统初始化
	SL811Init();                       //811 初始化
	LcdInital();                       //LCD 初始化
	LcdDisplayLogo();                  //LCD显示Logo图形
	PianoSensorModify();               //钢琴传感器调整

	LcdDisplayMenu(0);                 //LCD显示菜单图形
	while(GetKeyBoard());              //键盘数据
	SysWorkStatus = SYS_WORK_MENU_REC; //录音菜单状态

	while(1)
	{
		SystemRtcTask();           //系统时钟任务
		CheckUsbDevice();          //检测USB设备

		switch(SysWorkStatus)
		{
			case	SYS_WORK_MENU_REC:		//录音菜单状态
				switch(GetKeyBoard())
				{
					case	KEY_ENT:
						LcdClear();
						LcdDisplayAscii0816(0,0,0,128);
						LcdDisplayAscii0816String(0,20,0,"Record...");
						LcdDisplayTempo();
						LcdDisplayVolume();
						ResetSystemRtc();
						LcdDisplayClock(2,0,GetSystemRtc());
						SoundTempoChange();
						RecMidiStart();
						SysWorkStatus = SYS_WORK_RUN_REC;
					break;

					case	KEY_UP:
					case	KEY_DOWN:
						if(FlagRecEnd)
						{
							LcdClear();
							LcdDisplayAscii0816(0,0,0,128);
							LcdDisplayAscii0816String(0,20,0,"Rec Player...");
							LcdDisplayVolume();
							ResetSystemRtc();
							LcdDisplayClock(2,0,GetSystemRtc());
							PlayerStart();
							SysWorkStatus = SYS_WORK_REC_PLAY;
						}
					break;

					case	KEY_LEFT:
						LcdClear();
						LcdDisplayMenu(3);
						SysWorkStatus = SYS_WORK_MENU_SET;
					break;

					case	KEY_RIGHT:
						LcdClear();
						LcdDisplayMenu(1);
						SysWorkStatus = SYS_WORK_MENU_SAVE;
					break;
				}
			break;

			case	SYS_WORK_MENU_SAVE:		//存储菜单状态
				switch(GetKeyBoard())
				{
					case	KEY_ENT:
						if(FlagRecEnd)
						{
							LcdClear();
							LcdDisplayInputTextInital();
							SysWorkStatus = SYS_WORK_RUN_SAVE;
						}
					break;

					case	KEY_LEFT:
						LcdClear();
						LcdDisplayMenu(0);
						SysWorkStatus = SYS_WORK_MENU_REC;
					break;

					case	KEY_RIGHT:
						LcdClear();
						LcdDisplayMenu(2);
						SysWorkStatus = SYS_WORK_MENU_PLAY;
					break;
				}
			break;

			case	SYS_WORK_MENU_PLAY:		//放音菜单状态
				switch(GetKeyBoard())
				{
					case	KEY_ENT:
						LcdClear();
						LcdDisplayPlaySelectMenu(0);
						SysWorkStatus = SYS_WORK_SEL_RAM_PLAY;
					break;

					case	KEY_LEFT:
						LcdClear();
						LcdDisplayMenu(1);
						SysWorkStatus = SYS_WORK_MENU_SAVE;
					break;

					case	KEY_RIGHT:
						LcdClear();
						LcdDisplayMenu(3);
						SysWorkStatus = SYS_WORK_MENU_SET;
					break;
				}
			break;

			case	SYS_WORK_MENU_SET:		//设定菜单状态
				switch(GetKeyBoard())
				{
					case	KEY_ENT:
						LcdClear();
						LcdDisplayParamMenu(0);
						SysWorkStatus = SYS_WORK_SET_MENU_0;
					break;

					case	KEY_LEFT:
						LcdClear();
						LcdDisplayMenu(2);
						SysWorkStatus = SYS_WORK_MENU_PLAY;
					break;

					case	KEY_RIGHT:
						LcdClear();
						LcdDisplayMenu(0);
						SysWorkStatus = SYS_WORK_MENU_REC;
					break;
				}
			break;

			case	SYS_WORK_RUN_REC:		//录音工作状态
				if(!RecMidiRun())               //MIDI文件记录
				{
					RecMidiEnd();
					LcdClear();
					LcdDisplayMenu(0);
					SysWorkStatus = SYS_WORK_MENU_REC;
					break;
				}

				SoundTempoRun();                     //声卡节拍器运行
				LcdDisplayClock(2,0,GetSystemRtc()); //LCD显示时钟

				switch(GetKeyBoard())
				{
					case	KEY_ENT:
						RecMidiEnd();
						LcdClear();
						LcdDisplayMenu(0);
						SysWorkStatus = SYS_WORK_MENU_REC;
					break;

					case	KEY_UP:
					case	KEY_UP_ON:
						if(FlagTempo)
						{
							if(ParamaTempo<240)
							{
								ParamaTempo ++;
								SoundTempoChange();
								LcdDisplayTempo();
							}
						}
					break;

					case	KEY_DOWN:
					case	KEY_DOWN_ON:
						if(FlagTempo)
						{
							if(ParamaTempo>40)
							{
								ParamaTempo --;
								SoundTempoChange();
								LcdDisplayTempo();
							}
						}
					break;

					case	KEY_LEFT:
					case	KEY_LEFT_ON:
						if(ParamaVolume>0)
						{
							ParamaVolume --;
							SoundVolumeAdj();
							LcdDisplayVolume();
						}
					break;

					case	KEY_RIGHT:
					case	KEY_RIGHT_ON:
						if(ParamaVolume<127)
						{
							ParamaVolume ++;
							SoundVolumeAdj();
							LcdDisplayVolume();
						}
					break;
				}
			break;

			case	SYS_WORK_RUN_SAVE:		//存储工作状态
				switch(GetKeyBoard())
				{
					case	KEY_ENT:
						if(InputTableRow==0)
						{
							if(!FileNameCheckMemory(InputFileName))
								InputNameLen = 0;

							LcdClear();
							FlagSaveSel = false;
							LcdDisplaySaveSelect();
							SysWorkStatus = SYS_WORK_SAVE_ENT;
						}
						else
						{
							if(InputNameLen<8)
							{
								InputFileName[InputNameLen++] = TextInTabel[(InputTableRow-1)*17+InputTableCol];
								LcdDisplaytInputFileName(42);
							}

							LcdDisplayCursor(0);
							LcdDisplayAsciiTabel(0xFF);
							InputTableRow = 0;
						}
					break;

					case	KEY_LEFT:
						if(InputTableRow!=0)
						{
							if(InputTableCol)
								InputTableCol --;
							else
								InputTableCol = 16;

							LcdDisplayCursor(1);
							LcdDisplayAsciiTabel((InputTableRow-1)*17+InputTableCol);
						}
						else
						{
							if(InputNameLen)
							{
								InputFileName[InputNameLen-1] = ' ';
								InputNameLen --;
								LcdDisplaytInputFileName(42);
								LcdDisplayCursor(0);
							}
						}
					break;

					case	KEY_RIGHT:
						if(InputTableRow!=0)
						{
							if(InputTableCol<16)
								InputTableCol ++;
							else
								InputTableCol = 0;

							LcdDisplayCursor(1);
							LcdDisplayAsciiTabel((InputTableRow-1)*17+InputTableCol);
						}
					break;

					case	KEY_UP:
						if(InputNameLen<8)
						{
							if(InputTableRow)
								InputTableRow --;
							else
								InputTableRow = 3;

							if(InputTableRow==0)
							{
								LcdDisplayAsciiTabel(0xFF);
								LcdDisplayCursor(0);
							}
							else
							{
								LcdDisplayCursor(1);
								LcdDisplayAsciiTabel((InputTableRow-1)*17+InputTableCol);
							}
						}
					break;

					case	KEY_DOWN:
						if(InputNameLen<8)
						{
							if(InputTableRow<3)
								InputTableRow ++;
							else
								InputTableRow = 0;

							if(InputTableRow==0)
							{
								LcdDisplayAsciiTabel(0xFF);
								LcdDisplayCursor(0);
							}
							else
							{
								LcdDisplayCursor(1);
								LcdDisplayAsciiTabel((InputTableRow-1)*17+InputTableCol);
							}
						}
					break;
				}
			break;

			case	SYS_WORK_SEL_RAM_PLAY:		//放音选择RAM状态
				switch(GetKeyBoard())
				{
					case	KEY_ENT:
						if(MemMiscCnt=FileSearchMemory())
						{
							MemMiscPt=0;
							FileOpenMemory(MemMiscPt);

							LcdClear();
							LcdDisplaytFileName(MemMiscPt+1,&FileList[MemMiscPt].Name);
							LcdDisplayVolume();
							ResetSystemRtc();
							LcdDisplayClock(2,32,GetSystemRtc());
							PlayerStart();
							SysWorkStatus = SYS_WORK_RUN_PLAY;
						}
					break;

					case	KEY_UP:
						LcdClear();
						LcdDisplayPlaySelectMenu(2);
						SysWorkStatus = SYS_WORK_SEL_EXT_PLAY;
					break;

					case	KEY_DOWN:
						LcdClear();
						LcdDisplayPlaySelectMenu(1);
						SysWorkStatus = SYS_WORK_SEL_USB_PLAY;
					break;
				}
			break;

			case	SYS_WORK_SEL_USB_PLAY:		//放音选择USB状态
				switch(GetKeyBoard())
				{
					case	KEY_ENT:
						MemMiscCnt = ReadtUsbList(InOutBuf);

						if(MemMiscCnt!=0)
						{
							MemMiscPt = 0;

							if(FileOpenDisk(MemMiscPt))
							{
								LcdClear();
								LcdDisplaytFileName(MemMiscPt+1,InputFileName);
								LcdDisplayVolume();
								ResetSystemRtc();
								LcdDisplayClock(2,32,GetSystemRtc());
								PlayerStart();
								SysWorkStatus = SYS_WORK_USB_PLAY;
							}
						}
					break;

					case	KEY_UP:
						LcdClear();
						LcdDisplayPlaySelectMenu(0);
						SysWorkStatus = SYS_WORK_SEL_RAM_PLAY;
					break;

					case	KEY_DOWN:
						LcdClear();
						LcdDisplayPlaySelectMenu(2);
						SysWorkStatus = SYS_WORK_SEL_EXT_PLAY;
					break;
				}
			break;

			case	SYS_WORK_SEL_EXT_PLAY:		//放音选择退出状态
				switch(GetKeyBoard())
				{
					case	KEY_ENT:
						LcdClear();
						LcdDisplayMenu(2);
						SysWorkStatus = SYS_WORK_MENU_PLAY;
					break;

					case	KEY_UP:
						LcdClear();
						LcdDisplayPlaySelectMenu(1);
						SysWorkStatus = SYS_WORK_SEL_USB_PLAY;
					break;

					case	KEY_DOWN:
						LcdClear();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -