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