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

📄 yampp7_usb.c

📁 yampp mp3 source code
💻 C
📖 第 1 页 / 共 5 页
字号:
//////////////////////////////////////////////////////////////////

	sbi(PORTE,BUTTON_1);			// pin PE0 is keyboard input, enable pullup

#ifndef PCB_REV_D
	cbi(CHARGE_PORT-1,CHARGE_PIN);		// set pin as input
	sbi(CHARGE_PORT,CHARGE_PIN);		// activate pullup
#endif

#if defined (__AVR_ATmega162__)
	outp(0, EMCUCR);
	set_cpu_speed(CLKDIV);			// CPU clock = XTAL / M162CLKDIV
						// eg about 3-4MHz
 #if (BACKLIGHT_TIME != 0)
	outp(0x00, OCR0);			// PWM duty = 0%
	outp((1<<WGM00) | (1<<COM01) | (1<<CS01) , TCCR0);	// Timer 0 normal PWM mode, CLK/8
 #endif
#endif

	outp((1<<SRE), MCUCR);			// enable external SRAM 

	delayms(50);
	usb_init();
	wdt_enable(7);

	//
	// setup timer1 for a 100mS periodic interrupt
	//	
	outp(0, TCCR1A);
	outp(4, TCCR1B);			// prescaler /256  tPeriod = 32 uS
	outp(TI1_H, TCNT1H);			// load counter value hi
	outp(TI1_L, TCNT1L);			// load counter value lo

	sbi(TIMSK, TOIE1);	 		// enable timer1 interrupt

	// setup some buffers
	SectorBuffer = (u08 *) card_sbuf;	// 512 bytes

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

	u08 tmp,logo;

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

	sei();
#ifdef LCD_NEGATIV
	lcd_init(1);
#else
	lcd_init(0);
#endif

	tmp = eeprom_rb(EEPROM_LCD_CONTRAST);
	if (tmp > 0x58 || tmp < 0x20)
	{
		tmp = 0x45;
		eeprom_wb(EEPROM_LCD_CONTRAST,tmp);
	}
	lcd_contrast(tmp);
	lcd_clrscr();
 #if (BACKLIGHT_TIME != 0)
	light_mode = eeprom_rb(EEPROM_BACKLIGHT) % 6;
	backlight_on();
 #endif
	logo = 4+lcd_logo(0);
	if (logo == 4)
		lcd_gotoxy(3,logo);
	else
		_p_puts(model_txt);
	puts(" v.");
	_p_puts(version_txt);

	// 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(0);

	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
 	puts("\nInit Card...\n");

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

	if (!logo)					// 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
	logo = 4+lcd_card_logo();
	if (logo == 4)
		lcd_clrline(5);
	else
		lcd_gotoxy(0,2);

  	puts("Ready!\n");

	beep(SINE_1500,100);				// Wakeup beep

	outp(0x40,ACSR);				// Enable Analog Comparator and Bandgap reference

	init_stuff();

	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 = 2;				// 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;
#if (BACKLIGHT_TIME != 0)
			case EV_LIGHTMODE:
				lcd_gotoxy(0,5);
 #if defined (__AVR_ATmega162__)
				light_mode =(u08)(light_mode + 1) % 6;
				if(light_mode == 0)
					puts("OFF");
				else if(light_mode == 1)
					puts("OFF/DIMM");
				else if(light_mode == 2)
					puts("OFF/ON");
				else if(light_mode == 3)
					puts("DIMM");
				else if(light_mode == 4)
					puts("DIMM/ON");
				else
					puts("ON");
				puts("       ");
 #else
				light_mode =(u08)(light_mode + 1) % 3;
				if(light_mode == 0)
					puts("OFF");
				else if(light_mode == 1)
					puts("AUTO");
				else
					puts("ON");
				puts("   ");
 #endif
				if(light_mode)
					backlight_on();
				else
					backlight_off();
				break;
#endif
			case EV_TIME:
				timemode = !timemode;				// change mode of time displaying (normal<->remain)
				lcd_gotoxy(0,5);
				if(timemode)
					puts("REMAIN ");
				else
					puts("NORMAL ");

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

			case EV_PLAYLIST:
				event = EV_IDLE;
				info_flag = 2;					// 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;
					outp(0xA0,MCUCR);			// 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(8,3);		// position for "Paused" string
						if (cc > 4)
						{
#if (BACKLIGHT_TIME == 0)
							cbi(PORTB,LED_PIN);	// LED off
#endif
							asm volatile ("nop");
						}
						else
						{
#if (BACKLIGHT_TIME == 0)
							sbi(PORTB,LED_PIN);	// LED on
#endif
							lcd_invert();		// set white on black mode
						}
						puts("Paused");			// printf string on LCD
						lcd_normal();			// set black on white mode
						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;
#if (BACKLIGHT_TIME == 0)
					sbi(PORTB,LED_PIN);			// LED On
#endif
					time_flag = 5;
					break;
				}
				else						// Play function
				{
					BatteryMeasure();
					
					if (lobatt)				// low battery
					{
						lcd_gotoxy(0,logo);
						puts("Low Battery !");
						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_PLAY_USB:
				lcd_gotoxy(0,logo);
				puts("Playing via\nUSB");
				usb_play = 1;
				isPlaying = 1;
#if (BACKLIGHT_TIME == 0)
				sbi(PORTB, LED_PIN);				// LED ON
#endif
				vs1001_reset(0);
				LoudSet();
				break;
*/
			case EV_STOP:
				if (menu_event)
				{
					time_flag = 40;
					break;
				}
				if (isPlaying)
				{
					sleepcount = 0;			// clear shutdown timeout count
					vs1001_reset(0);
					vs1001_write(0x0A,0);
					InitRnd();			// init randomizer table
					isPlaying = 0;
					usb_play = 0;
				}
//				vs1001_write(0x0B,0xffff);		// turn off analog part of VS1001, generate a click
				info_flag = 0;
				lcd_clrscr();
				if(lcd_card_logo())
				{
					lcd_gotoxy(1,2);
					puts("yampp-7 ");
				}
				else
					lcd_gotoxy(0,4);
				puts("STOP");
				BatteryMeasure();
				
				if (lobatt)
					lobatt = 2;
				status_display();
#if (BACKLIGHT_TIME == 0)
				cbi(PORTB,LED_PIN);				// Led Off
#endif
				if(usb_link)
				{
					lcd_gotoxy(0,logo-1);
					puts("\nPC Link Active\n");
					eeprom_update();
					usb_response(0);
					lobatt_time = 0;
#if defined (__AVR_ATmega162__)
 #ifndef MMC_CARD
					outp(0xC0, MCUCR);			// enable external SRAM 1 waitstate
 #endif
					set_cpu_speed(0);			// CPU clock = XTAL
#endif										// eg about 8-14MHz
				}
				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;

⌨️ 快捷键说明

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