【开源获奖案例】基于T5L智能屏的音乐播放与歌词显示方案

描述

——来自迪文开发者论坛

本期为大家推送迪文开发者论坛获奖开源案例——基于T5L智能屏的音乐播放与歌词显示方案。该方案通过T5L串口与通用开发板、解码板进行数据交互,将解析完成的音频和歌词通过串口发送给智能屏,实现音乐播放、歌词显示、歌曲播放进度控制等功能,为用户打造流畅的视听体验。

 


  GUI工程设计   
 智能屏幕
  C51工程设计   
 
(1)T5L智能屏代码如下:   

  •  
  •  

INIT_CPU();//系统初始化PORT_Init();//IO口初始化T0_Init();//定时器0初始化//     T1_Init();T2_Init();//定时器2初始化//     WDT_ON();//打开开门狗 喂狗在定时器T2中my_UART4_Init(115200);uart_init();//串口初始化void MainMachineHandle(void){    if(UartDataHandle)    {        uartHandle(Uart4_Rx,uart4_rx_count);        CLR_UartMp3();    }}

(2)图形剪切函数:

  •  
  •  

void VolCutDisp(VolCutDispLog_Para_s *Para){    u8data WriteBuff[10][2];    u8VolC=0;    u16Endaddrx=0;    VolC=Para->Vol;    memset(WriteBuff,0,sizeof(WriteBuff));    WriteBuff[0][1]=6;//固定    WriteBuff[1][1]=1;//固定    WriteBuff[2][1]=Para->CutPage;//音量条所在页面    WriteBuff[3][0]=Para->CutbegXY[0]>>8;//开始地址 X    WriteBuff[3][1]=Para->CutbegXY[0]&0xff;//X    WriteBuff[4][0]=Para->CutbegXY[1]>>8;//Y    WriteBuff[4][1]=Para->CutbegXY[1]&0xff;//Y    Endaddrx=Para->CutbegXY[0]+VolC*0.01*Para->LogoLen;//结束地址    WriteBuff[5][0]=Endaddrx>>8;//X    WriteBuff[5][1]=Endaddrx&0xff;//X    WriteBuff[6][0]=Para->CutendXY[1]>>8;//Y    WriteBuff[6][1]=Para->CutendXY[1]&0xff;//Y    WriteBuff[7][0]=Para->localPageXY[0]>>8;    WriteBuff[7][1]=Para->localPageXY[0]&0xff;    WriteBuff[8][0]=Para->localPageXY[1]>>8;    WriteBuff[8][1]=Para->localPageXY[1]&0xff;    WriteBuff[9][1]=0XFF;    write_dgusii_vp(Para->CutDispaddr,WriteBuff[0],10);}void UpanPlaySliderLogo(void){    staticu8 VolC=102;    u8data Readdtata[2];    VolCutDispLog_Para_sUpanPlayLog;    if(NowPage[1]!=4)    {        VolC=0x102;        return;    }    Read_Dgusii_Vp(0x17B8,Readdtata,1);    if(VolC==Readdtata[1])    return;    VolC=Readdtata[1];    UpanPlayLog.LogoLen=459;//长度    UpanPlayLog.CutPage=13;//剪切图形所在页面    UpanPlayLog.CutDispaddr=0x8000;//基本图形地址    UpanPlayLog.Vol=VolC;//0~100音量值    UpanPlayLog.CutbegXY[0]=160;//剪切图形左上角开始地址X    UpanPlayLog.CutbegXY[1]=386;//剪切图形左上角开始地址Y    UpanPlayLog.CutendXY[0]=619;//剪切图形右下角开始地址X    UpanPlayLog.CutendXY[1]=398;//剪切图形右下角结束地址Y    UpanPlayLog.localPageXY[0]=160;    UpanPlayLog.localPageXY[1]=386;    VolCutDisp(&UpanPlayLog);}

(3)通用开发板代码如下:

  •  
  •  

void LoopHandle_task(void *p_arg){    delay_ms(1000);    Init_Mp3data();    DMT_ChangePage(1);    while (1)     {        LCD_Handle();        Mp3PlayProcess();        UdiskDisInOut();        vTaskDelay(LoopHandle_ms / portTICK_PERIOD_MS);    }}void LCD_Handle(void){    DMT_Action1();                   // 循环检测屏幕上是否有数据发生改变    Mp3SongSchedUp();                // MP3播放的进度条    USB_PlayDispSongName();          // 歌曲名称更新    MusicPlayLysic();                // 更新歌曲名称}

(4)歌词显示:

  •  
  •  

void MusicPlayLysic(void){    static u16 counttime = 0;    static u8 nolrc = 0;    static u16 crc1 = 0, crc2 = 0;    u16 crcb1 = 0, crcb2 = 0;    // static u8 updataLysci = 0;    u8 ReadBufout1[64][2];    u8 ReadBufout2[64][2];    u8 ReadBufin1[32][2];    u8 ReadBufin2[32][2];    if (DmtDataBuf[MPageid][1] != 4)     {        counttime = 0;        crc1 = 0;        crcb2 = 0;        nolrc = 0;        return;    }    if (DmtDataBuf[MMp3Lrcaddr][1])     {        nolrc = 0;        crcb1 = CalcCrcAll(0xffff, DmtDataBuf[MMp3LrcReadaddr], 64);        crcb2 = CalcCrcAll(0xffff, DmtDataBuf[MMp3LrcReadaddr + 32], 64);        if (crcb1 != crc1 || crc2 != crcb2)         {            crc1 = crcb1;            crc2 = crcb2;            memset(ReadBufout1, 0, sizeof(ReadBufout1));            memset(ReadBufout2, 0, sizeof(ReadBufout2));            memset(ReadBufin1, 0, sizeof(ReadBufin1));            memset(ReadBufin2, 0, sizeof(ReadBufin2));            memcpy(ReadBufin1, DmtDataBuf[MMp3LrcReadaddr], 64);            memcpy(ReadBufin2, DmtDataBuf[MMp3LrcReadaddr + 32], 64);//          All_unicodeToUtf(ReadBufin1,//                             (u8 *)ReadBufout1,MusicLysicDoubleNULL(ReadBufin1,64));//          All_unicodeToUtf(ReadBufin2,//                             (u8 *)ReadBufout2,MusicLysicDoubleNULL(ReadBufin2,64));            UnicodeToGbk((u16*)ReadBufin1,                         (u16 *)ReadBufout1,MusicLysicDoubleNULL((char*)ReadBufin1,64));            UnicodeToGbk((u16*)ReadBufin2,                         (u16 *)ReadBufout2,MusicLysicDoubleNULL((char*)ReadBufin2,64));//          ShuangYu_UTF_DispLysic(lv_label_get_text(lv_SY_UTF_top->songname),ReadBufout1,ReadBufout2);                                DMT_WriteLen(0x7100, ReadBufout1[0], 32, 1);            DMT_WriteLen(0x7120, ReadBufout2[0], 32, 1);        }    }    elseif(nolrc==0)    {        nolrc=1;        crc1=0;        crcb2=0;        DMT_WriteLen(0x7100,"无",2,1);        ClearDGUSIIMemory(32,0x7120);//          ShuangYu_UTF_DispLysic(lv_label_get_text(lv_SY_UTF_top->songname),"无"," ");                  }}

(5)解码板代码如下:

  •  
  •  

void WritecmdHandle(void){    ChangeModeTask();    SysVolSetting();    BT_PlayPreNextPPSong();    PlayModeFun();    DirsclustReadSong();    PlaySclustSong();    UserTWS_Oper();    BreakSavePlay();    ClearTwsTransData();    TwsTransData();    BtLinkOper();    SYS_Reset();}bool lrc_ui_show(int text_id, u8encode_type, u8 *buf, int len, u8 lrc_show_flag, u8 lrc_update){#if 1//(CONFIG_UI_STYLE ==STYLE_JL_SOUNDBOX)    staticint disp_len = 0;    staticu8 lrc_showbytes = 0;    staticu8 offset = 0;    if(lrc_update)     {        disp_len= len;        lrc_showbytes= 0;        offset= 0;        //ui_text_set_text_by_id(LRC_TEXT_ID_SEC, "", 16, FONT_DEFAULT);    }    if(lrc_show_flag == 1)     {        printf("encode_type:%d\r\n",encode_type);        printf("id:%02d,%s\r\n",text_id,buf);//这里是显示歌曲 gbk编码        ModReadReg[RD_SongLysicOn][0]=encode_type;        if(text_id<2)        {            memset(ModReadReg[RD_MusicLy1+text_id*32],0,64);            GbkToUnicode(buf,ModReadReg[RD_MusicLy1+text_id*32],32);            //strcpy(ModReadReg[RD_MusicLy1+text_id],buf);        }        //log_info_hexdump(buf,len);    }#endif     returntrue;}

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分