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;
}
感兴趣的朋友,自行下载源码查看研究
|