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

📄 yampp7_usb.c

📁 DIY自己的MP3的参考价值极高的代码。含有详细的解释
💻 C
📖 第 1 页 / 共 5 页
字号:
	SectorBuffer = (u08 *) card_sbuf;	// 512 bytes

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

	u08 tmp;

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

	sei();
	lcd_init();
	tmp = eeprom_rb(EEPROM_LCD_CONTRAST);
	if (tmp > 0x40 || tmp < 0x10)
	{
		tmp = 45;
		eeprom_wb(EEPROM_LCD_CONTRAST,tmp);
	}
	lcd_contrast(tmp);

	light_mode = eeprom_rb(EEPROM_BACKLIGHT) % 6;
	backlight_on();

	// init VS1001
	cbi(PORTB,RESET_PIN);				// RESET- lo
	delayms(2);
	sbi(PORTB,RESET_PIN);				// RESET- hi
	delayms(10);
	vs1001_init_io();				// init VS1001
	vs1001_setcomp(F_VS1001);
	vs1001_reset();

	if ((volume = eeprom_rb(EEPROM_VOLUME)) > MIN_VOLUME)
		volume = MIN_VOLUME / 2;		// half scale
	balance = eeprom_rb(EEPROM_BALANCE) & 0xfe;
	bLoudness = eeprom_rb(EEPROM_LOUDNESS) % 13;
	bRandom = eeprom_rb(EEPROM_RANDOM);
	Repeat = eeprom_rb(EEPROM_REPEAT) % 4;
	timemode = eeprom_rb(EEPROM_TIME);
	autolock = eeprom_rb(EEPROM_AUTOLOCK);
	curIndex = eeprom_rw(EEPROM_SONGPOS);
	curPlaylist = eeprom_rw(EEPROM_PLAYLIST);

	vs1001_setvolume(volume,balance);

	// Init and wait for CARD ready
 	_p_puts(CardInit_txt);

#ifdef MMC_CARD
	MMC_Reset();
#else
	ATA_SetDrive(0);
#endif
	delayms(10);
#ifndef FIXED_RESET
	u08 tmp2;
	tmp = 4;
	while(tmp--)					// for propper CF init after card removing.
	{
		wdt_reset();
		tmp2 = CARD_SW_Reset2();
		if (tmp2)				// if card is ready
			break;
		else
			beep(SINE_800,50);
	}

	if (!tmp2)					// if card is not ready
		PowerOff();				// power off
#else
	wdt_reset();
	if (!CARD_SW_Reset2())
	{
		delayms(800);
		PowerOff();				// power off
	}
#endif

#ifndef MMC_CARD
	WriteBYTE(ATA_SectorCount, SLEEP_TIME);		// CF standby time * 5 milisecond (0=disable)
	WriteBYTE(ATAPI_Cmd, 0xE3);			// set CF standby timer and execute IDLE
	ATA_WaitBusy();
#endif
	init_stuff();

	lcd_image(0);					// Welcome STOP image

	CARD_Read(lcd_data_start + (32*IMAGES_COUNT));	// read set of colours from bitmap (icon00.bmp)
	memcpy(&colors[0], SectorBuffer, 40);


	lcd_gotoxy(SOFT_VER_INFO_XPOS, SOFT_VER_INFO_YPOS);
	lcd_color(colors[SOFT_VER_INFO], colors[SOFT_VER_INFO+16]);
	_p_puts(model_txt);
	puts(" v.");
	_p_puts(version_txt);

	beep(SINE_1500,100);				// Wakeup beep
	ACSR = 0x40;					// Enable Analog Comparator and Bandgap reference
	InitRnd();					// init randomizer table
	LoudSet();
	if (curPlaylist >= playlist_qty)
		curPlaylist = curIndex = 0;

	delayms(1000);
	wdt_enable(6);

///////////////////////////////////////////////////////////////////////////////
// start things rolling
///////////////////////////////////////////////////////////////////////////////

	event_e event = EV_IDLE;
	YADL_PLAY_LIST_ENTRY *pListEntry;

	set_event(EV_STOP);

	//
	// main loop
	//
  	while (1) 
  	{
		event = get_event();
		switch (event)
		{
			default:
			case EV_IDLE: 
				break;

			case EV_MENU:
				info_flag = 3;				// disable displaying
				menu_event = browse_menu() + 1;

				if(menu_event)
				{
					set_event(menu_event);
					break;
				}
				else
				{
BROWSE_BREAK:				info_flag = 0;			// enable displaying
					menu_event = EV_IDLE;
					if (isPlaying)
						Playlist_name();	// show Playlist name
					else
						set_event(EV_STOP);
					break;
				}

			case EV_CONTRAST:
				set_contrast();
				break;

			case EV_LIGHTMODE:
				lcd_clricon(BL_TI_MODES);
				light_mode =(u08)(light_mode + 1) % 6;
				if(light_mode == 0)
					_p_puts(Blight0);

				else if(light_mode == 1)
					_p_puts(Blight1);

				else if(light_mode == 2)
					_p_puts(Blight2);

				else if(light_mode == 3)
					_p_puts(Blight3);

				else if(light_mode == 4)
					_p_puts(Blight4);

				else
					_p_puts(Blight5);

				if(light_mode)
					backlight_on();
				else
					backlight_off();
				break;

			case EV_TIME:
				timemode = !timemode;				// change mode of time displaying (normal<->remain)
				lcd_clricon(BL_TI_MODES);
				if(timemode)
					_p_puts(TimRem_txt);
				else
					_p_puts(TimNor_txt);

				sleepcount = 0;					// clear shutdown timeout count
				break;

			case EV_PLAYLIST:
				event = EV_IDLE;
				info_flag = 3;					// disable displaying
				u16 Index = browse_songs();			// browse songs within playlist
				if (Index == (u16)-1)
					goto BROWSE_BREAK;

				curIndex = Index;
				menu_event = EV_IDLE;
				info_flag = 0;
				InitRnd();
				isPlaying = 0;

			case EV_PLAY:
				if (menu_event)
				{
					set_event(menu_event);
					time_flag = 0;
					continue;
				}

				if (isPlaying)					// Pause function
				{
					while(get_event() != EV_IDLE)		// Wait for release key
						wdt_reset();

					lobatt_time = 0;
					MCUCR = 0xA0;				// enable SLEEP mode
					u08 cc = 6;
					isPlaying = 0;
					do 
					{
						asm volatile ("sleep");		// go to sleep
						asm volatile ("nop");
						wdt_reset();
						if (cc-- == 0)
							cc=8;

						lcd_gotoxy(SONG_TIME_XPOS+1, SONG_TIME_YPOS);	// position for "Paused" string
						if (cc > 4)
							lcd_color(colors[PAUSED_TEXT1], colors[PAUSED_TEXT1+16]);
						else
							lcd_color(colors[PAUSED_TEXT2], colors[PAUSED_TEXT2+16]);

						_p_puts(Pause_txt);		// printf string on LCD

						time_flag = 1;

						if (lobatt_time > MAX_PAUSE_TIME || !CARD_SW_Reset2())
							PowerOff();		// max 15 minutes of pause

						get_key();

					} while (check_event() != EV_PLAY);	// stay within loop until play pressed again
					isPlaying = 1;
					time_flag = 5;
					break;
				}
				else						// Play function
				{
					lobatt = 0;
					BatteryMeasure();
					
					if (lobatt)				// low battery
					{
						lcd_color(colors[LOBATT_TEXT], colors[LOBATT_TEXT+16]);
						lcd_clrline(BATTCHARGE_TEXT_YPOS);
						_p_puts(Lobatt_txt);
						send_sinewave_beeps();
						delayms(1000);
						PowerOff();
					}

					if(curPlaylist < playlist_qty && playlist_qty > 0)
					{
						pListEntry = get_pl_entry(curPlaylist);
						if(curIndex >= pListEntry->entry_qty)
							curIndex = 0;
						play_song();
					}
					break;
				}

			case EV_STOP:
				if (menu_event)
				{
					time_flag = 40;
					break;
				}
				if (isPlaying)
				{
					sleepcount = 0;			// clear shutdown timeout count
					vs1001_reset();
					vs1001_write(0x0A,0);
					InitRnd();			// init randomizer table
					isPlaying = 0;
				}

				info_flag = 0;
				lcd_image(0);
/*
				u08 q,w;
				for(q=0; q<16; q++)			// colour pallete test
					for(w=0; w<16; w++)
					{
						lcd_gotoxy(w*8,q*8);
						lcd_color(16*q + w, 0);
						lcd_putchar(' ');
					}
*/
				BatteryMeasure();
				if (lobatt)
					lobatt = 2;
				status_display();

				if(usb_link)
				{
					lcd_gotoxy(LINK_ACTIV_TEXT_XPOS, LINK_ACTIV_TEXT_YPOS);
					lcd_color(colors[PCLINK_TEXT], colors[PCLINK_TEXT+16]);
					_p_puts(PClink_txt);
					eeprom_update();
					usb_response(0);
					lobatt_time = 0;
#ifndef MMC_CARD
					EMCUCR = (1<<SRW11);	// enable external SRAM 2 waitstates
#endif
					set_cpu_speed(0);	// CPU clock = XTAL
//					break;
				}
				break;

			case EV_BALANCE:
				if (isPlaying)
				{
					info_flag = 1;
					time_flag = 0;
					Playlist_name();
				}
				break;

			case EV_DOWN:						// volume down (or balance left)
				if (isPlaying)
				{
					if(info_flag == 1)
					{
						time_flag = 0;
#ifdef REVERSE_BALANCE
						if (balance < 57)
							balance +=2;
#else
						if (balance > -57)
							balance -=2;
#endif
					}
					else
					{
						if (volume <= MIN_VOLUME-VOL_STEP) 
							volume += VOL_STEP;
						else
							volume = MIN_VOLUME;
					}
					goto SETVOL;
				}
				else if (!menu_event)
					set_event(EV_CONTRAST);
				break;

			case EV_UP: 						// volume up (or balance right)
				if (isPlaying)
				{
					if(info_flag == 1)
					{
						time_flag = 0;
#ifdef REVERSE_BALANCE
						if (balance > -57)
							balance -=2;
#else
						if (balance < 57)
							balance +=2;
#endif
					}
					else
					{
						if (volume >= VOL_STEP) 
							volume -= VOL_STEP;
						else
							volume = 0;
					}
SETVOL:					vs1001_setvolume(volume,balance);
					status_display();
					break;
				}
#if (AUTOLOCK_TIME != 0)
				else  if (!menu_event)
					set_event(EV_AUTOLOCK);
				break;

			case EV_AUTOLOCK:
					autolock = !autolock;
					status_display();
					sleepcount = 0;			// clear shutdown timeout count
					if (!menu_event)
						delayms(500);
#endif
					break;

			case EV_NEXT:
				if (info_flag == 1)
				{
					set_event(EV_UP);		// if balance control active
					break;
				}
				if (menu_event)
				{
					set_event(EV_MENU);		// if menu is active
					break;
				}
				if (isPlaying)
					next_song(1);			// while playing
				else 
					set_event(EV_MBASS);		// while stop
				break;

			case EV_PREV:
				if (info_flag == 1)
				{
					set_event(EV_DOWN);		// if balance control active
					break;
				}
				if (menu_event)
				{
					set_event(EV_MENU);		// if menu active
					break;
				}
				if (isPlaying)
					next_song(2);			// while playing
				else
					set_event(EV_RANDOM);		// while stop
				break;

			case EV_NEXTPL:
				next_playlist();
				goto PLCHG;

			case EV_PREVPL:
				prev_playlist();
				if (!bRandom)
					curIndex = 0;			
PLCHG:				if (isPlaying)
					play_song();
				Playlist_name();
				break;

			case EV_FFWD:
				if (isPlaying)
				{
					MyCluster = next_fat();		// get next cluster position
					init_load_sectors(MyCluster);		// skip to next cluster

					// calculate new size of played data
					fileplayed = ClusterCount * YADL_CLUSTERSIZE / 32;

					// calculation of playing time - small hazard :-)
					addtime = (u16)(fileplayed*32 / (bitrate * 125)) - 
							vs1001_read(VS1001_PLAYTIME); 

					outptr = SectorBuffer;			// play from buffer 1
					vs1001_setvolume(volume+40,balance);	// volume down during search
					vol_decrease = 1;			// setting of volume downed flag
					time_flag = 5;
				}
				else if (!isPlaying && !menu_event)
					PowerOff();					// while stop

				break;

			case EV_MBASS:
				if (vs1001_fw == 0x4020)
					bLoudness = (u08)(bLoudness+1) % 9;
				else if (vs1001_fw == 0x4200)
					bLoudness = (u08)(bLoudness+1) % 13;
				else
					bLoudness = !bLoudness;
				LoudSet();
				status_display();
				sleepcount = 0;					// clear shutdown timeout count
				break;

			case EV_RANDOM:
				bRandom = !bRandom;
				status_display();
				sleepcount = 0;					// clear shutdown timeout count
				break;

			case EV_REPEAT:
				Repeat = (u08)(Repeat + 1) % 4;
				status_display();
				sleepcount = 0;					// clear shutdown timeout count
				break;
		}
		event = EV_IDLE;
  	} // while (1)    
}

⌨️ 快捷键说明

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