迪文科技论坛

 找回密码
 立即注册
搜索
查看: 27|回复: 0

【开源】U盘播放器-歌词显示

[复制链接]

11

主题

15

回帖

1061

积分

金牌会员

Rank: 6Rank: 6

积分
1061
QQ
发表于 2025-3-14 19:38:31 | 显示全部楼层 |阅读模式
U盘播放器-歌词显示

用的是T5L的屏幕,使用modbus的T5L 自定义程序,带基本图形剪切,进行歌曲进度条,进行剪切
大概硬件框架是
STM32开发板 串口分别连接,解码板和屏幕
解码板播放的是U盘的歌曲,播放时候,显示歌词

视频效果如下:
https://v.youku.com/video?vid=XNjQ2OTMzMDY1Ng%3D%3D

界面如下:













屏幕代码如下:
       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();
       }
}

图形剪切函数
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);
}

STM32 代码如下:
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();//更新歌曲名称
}

歌词显示
void MusicPlayLysic(void)
{
       staticu16 counttime=0;
       staticu8 nolrc=0;
       staticu16 crc1=0,crc2=0;
       u16crcb1=0,crcb2=0;
//     staticu8 updataLysci=0;
       u8ReadBufout1[64][2];
       u8ReadBufout2[64][2];
       u8ReadBufin1[32][2];
       u8ReadBufin2[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),"无"," ");              
       }
}

解码板代码如下:
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;

}


感兴趣的朋友,自行下载源码查看研究


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2025-3-28 21:17 , Processed in 0.034272 second(s), 24 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表