本期為大家推送迪文開發(fā)者論壇獲獎開源案例——基于T5L的FM收音機。該方案基于T5L智能屏,通過串口4與FM收音機模塊進行通訊,實現(xiàn)自動搜索獲取不同頻段電臺,同時支持選臺、頻率調(diào)節(jié)、音量控制等功能,為用戶提供便捷操作體驗。
【演示視頻】
【C51工程設(shè)計】
(1)屏幕代碼如下:
void resetFreChannelValue(void)
{
Write_Dgus(0x1510,10800);
Write_Dgus(0x1511,1);
}
INIT_CPU();//系統(tǒng)初始化
PORT_Init();//IO口初始化
T0_Init();//定時器0初始化
T2_Init();//定時器2初始化
my_UART4_Init(115200);
uart_init();//串口初始化
ws2812_writ_byte(8);//LED初始化
resetFreChannelValue();
ChangePage(1);
(2)屏幕顯示頻率,頻道代碼如下:
void DispFreChannel(void)
{
if(Uart4_Rx[0]!=0x51)
return;
if(Uart4_Rx[1]!=0x10)
return;
Write_Dgus(0x1510,Uart4_Rx[2]<<8|Uart4_Rx[3]);
Write_Dgus(0x1511,Uart4_Rx[4]);
}
(3)屏幕處理觸摸數(shù)據(jù)代碼如下:
void FMCtrol(void)
{
u8Read[2];
u8sendda[10],i=0;
memset(Read,0,sizeof(Read));
Read_Dgusii_Vp(0x1500,Read,1);
if(!Read[1])
return;
memset(sendda,0,sizeof(sendda));
sendda[0]=0x51;
switch(Read[1])
{
case1:
sendda[1]=0x10;
break;
case2:
sendda[1]=0x11;
break;
case3:
sendda[1]=0x12;
break;
case4:
sendda[1]=0x13;
break;
case5:
sendda[1]=0x14;
break;
case6:
sendda[1]=0x15;
break;
case7:
sendda[1]=0x16;
break;
case8:
sendda[1]=0x17;
break;
}
UART4_SendStr(sendda,2);
Write_Dgus(0x1500,0);
}
(4)FM收音機板數(shù)據(jù)解析核心代碼如下:
void FmModeUpdateFrmChannel(void)
{
static uint16_t Frebuf=0xffff,Channelbuf=0xffff;
static uint16_t delayin=80;
uint8_t sendbufl[10];
if(delayin)
{
delayin--;
return;
}
if(app_get_curr_task() != APP_FM_TASK)
return;
if(get_fm_channel()!=Channelbuf||
get_fm_frq()!=Frebuf)
{
Channelbuf=get_fm_channel();
Frebuf=get_fm_frq();
sendbufl[0]=0x51;
sendbufl[1]=0x10;
sendbufl[2]=Frebuf>>8;
sendbufl[3]=Frebuf;
sendbufl[4]=Channelbuf;
//UserUartRetRec(AI_uart_bus,sendbufl,5);
AI_uart_bus->write(sendbufl, 5);
}
}
void UserUartRecHandle(const uart_bus_t*uart_bus,u8 *data,u16 len)
{
u8 retdata[30];
u8 i=0;
if(data[0]!=DwinLocal_addr)
return;
switch(data[1])
{
case 0x10:
app_task_put_key_msg(KEY_MUSIC_PP,0);
break;
case 0x11:
app_task_put_key_msg(KEY_FM_SCAN_ALL,0);
break;
case 0x12:
app_task_put_key_msg(KEY_FM_NEXT_STATION,0);
break;
case 0x13:
app_task_put_key_msg(KEY_FM_PREV_STATION,0);
break;
case 0x14:
app_task_put_key_msg(KEY_FM_NEXT_FREQ,0);
break;
case 0x15:
app_task_put_key_msg(KEY_FM_PREV_FREQ,0);
break;
case 0x16:
app_task_put_key_msg(KEY_VOL_UP,0);
break;
case 0x17:
app_task_put_key_msg(KEY_VOL_DOWN,0);
break;
}
}