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

📄 mp3 1[1][1].1.c

📁 基于snd1c芯片的mp3播放器源代码(硬盘版本的)
💻 C
字号:
#include"bmp.h"
/************  pll  *****************************/
void InitPLL(void)
{//  for 20MHz to 192MHz   R=96-1 0x5f  N=10-1  0x09
	PLLNDIV=0x09;					//set N
	PLLRDIV=0x5f;
	PLLCON=(PLLRDIV&0x03)<<6;		//set R0..1
	PLLRDIV=PLLRDIV>>2;				//set R2..9
	PLLCON=PLLCON&0xf7;				//clear PLLRES bit
	PLLCON=PLLCON|0x02;				//set PLLEN bit
	while (!(PLLCON&0x01));
	CKCON = CKCON | 0x01;
}
/*********** SERIAL  LCD ************************/
void InitUART(void)
{	SCON  = 0x50;		 // SCON: mode 1, 8-bit UART, enable rcvr  
	BDRCON = 0x1e;		//BRR=1,TBCK=1,RBCK=1,SPD=1,M0SRC=0
	BRL = 126;			//  bound rate 9600 for 20MHz
	PCON=PCON|0x80;		// HIGH RATE
	EA=1;
	ES=1;
}
void UARTINT(void) interrupt 4
{	if(RI==1){RI=0;}
	else if(TI==1){TI=0;}
}
/**********   keyboard  ***********************/
CHAR getkey(void)
{	P1_5=0;
	P1_4=0;
	if(flag==0){keycode=0x00;   //NO INTERRUP
				}else{flag=0;}
	return(keycode);
}
void InterruptKEY(void) interrupt 11
{	CHAR LINE;
	H1=1;H2=1;
	LINE=0x00;	//def :0x0? ;H1=0:0x1? ;H2=0:0x2? ;H3=0:0x3? ;H4=0:0x4? ;    
	if(H1==0){LINE=0x10;}		//LINE:KEY TO VSS 
	if(H2==0){LINE=0x20;}
	keycode=KBSTA|LINE;
	flag=1;
}
void keyint(void)
{	KBCON=0x00;
	EA=1;
	keycode=0x00;
	IEN1=IEN1|0x10;
}
/**************  LCD  ***************************/
void LCD_BACK(CHAR B)
{	TXD(0x1B);TXD(0x31);TXD(B);
}
void LCD_LIGHT(void)
{	static CHAR  I;
	if(I){ 
		TXD(0x1B);TXD(0x25);TXD(I);I=0x00;
			}
	else { 
		TXD(0x1B);TXD(0x25);TXD(I);I=0x01;
}			}
void LCDPrint(CHAR LOX,LOY,BW,LEN,CHAR *text)
{	CHAR I;
	TXD(0x1B);TXD(0x33);TXD(LOX);TXD(LOY);	//X:0-19   Y:0-4
	TXD(0x1B);TXD(0x37);TXD(BW);	//1 NORMAL ; 0 FAN
	for(I=0;I<LEN;I++){TXD(text[I]);}
	TXD(0x00);
}
void LCDNUM(CHAR LOX,LOY,CHAR WB,CHAR NUMB)//2 wei
{	CHAR S,G,x;
	x=NUMB;	
	for(S=0;x>9;){S++;x-=10;}
	S+=0x30;
	for(G=0;x>0;){G++;x-=1;}
	G+=0x30;
	TXD(0x1B);TXD(0x33);TXD(LOX);TXD(LOY);
	TXD(0x1B);TXD(0x37);TXD(WB);TXD(S);TXD(G);TXD(0x00);
}
void LCD_CLA(void)
{	TXD(0x1B);TXD(0x32);
}
/*************** IDE IO *********************/
void IDE_Read_CHAR(DWORD K)		//读一个扇区到 IDE_DTEMP 数组
{	CHAR ADR[4];
	CHAR j;
	WORD i;
	EA=0;NOWSHAN=K;
	ADR[0]=K;K>>=8;ADR[1]=K;K>>=8;ADR[2]=K;K>>=8;ADR[3]=K; //0:L 3:H
	for(j=IDE_REG_STATUS&0x40;j!=0x40;j=IDE_REG_STATUS&0x40);	//DEVICE READY
	IDE_REG_LBA0=ADR[0];
	IDE_REG_LBA1=ADR[1];
	IDE_REG_LBA2=ADR[2];
	IDE_REG_LBA3=ADR[3]|0xE0;

	IDE_REG_SECCNT=0x01;      //1 secort
	IDE_REG_COMMAND=0x20;		//write

	for(j=IDE_REG_STATUS&0x08;j!=0x08;j=IDE_REG_STATUS&0x08);	//data require check
	AUXR|=0x40;
	for(i=0;i<512;)
	{
		IDE_DTEMP[i++]=IDE_REG_DATA;
		IDE_DTEMP[i++]=IDE_DMB;
	}
	AUXR&=0xBF;
}
void IDEReset(void)
{		CHAR i;
		IDE_RST=0;
		for(i=0;i<125;i++);
		IDE_RST=1;
}
/******************  FAT32 00 ********************************/
/*****  设想文件都是连续的  没有碎片   *********************/
CHAR CHECK_FILE(CHAR NUM)
{	WORD J;CHAR L=NUM;
		/*****0xE5 DELECTed,0x0F long name,0x00 empty*****/
for(J=L*32;(IDE_DTEMP[J]==0xE5)||(IDE_DTEMP[J+0x0B]==0x0F)||L>0x0F||IDE_DTEMP[J]==0x00;J=L*32)
	{
	if(IDE_DTEMP[J]==0x00){
			IDE_Read_CHAR(NOWCHU);//结尾,返回读首扇,只支持16*8=128项
			L=0;}
	if(L>0x0F){
				IDE_Read_CHAR(++NOWSHAN);	
				L=0;
				}else L++;
	}
	return(L);
}
CHAR FAT32_LIST(CHAR LINE)	//输入要求首行,显示两行。可三四行
{
	WORD J,L;
	CHAR K,N;
	CHAR TE[19];	//CHAR SIZE[4];
	CHAR CNUM[4];
	CHAR N_UNIT;	//当前扇区中的第几项

	L=CHECK_FILE(LINE);
		TE[0]='*';
		for(J=L*32,K=1,N=0;N<13;J++,K++,N++)
		{		
			if(N<0x08) TE[K]=IDE_DTEMP[J];
			if(N==0x08) {TE[0x09]='.';TE[0x0A]=IDE_DTEMP[J];}
			if(N==0X09) TE[0x0B]=IDE_DTEMP[J];
			if(N==0X0A) TE[0x0C]=IDE_DTEMP[J];
		}
	LCDPrint(0,2,0,13,TE);
			L++;

	L=CHECK_FILE(L);N_UNIT=L;
		TE[0]='>';TE[1]='>';TE[2]=' ';
		for(J=L*32,K=3,N=0;N<0x1D;N++,J++,K++)
		{
			if(N<0x08) TE[K]=IDE_DTEMP[J];
			if(N==0x08) {TE[0x0B]='.';TE[0x0C]=IDE_DTEMP[J];}
			if(N==0X09) TE[0x0D]=IDE_DTEMP[J];
			if(N==0X0A) TE[0x0E]=IDE_DTEMP[J];
			if(N==0x08) ExName=IDE_DTEMP[J];	//第八项为扩展名首字
//			if(N==0x1C) SIZE[0]=IDE_DTEMP[J];
//			if(N==0x1D) SIZE[1]=IDE_DTEMP[J];
//			if(N==0x1E) SIZE[2]=IDE_DTEMP[J];
//			if(N==0x1F) SIZE[3]=IDE_DTEMP[J];
			if(N==0x1A) CNUM[0]=IDE_DTEMP[J];
			if(N==0x1B) CNUM[1]=IDE_DTEMP[J];
			if(N==0x14) CNUM[2]=IDE_DTEMP[J];
			if(N==0x15) CNUM[3]=IDE_DTEMP[J];
		}
	LCDPrint(0,3,1,15,TE);
ENTER=CNUM[3];ENTER<<=8;ENTER+=CNUM[2];ENTER<<=8;
ENTER+=CNUM[1];ENTER<<=8;ENTER+=CNUM[0];
//CHU_NUM=ENTER;	//记录簇号
ENTER=(ENTER-2)*SecPer+ROOT;//记录簇号转扇区地址 准备进入 
	L++;

	L=CHECK_FILE(L);
		TE[0]='*';
		for(J=L*32,K=1,N=0;N<13;J++,K++,N++)
		{		
			if(N<0x08) TE[K]=IDE_DTEMP[J];
			if(N==0x08) {TE[0x09]='.';TE[0x0A]=IDE_DTEMP[J];}
			if(N==0X09) TE[0x0B]=IDE_DTEMP[J];
			if(N==0X0A) TE[0x0C]=IDE_DTEMP[J];
		}
	LCDPrint(0,4,0,13,TE);
	return(N_UNIT);//返回当前可显示项的下一项
}
void FAT32_ROOT(void)	//一次16个项目,进入list,menu
{	IDE_Read_CHAR(ROOT);
	NOWCHU=ROOT;
	MODEL=0x00;
}
void FAT32_INT(void)
{
	IDE_Read_CHAR(HDD_DBR);	//FAT32_READ_DBR
	SecPer=IDE_DTEMP[0x0D];	  //每簇扇区数
	ROOT=IDE_DTEMP[0x25]+IDE_DTEMP[0x25];ROOT<<=8;
	ROOT+=IDE_DTEMP[0x24]+IDE_DTEMP[0x24]+FAT_BASE;
}
/*****************  BMP 03 *************************/
void BMP(void)		//max size 128*64
{	CHAR H;
	WORD P=0;
	CHAR HH=(IDE_DTEMP[0x12]/8);
	CHAR HHH=(IDE_DTEMP[0x12]);
	CHAR LL=IDE_DTEMP[0x16];
	P+=IDE_DTEMP[0x0A];
	for(;0<LL;)//高度
	{
	TXD(0x1B);TXD(0x42);TXD(0x01);
	TXD(0x00);//X
	TXD(--LL);//Y
	TXD(HHH);//H 宽度
	TXD(0x01);//LINE=1 下到上逐行显示
	for(H=0;H<HH;H++)
		{
		TXD(IDE_DTEMP[P++]);//PIC
		if(P==512){P=0;IDE_Read_CHAR(++NOWSHAN);}
}	}	}
/*****************   MP3  02 **********************/
void InterruptDecoder(void) interrupt 5
{	MP3RQ=1;
}
void InitAUD(void)//only for 44.1khz
{	AUDCLK=10;
	AUDCON0=0;
	AUDCON0|=0x02;
	AUDCON0|=0x08;
	AUDCON0|=0x01;
	AUDCON1=0x71;
}
void mp3(void)
{	WORD I;
	MP3CLK=0x07;				//set MP3 decoder clock  192/8=24MHz
	EMP3=0;
	MP3VOL=15;MP3VOR=15;
	for(I=0;I<512;I++){MP3DAT=IDE_DTEMP[I];}
	IDE_Read_CHAR(++NOWSHAN);
	for(I=0;I<512;I++){MP3DAT=IDE_DTEMP[I];}
	IDE_Read_CHAR(++NOWSHAN);
	MP3FRAM=0;
	LCDPrint(1,1,0,11,"mp3 playing");
	MP3CON=0xb7;	//启动解码器
	InitAUD();
	EMP3=1;
}
/*****************   TXT  01 **********************/
CHAR TXT(CHAR L)
{	CHAR J,H,TTEMP[19];
	WORD K;
	H=L;
	K=H*16;
	LCD_CLA();
	if(K>512){K=0;IDE_Read_CHAR(++NOWSHAN);H=0;}
		for(J=0;J<16;J++){TTEMP[J]=IDE_DTEMP[K++];}
	TTEMP[16]=' ';TTEMP[17]='^';
	LCDPrint(1,0,0,18,TTEMP);

	if(K>512){K=0;IDE_Read_CHAR(++NOWSHAN);H=0;}
		for(J=0;J<16;J++){TTEMP[J]=IDE_DTEMP[K++];}
	TTEMP[16]=' ';TTEMP[17]='^';
	LCDPrint(1,1,0,18,TTEMP);

	if(K>512){K=0;IDE_Read_CHAR(++NOWSHAN);H=0;}
		for(J=0;J<16;J++){TTEMP[J]=IDE_DTEMP[K++];}
	TTEMP[16]=' ';TTEMP[17]='*';
	LCDPrint(1,2,0,18,TTEMP);

	if(K>512){K=0;IDE_Read_CHAR(++NOWSHAN);H=0;}
		for(J=0;J<16;J++){TTEMP[J]=IDE_DTEMP[K++];}
	TTEMP[16]=' ';TTEMP[17]='^';
	LCDPrint(1,3,0,18,TTEMP);

	if(K>512){K=0;IDE_Read_CHAR(++NOWSHAN);H=0;}
		for(J=0;J<16;J++){TTEMP[J]=IDE_DTEMP[K++];}
	TTEMP[16]=' ';TTEMP[17]='^';
	LCDPrint(1,4,0,18,TTEMP);

	return(H);
}
/*****************   MAIN   ***********************/
void ENTER_FD(void)
{	WORD K;
	IDE_Read_CHAR(ENTER);for(K=0;K<512;K++){TXD(IDE_DTEMP[K]);}
	switch(ExName){	//most number is 26
		case 'T':MODEL=0x01;TXT(0x00);	
			break;
		case 'M':MODEL=0x02;mp3();
			break;
		case 'B':MODEL=0x03;BMP();
			break;
		case ' ':MODEL=0x00;NOWCHU=ENTER;FAT32_LIST(0);//Dir show TITLE 1
			default:break;
						}
}
void main(void)
{	CHAR I;CHAR L=0;
	keyint();
	InitUART();
	InitPLL();
	LCD_CLA();
	LCD_BACK(0x25);
	IDEReset();
		LCDPrint(0,0,0,16,"Init The HDD...");

	FAT32_INT();
	FAT32_ROOT();//读入根目录扇区,,使用MAIN按键进入,同时停止播放
	I=FAT32_LIST(0);//0 初始显示
		LCDPrint(0,0,0,16,"Init The HDD  OK");
while(1)
	{
	switch(getkey())
		{
		case 0x01:
			switch(MODEL)
				{
				case 0x00:ENTER_FD();I=3;	//1ST 2ND IS . ..
					break;
				case 0x01:L=TXT(++L);
					break;
				case 0x02:
					break;
				default:break;
				 }break;
		case 0x02:
			switch(MODEL)
				{
				case 0x00:I=FAT32_LIST(I);
					break;
				case 0x01:L=TXT(--L);
					break;
				case 0x02://FAT32_ROOT();FAT32_LIST(0);
					break;
				default:break;
				 }break;
		case 0x04:
			switch(MODEL)
				{
				case 0x00:I=FAT32_LIST(0);
					break;
				case 0x01:LCD_CLA();FAT32_ROOT();I=FAT32_LIST(0);
					break;
				case 0x02://PAUSE();
					break;
				case 0x03:LCD_CLA();FAT32_ROOT();I=FAT32_LIST(0);
					break;		
				default:break;
				 }break;
		case 0x08:LCD_LIGHT();LCDNUM(0,0,0,3);break;
		default:break;
		}
	if(MP3RQ){MP3RQ=0;
			EMP3=0;
			for (;MPREQ||MP3STA1;)				//需要数据
			{
			MP3DAT=IDE_DTEMP[MP3FRAM++];//TXD(J);
			if(MP3FRAM==512){IDE_Read_CHAR(++NOWSHAN);MP3FRAM=0;}
			}
			EMP3=1;
				}
	}
}

⌨️ 快捷键说明

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