基于FPGA的音乐播放器设计报告 - 图文

2026/1/24 23:39:20

}

time(b*clupsec_num,a+1,num_music); //显示时间 usleep(20000); continue;

当开关swi[4]拨动到‘1’位置时,b是第几个簇,执行b=(b+4)%cluster_num实现快进。 (2)快退

else if(swi[5])//快退 {

b=(b+cluster_num-4)%cluster_num;

time(b*clupsec_num,a+1,num_music); //显示时间

usleep(20000); continue;

}

当开关swi[5]拨动到‘1’位置时,执行b=(b+cluster_num-4)%cluster_num实现快退。

(3)播放/暂停功能由开关swi[6]实现,实现代码:

else if(swi[6])//暂停

{ }

b=(b+cluster_num-1)%cluster_num; usleep(20000); continue;

当开关swi[6]拨动到‘1’位置时,执行b=(b+cluster_num-1)%cluster_num,实现暂停。

5.LCD显示歌曲名及歌词模块

(1)显示歌名

选歌定播放歌曲后,歌曲名会显示在LCD上,调用函数:

void show_name(char *name) {

UINT16 i,j,length_temp,length_n;//歌名显示的页面数

LCD_Init();

length_temp=strlen(name); if(length_temp<=32) {

length_n=1;

8

} else

length_n=(length_temp-32)/16+1;

for(i=0;i

lcd_write_cmd(LCD_16207_0_BASE,0x80);//写第一行 usleep(100); for(j=0;j<16;j++) {

lcd_write_data(LCD_16207_0_BASE,name[j+i*16]); usleep(100); }

lcd_write_cmd(LCD_16207_0_BASE,0xC0);//写第二行 usleep(100); for(j=0;j<16;j++) {

lcd_write_data(LCD_16207_0_BASE,name[j+i*16+16]); usleep(100); }

if(length_n>1) usleep(1000000); else

usleep(300000); }

}

(2)显示歌词

歌曲播放时LCD则会显示歌曲的歌词,先读取歌词后显示歌词,调用函数:

num_lyrics=read_lyrics(music[a].m_name,lyric,&lyrics,num_lyric,

&clupsec_num, &data_sect);//读歌词

for(k=0;k

time_base=j_base-lyrics.time[k]-2; if(j+j_base==lyrics.time[k]) {

lcd_write_cmd(LCD_16207_0_BASE,0x80); break; }

else if(j+j_base==lyrics.time[k]+36) {

lcd_write_cmd(LCD_16207_0_BASE,0xc0); break; }

9

else if(j%2==0&&(j+j_base>=lyrics.time[k]+2) &&(j+j_base<=lyrics.time[k]+34)) {

lcd_write_data(LCD_16207_0_BASE,

lyrics.text[k][(j+time_base)/2]); break; }

else if(j%2==0&&(j+j_base>=lyrics.time[k]+38) &&(j+j_base

lcd_write_data(LCD_16207_0_BASE,

lyrics.text[k][(j+time_base)/2-2]); break; }

}

该函数中首先匹配歌曲名字和歌词名字,找到匹配歌词后,读扇区,读入一个簇的歌词。如果歌词时间没有重复,即一句歌词对应一个时间标志的情况,从歌词开始标志开始读,一个扇区的数据读完,读取下一个扇区,读时间,计算歌词的长度是32的多少倍,将歌词补满32的整数倍个;如果歌词时间有重复,即一句歌词对应多个时间标志的情况,有几个时间信息,取出这句歌词对应的所有时间信息,如果一个扇区的数据读完,读取下一个扇区,进行时间转换,转换成这句歌词时间对应的扇区数,计算歌词的长度是32的多少倍,将歌词补满32的整数倍个;重复歌词读取。将读出来的歌词及其时间按时间顺序排序,将读出来的长歌词转换为短歌词,函数返回数值numb1。

6.LED显示功能

(1)红灯显示音量

将送入播放器的电平Buffer的值取出后按比例缩小,使其最大值为16,然后将缩小后的值通过处理后由LED灯显示。Buffer的值越大,表示当前电平值越大,则LED灯点亮的个数越多。

SD_read_lba(Buffer,j,1); i=0;

while(i<512) {

if(!IORD(AUDIO_0_BASE,0)) {

Tmp1=(Buffer[i+1]<<8)|Buffer[i];

10

IOWR(AUDIO_0_BASE,0,Tmp1); i+=2; } }

if(jd==0) {

Tmp2=(BYTE)(Buffer[i-2]/16); Tmp2=0xffff>>(16-Tmp2); Tmp2=Tmp2&0xffff;

IOWR(LED_RED_BASE,0,Tmp2);

}

(2)绿灯指示拨码开关状态

DE2平台上只有9个绿色的LED灯,所以只能够指示拨码开关swi0~8的状态,开关状态为“0”,则对应的灯灭;开关状态为“1”,则对应的灯亮。 swit1=IORD(SWITCH_PIO_BASE,0);

IOWR(LED_GREEN_BASE,0,swit1);

7.数码管显示当前曲目、总歌曲数和时间功能

DE2开发平台上共8个数码管,1、2两个数码管显示当前曲目,3、4数码管显示歌曲总数,5、6、7、8四个数码管显示当前歌曲的播放时间。数码管显示时调用函数:

void time(int j,int n,int num) {

int tim[2],h[2],m[2],s[2],b[2]; unsigned int display; j=j/375;

tim[0]=j/60; //min tim[1]=j`; //s

m[1]=tim[0]; m[0]=tim[0]/10; s[1]=tim[1]; s[0]=tim[1]/10; b[1]=n; b[0]=n/10; h[1]=num; h[0]=num/10;

display = b[0]*16*16*16*16*16*16*16+

b[1]*16*16*16*16*16*16+ h[0]*16*16*16*16*16+ h[1]*16*16*16*16+ m[0]*16*16*16+

m[1]*16*16+s[0]*16+s[1];

11


基于FPGA的音乐播放器设计报告 - 图文.doc 将本文的Word文档下载到电脑
搜索更多关于: 基于FPGA的音乐播放器设计报告 - 图文 的文档
相关推荐
相关阅读
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 10

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219