打印

音乐播放器实验中按键是有什么方式控制的?

[复制链接]
1921|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jxmzzr|  楼主 | 2013-10-19 20:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
音乐播放器实验中按键是有什么方式控制的?  查询还是中断?
u8 mp3_play_song(u8 *pname)
{         
        FIL* fmp3;
    u16 br;
u8 res,rval;          
u8 *databuf;                       
u16 i=0;
u8 key;              
   
rval=0;            
fmp3=(FIL*)mymalloc(SRAMIN,sizeof(FIL));//申请内存
databuf=(u8*)mymalloc(SRAMIN,4096);         //开辟4096字节的内存区域
if(databuf==NULL||fmp3==NULL)rval=0XFF ;//内存申请失败.
if(rval==0)
{          
          VS_Restart_Play();           //重启播放
VS_Set_All();                 //设置音量等信息           
VS_Reset_DecodeTime();         //复位解码时间           
res=f_typetell(pname);                           //得到文件后缀                                       
if(res==0x4c)//如果是flac,加载patch
{       
VS_Load_Patch((u16*)vs1053b_patch,VS1053B_PATCHLEN);
}                                            
res=f_open(fmp3,(const TCHAR*)pname,FA_READ);//打开文件         
         if(res==0)//打开成功.
{
VS_SPI_SpeedHigh();        //高速            
while(rval==0)
{
res=f_read(fmp3,databuf,4096,(UINT*)&br);//读出4096个字节  
i=0;
do//主播放循环
    {         
if(VS_Send_MusicData(databuf+i)==0)//给VS10XX发送音频数?,

//0发送成功
{
i+=32;
}else   
{
key=KEY_Scan(0);
switch(key)
{
case KEY_RIGHT:
rval=1;         //下一曲
break;
case KEY_LEFT:
rval=2;         //上一曲
break;
case KEY_UP:        //音量增加
if(vsset.mvol<250)
{
vsset.mvol+=5;
         VS_Set_Vol(vsset.mvol);       
}else vsset.mvol=250;
mp3_vol_show((vsset.mvol-100)/5);        //音量限制在:100~250,显示的时候,按照公式(vol-100)/5,显示,也就是0~30   
break;
case KEY_DOWN:        //音量减
if(vsset.mvol>100)
{
vsset.mvol-=5;
         VS_Set_Vol(vsset.mvol);       
}else vsset.mvol=100;
mp3_vol_show((vsset.mvol-100)/5);        //音量限制在:100~250,显示的时候,按照公式(vol-100)/5,显示,也就是0~30   
break;
}
mp3_msg_show(fmp3->fsize);//显示信息            
}                        
}while(i<4096);//循环发送4096个字节
if(br!=4096||res!=0)
{
rval=0;
break;//读完了.          
}           
}
f_close(fmp3);
}else rval=0XFF;//出现错误             
}                       
myfree(SRAMIN,databuf);                                          
myfree(SRAMIN,fmp3);
return rval;                                          
}


怎么也看不明白上一曲 下一曲是怎么实现的
if(VS_Send_MusicData(databuf+i)==0)//给VS10XX发送音频数?,

//0发送成功
{
i+=32;
}else   
{
key=KEY_Scan(0);
switch(key)
{
case KEY_RIGHT:
rval=1;         //下一曲         break;
case KEY_LEFT:
rval=2;         //上一曲
break;         case KEY_UP:        //音量增加
if(VS_Send_MusicData(databuf+i)==0)/什么情况才是假循环呢?
沙发
tianli1980| | 2014-6-3 17:18 | 只看该作者
使用键盘显示接口芯片8279接收按键键值,并在七段数码管上显示出来,通过判断键值进入相应音乐播放处理程序。在音乐播放程序中,使用定时器/计数器8253的计数器2,使其工作在方式¬ ¬ 3—方波发生器,通过查表依次取出乐曲频率值送入计数器作为计数初值,经out2输出方波,驱动扬声器发

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

460

主题

2188

帖子

12

粉丝