}
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

