【开源获奖案例】基于T5L智能屏的FM收音机

——来自迪文开发者论坛

本期为大家推送迪文开发者论坛获奖开源案例——基于T5L智能屏的FM收音机。该方案基于T5L智能屏,通过串口4与FM收音机模块进行通讯,实现自动搜索获取不同频段电台,同时支持选台、频率调节、音量控制等功能,为用户提供便捷操作体验。

【演示视频】

完整开发资料含迪文屏DGUS工程资料与C51代码,获取方式

1、前往迪文开发者论坛获取:http://inforum.dwin.com.cn:20080/forum.php?mod=viewthread&tid=12048
2、微信公众号中回复“FM收音机”获取。

【C51工程设计】


(1)屏幕代码如下: 

            void resetFreChannelValue(void)

    {

        Write_Dgus(0x1510,10800);

        Write_Dgus(0x1511,1);

    }

INIT_CPU();//系统初始化

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)屏幕处理触摸数据代码如下:

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收音机板数据解析核心代码如下

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;

        }

}