📄 mp3.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 + -