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

📄 mp3.c

📁 Build ourself a MP3 Player
💻 C
字号:
#include <18F452.h>

// note that these aren't 'valid' since we use a bootloader
#fuses   HS, NOPROTECT, NOWDT, PUT, NOBROWNOUT, NOLVP

// 20 MHz clock
#use delay (clock=20000000)

#use rs232 (baud=115200, xmit=PIN_C6, rcv=PIN_C7)

long t=0;
#int_timer2
void t2() {
   t++;         // increments once a millisecond
/*   if (t == 1000) {
      t = 0;
      putc('*');
   }
*/
}

//#use i2c(master, sda=PIN_C3, scl=PIN_C2)
#define SPI_CLK PIN_C0
#define SPI_SDO PIN_C1
#define I2C_SCL PIN_C2
#define I2C_SDA PIN_C3
#define MP3_DATAREQ PIN_A4
#define ENABLE_MP3 PIN_C4
#define MP3_RESET PIN_A0

#define BUTTON_VOLUP PIN_B1
#define BUTTON_VOLDN PIN_B4
#define BUTTON_1 PIN_B3
#define BUTTON_2 PIN_B5
#define BUTTON_3 PIN_B6
#define BUTTON_4 PIN_B7

// Disable automatic TRIS programming for all ports
#use fast_io(a)
#use fast_io(b)
#use fast_io(d)
#use fast_io(e)
#use fast_io(c)

#define nop #asm nop #endasm

#define TRIS_A    	0b001000  	// rst, mp3data, rdy, /we, /oe, /rst
#define TRIS_B    	0b11111010 	// 5 buttons, nc, button, /ce
#define TRIS_E		   0b000    	// all out addr pins
#define TRIS_C_I2CSEND		0b11100000	// 2 buttons (rx/tx), cd1, mp3enable, sda (i2c send), scl, sta_sdi, sta_sclk
#define TRIS_C_I2CRECV		0b11110000	// 2 buttons (rx/tx), cd1, mp3enable, sda (i2c recv), scl, sta_sdi, sta_sclk

byte sectorbuff[512];

#include "mp3.h"
#include "cf.c"
#include "fat16.c"
#include "sta013.c"



byte buttonquery() {
   byte b;

   if (t < 100) {
      return 0;
   }
   if (!input(BUTTON_VOLUP)) {
         t = 0;
         b = sta_getvolume();
         if (b != 0) {
            b--;
         }
         sta_setvolume(b);
         //printf("volume: %d\n\r", b);
         write_eeprom(EE_LASTVOLUME, b);
   }
   if (!input(BUTTON_VOLDN)) {
         t = 0;
         b = sta_getvolume();
         if (b <= 0x30) {
            b++;
         } else {
            b = 0x30;
         }
         //printf("volume: %d\n\r", b);
         sta_setvolume(b);
         write_eeprom(EE_LASTVOLUME, b);
   }

   if (t < 250) {
      return 0;
   }

   if (!input(BUTTON_1)) {
      t=0;
      printf("<<\n\r");
      return BUTTON_PREV;
   }
   if (!input(BUTTON_2)) {
      t=0;
      printf(">>\n\r");
      return BUTTON_NEXT;
   }
   if (!input(BUTTON_3)) {
         t=0;
         printf("b3 - prev\n\r");
   }

   if (!input(BUTTON_4)) {
      t = 0;
      printf("|> ||");
      return BUTTON_PAUSE;
   }

   return 0;
}

void convertToFATName(char *name) {
	int i;
	char e1, e2, e3;

	//printf("old name: '%s'\n\r", name);
	for(i=0; name[i] != 0; i++) {
		if (name[i] == '.') {
			if (i > 8) {
				printf("Error! name %s is too long!\n\r", name);
				return;
			}
			// save the extention;
			e1 = name[i+1]; e2 = name[i+2]; e3 = name[i+3];

			if (e1 == 0) e1 = 0x20;
			if (e2 == 0) e2 = 0x20;
			if (e3 == 0) e3 = 0x20;

			// fill the rest of the name with spaces.
			while (i<8) {
				name[i++] = ' ';
			}
			name[8] = e1; name[9] = e2; name[10] = e3; name[11] = 0;
			printf("new name: '%s'\n\r", name);
			return;
		}
	}
	for (; i<11; i++)
		name[i] = ' ';
	name[11] = 0;
//	printf("new name: '%s'\n\r", name);
}

void printPrompt() {
	printf("\n\rmp3> ");
}

boolean processCommand()
{
	int16 word;
	char cmd;
	char  name[20];
	byte ret;
   int32 len;

	cmd = getc();
	putc(cmd);
	putc('\n'); putc('\r');
	switch (cmd) {
		case 'e':
         ret = CF_Enable();
         break;
		case 'i':
         CF_Identify();
         break;
		case 'f':
         FAT_Init();
         break;
		case 'l':
         FAT_ListDir();
         break;
		case 'd':
         CF_CurrSector = Scan32Hex();
         putc('\t');
         CF_DumpSector();
         break;
		//case 'c': gets(name); convertToFATName(name); FAT_ChangeDir(name); break;
		case 'r':
         gets(name);
         convertToFATName(name);
         FAT_ReadFile(name);
         break;
		case 'n':
         word = Scan16Hex();
         word = FAT_GetNextCluster(word);
         printf("0x%lx\n\r", word);
         break;
		case 's':
         sta_identify();
         break;
		case 'm':
         sta_loadconfig();
         break;
		case 'p':
         gets(name); puts(name); convertToFATName(name);
         sta_playfilename(name);
         break;
      case 'b':
         buttonquery();
         break;
      case 'x':
         gets(name); convertToFATName(name);
         FAT_DeleteFile(name);
         break;
      case 'c':
         gets(name);
         convertToFATName(name);
         len = Scan32Hex(); putc('\t');
         FAT_CreateFile(name, FAT_findNextUnusedCluster(0x0002), len);
         break;
      case 'q':
         if (getc() == 'y') {
            FAT_QuickFormat();
         }
         break;
      case 'a':
         printf("next free cluster %lx\n\r", FAT_findNextUnusedCluster(0x0002));
         break;
  }

  return TRUE;
}


void main() {
	char c;
   byte ret;
	char name[20];

	setup_adc_ports(NO_ANALOGS); // port A all analog inputs
	setup_adc(ADC_CLOCK_DIV_32); // set ADC clock
	setup_psp(PSP_DISABLED);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DIV_BY_16,20,16);
   enable_interrupts(GLOBAL);
   enable_interrupts(INT_TIMER2);

	SET_TRIS_A(TRIS_A); // set TRIS values
	SET_TRIS_B(TRIS_B);
	SET_TRIS_C(TRIS_C_I2CSEND);
	SET_TRIS_D(TRIS_D_INPUT);
	SET_TRIS_E(0x0);

	printf("Minty Mp3! v1 3/25/2004\n\r");
	CF_Disable();

	port_b_pullups(TRUE); // for buttons & stuff
	output_e(0b111);

	CF_Enable();
	FAT_Init();
	sta_enable();
	sta_identify();
	sta_loadconfig();
   sta_setvolume(read_eeprom(EE_LASTVOLUME));
	c=0;

   t = 0;
   puts("waiting for char");
   while (1) {
      if (kbhit()) {
         getch();
         while (1) {
		    printPrompt();
		    processCommand();
	     }
      }
      // give'm 3 seconds to get it together
      if (t > 3000) {
         break;
      }
   }
   puts("timed out...playing");
	while (1) {
      ret = FAT_LoadFileInCWD(c);
	   if (ret == FAT_END_OF_DIR) {
        c = 0; continue;
	   } else if ((ret == FAT_LONG_FILENAME) || (ret == FAT_FILE_DELETED)) {
         c++;
         continue;
      }
     if (File_Name[8]=='M' && File_Name[9]=='P' &&  File_Name[10]=='3')  {
	      printf("Playing %s\n\r", File_Name);
		   ret = sta_playfilenum(c);
         switch (ret) {
            case NEXT_TRACK: c++; continue;
            case PREV_TRACK:
               {
                  if (c==0) { break; }
                  while (c>0) {
                     c--;
                     ret = FAT_LoadFileInCWD(c);
                     if ((ret == FAT_LONG_FILENAME) || (ret == FAT_FILE_DELETED)) {
                        continue;
                     }
                     if (File_Name[8]!='M' || File_Name[9]!='P' ||  File_Name[10]!='3') {
                        break;
                     }
                  }
                  break;
               }
            case STOP: return;
	     }

	  }
	  c++;
   }


	printf("Minty Mp3!\n\r");
}

⌨️ 快捷键说明

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