本期为大家推送迪文开发者论坛获奖开源案例——基于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;
}
上一篇:无