USMI

Объявление

12/06/2025 (Administration) - Spamming for the purpose of boosting messages will be punished with a ban. Спам с целью накрутки сообщений будет караться баном.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » USMI » MCU, SoC, CPU Микроконтроллеры » Подключение разной периферии к JL SoC. SPI/I2C/I2S/PWM/UART/GPIO...


Подключение разной периферии к JL SoC. SPI/I2C/I2S/PWM/UART/GPIO...

Сообщений 1 страница 20 из 135

1

------------------------------------------------------------------------

Подпись автора

USMicro® 2026©

2

было б интересно к наушникам подключить i2s микрофон, а то там обычно не микрофон, а хз что.

3

ender11 написал(а):

было б интересно к наушникам подключить i2s микрофон, а то там обычно не микрофон, а хз что.

К какому чипу?

Подпись автора

USMicro® 2026©

4

а там обычно ножек не хватает, да?

5

Ты о чем?

Подпись автора

USMicro® 2026©

6

на мелких корпусах порты не выведены? мне было интересно 6956a

7

А вот хз. Там вроде не I2S. Хз вообще, вроде как в 698 и тд используют цифровые микрофоны. C ANC. Ну типа а-ля эирподсы со всеми свистоперделками)
Я возился только с электретными микрофонами. Вроде с головой хватало. Ну конечно же без ANC, но вроде всё хорошо было. Таже тестировал через звонки. Там напряжение питания нужно брать строго с ноги DACAVDD. И чувствительность этих микрофончиков очень сильно зависит от напряжения питания. Я игрался с этим, лучше переменник резистор поставить и протестировать в реальном времени. Еже чувствительность в блютуз конфиге настраивается.

Подпись автора

USMicro® 2026©

8

Вопрос, а можно как то регулировать громкость PCM? ну тоесть еще со стороны декодера/проца который формирует I2S.  А то обычно регулируют аналоговый сигнал уже после I2S кодека...

Подпись автора

USMicro® 2026©

9

Играюсь с сегментными лед дисплеями, и заодно с таймерами.
У 690 их 4
"timer0"
"timer1"
"timer2"
"timer3"
**********************************
TIMER0 завязан на кнопках, ик датчике, 7сегментном дисплее,  и на куче системного... Лучше не трогать тайминги , а то будут глюки.
TIMER1  в IR если другая группа портов ну и PWM для светодиода первого канала.(RGB)
TIMER2  в IR если третья группа портов и PWM для другого канала светодиодов(RGB)
TIMER3 в PWM третьего канала светодиода... (RGB)
Есть такая штука, 7сегментник мерцает, и он привязан к таймеру0. Если сменить тайминги в таймере0 из 2мс на 1, то оно начинает работать нормально. Зато все остальное начинает чудить.
Я просто взял и немного изменил таймер2, он почти не задействован, и не влияет ни на что кроме PWM светодиода, уменьшив тайминг даже лучше, RCSP LED не будет противно мерцать...
Теперь можно играться с таймером 2 спокойно, и гадское мерцание исчезло, кстати в самом драйвере 7сегментника который ссылается на таймер0 , не катит деление результата таймера0. Проще задействовать другой таймер, не правя все тайминги по всей системе куда привязан этот сранный таймер0.
Щас делаю драйвер для стандартных 12пиновых индикаторов с общим анодом и общим катодом, с яркостью и тд))).
Фотки чуть позже скину.

Подпись автора

USMicro® 2026©

10

Короче, обычный 12 пин 4 бита 7 сегментов дисплейчик.
С общим анодом проблем не возникло, работает отлично.
led7_drv.c
Драйвер работает - кто хочет вставляйте и все работать будет - пока для общего анода.

Код:
#include "ui/ui_api.h"

#if UI_ENABLE

#include "ui/ui_common.h"
#include "ui/led/led7_drv.h"
#include "fm_radio.h"
#include "dec/decoder_phy.h"
#include "music_ui.h"
#include "music.h"
#include "timer.h"
#include "key_drv/key.h"
#include "file_operate/file_op.h"
//#include "play_file.h"
#include "dac/dac.h"
#include "rtc_setting.h"
#include "sys_detect.h"

#if REC_EN
    #include "encode/encode.h"
#endif

LED7_VAR led7_var;

const  u8 LED_NUMBER[10] =
{
    /*0*/
    (u8)(LED_A | LED_B | LED_C | LED_D | LED_E | LED_F),
    /*1*/
    (u8)(LED_B | LED_C),
    /*2*/
    (u8)(LED_A | LED_B | LED_D | LED_E | LED_G),
    /*3*/
    (u8)(LED_A | LED_B | LED_C | LED_D | LED_G),
    /*4*/
    (u8)(LED_B | LED_C | LED_F | LED_G),
    /*5*/
    (u8)(LED_A | LED_C | LED_D | LED_F | LED_G),
    /*6*/
    (u8)(LED_A | LED_C | LED_D | LED_E | LED_F | LED_G),
    /*7*/
    (u8)(LED_A | LED_B | LED_C),
    /*8*/
    (u8)(LED_A | LED_B | LED_C | LED_D | LED_E | LED_F | LED_G),
    /*9*/
    (u8)(LED_A | LED_B | LED_C | LED_D | LED_F | LED_G),
};

const  u8 LED_LARGE_LETTER[26] =
{
    0x77,0x40,0x39,0x3f,0x79,///<ABCDE
    0x71,0x40,0x76,0x06,0x40,///<FGHIJ
    0x40,0x38,0x40,0x37,0x3f,///<KLMNO
    0x73,0x40,0x50,0x6d,0x78,///<PQRST
    0x3e,0x3e,0x40,0x76,0x40,///<UVWXY
    0x40///<Z
};

const  u8 LED_SMALL_LETTER[26] =
{
    0x77,0x7c,0x58,0x5e,0x79,///<abcde
    0x71,0x40,0x40,0x40,0x40,///<fghij
    0x40,0x38,0x40,0x54,0x5c,///<klmno
    0x73,0x67,0x50,0x40,0x78,///<pqrst
    0x3e,0x3e,0x40,0x40,0x40,///<uvwxy
    0x40///<z
};



#if LED_7PIN_SEL == 1
const u8 led_7[36][2] = /// FOR (LSH24D17-1B-UR)
{
  {0,1},//1A
  {0,2},//1B
  {3,0},//1C
  {4,0},//1D
  {0,3},//1E
  {1,0},//1F
  {2,0},//1G

  {1,2},//2A
  {1,3},//2B
  {4,1},//2C
  {1,5},//2D
  {1,4},//2E
  {2,1},//2F
  {3,1},//2G

  {4,3},//3A
  {2,4},//3B
  {3,4},//3C
  {5,0},//3D
  {5,2},//3E
  {3,2},//3F
  {4,2},//3G

  {6,5},//4A
  {5,6},//4B
  {4,5},//4C
  {5,3},//4D
  {3,5},//4E
  {5,4},//4F
  {4,6},//4G

  {0,5},//LED_PLAY
  {2,5},//LED_PAUSE
  {5,1},//LED_USB
  {0,4},//LED_SD
  {2,3},//LED_2POINT
  {6,2},//LED_AUX
  {6,4},//.
  {2,6},//LED_MHz
};
#endif // LED_7PIN_SEL

#if  1
const u8 led_7[36][2] = {
    {4,0},//1A
    {5,0},//1B
    {6,0},//1C
    {7,0},//1D
    {8,0},//1E
    {9,0},//1F
    {10,0},//1G

    {4,1},//2A
    {5,1},//2B
    {6,1},//2C
    {7,1},//2D
    {8,1},//2E
    {9,1},//2F
    {10,1},//2G

    {4,2},//3A
    {5,2},//3B
    {6,2},//3C
    {7,2},//3D
    {8,2},//3E
    {9,2},//3F
    {10,2},//3G

    {4,3},//4A
    {5,3},//4B
    {6,3},//4C
    {7,3},//4D
    {8,3},//4E
    {9,3},//4F
    {10,3},//4G

    {0,0},//LED_PLAY
    {0,0},//LED_PAUSE
    {0,0},//LED_USB
    {0,0},//SD
    {11,1},//:
    {0,0},//MHz
    {11,2},//.
    {0,0},//MP3
};
#endif

const u8 bit_table[8] =
{
  0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,
};

const u8 playmodestr[][5] =
{
    " ALL",
    " dev",
    "Fold",
    " ONE",
    " rAn",
};

const u8 menu_string[][5] =
{
    " HI ",
    "Lod ",
    "bLUE",
    " PC ",
    " UP ",
    " dN ",
    " AUX",
    "-AL-",

};
const u8 other_string[][5]=
{
    "Eq ",
    "V ",
    "P ",
    " NOP",
    " rec",
    " Sd ",
};

/*----------------------------------------------------------------------------*/
/**@brief   Music模式 设备显示
   @param   void
   @return  void
   @author  Change.tsai
   @note    void led7_show_dev(void)
*/
/*----------------------------------------------------------------------------*/
void led7_show_dev(u8 dev)
{
//    /*Music Device type*/
    /* MUSIC_DIS_VAR *music_var; */
    /* music_var = (MUSIC_DIS_VAR*)UI_var.ui_buf_adr; */

    /* if(music_var) */
    {
        if((dev == SD0_DEVICE)||(dev == SD1_DEVICE))
        {
            LED_STATUS |= LED_SD;
            /// led7_show_string((u8 *)other_string[]);
        }
        else if(dev == USB_DEVICE)
        {
            LED_STATUS |= LED_USB;
        }
    }
}

/*----------------------------------------------------------------------------*/
/**@brief   led7_drv 状态位缓存清除函数
   @param   void
   @return  void
   @author  Change.tsai
   @note    void led7_clear_icon(void)
*/
/*----------------------------------------------------------------------------*/
void led7_clear_icon(void)
{
    led7_var.bFlashChar = 0;
    led7_var.bFlashIcon = 0;
    led7_var.bShowBuff[4] = 0;
}

/*----------------------------------------------------------------------------*/
/**@brief   led7_drv 显示坐标设置
   @param   x:显示横坐标
   @return  void
   @author  Change.tsai
   @note    void led7_setX(u8 X)
*/
/*----------------------------------------------------------------------------*/
void led7_setX(u8 X)
{
    led7_var.bCoordinateX = X;
}

/*----------------------------------------------------------------------------*/
/**@brief   LED 清屏函数
   @param   void
   @return  void
   @author  Change.tsai
   @note    void led7_show_null(void)
*/
/*----------------------------------------------------------------------------*/
void led7_show_null(void)
{
    led7_clear_icon();
    led7_var.bShowBuff[0] = 0;
    led7_var.bShowBuff[1] = 0;
    led7_var.bShowBuff[2] = 0;
    led7_var.bShowBuff[3] = 0;
}

/*----------------------------------------------------------------------------*/
/**@brief   led7_drv 扫描函数
   @param   void
   @return  void
   @author  Change.tsai
   @note    void led7_init(void)
*/
/*----------------------------------------------------------------------------*/
void led7_init(void)
{
    led7_clear();
    s32 ret;
	ret = timer_reg_isr_fun(timer2_hl,0,led7_scan,NULL);
	if(ret != TIMER_NO_ERR)
	{
    printf("led7_scan err = %x\n",ret);
	}
}

/*----------------------------------------------------------------------------*/
/**@brief   led7_drv 单个字符显示函数
   @param   chardata:显示字符
   @return  void
   @author  Change.tsai
   @note    void led7_show_char(u8 chardata)
*/
/*----------------------------------------------------------------------------*/
void led7_show_char(u8 chardata)
{
    //必须保证传入的参数符合范围,程序不作判断
    //if ((chardata < ' ') || (chardata > '~') || (led7_var.bCoordinateX > 4))
    //{
    //    return;
    //}
    if ((chardata >= '0') && (chardata <= '9'))
    {
        led7_var.bShowBuff[led7_var.bCoordinateX++] = LED_NUMBER[chardata - '0'];
    }
    else if ((chardata >= 'a') && (chardata <= 'z'))
    {
        led7_var.bShowBuff[led7_var.bCoordinateX++] = LED_SMALL_LETTER[chardata - 'a'];
    }
    else if ((chardata >= 'A') && (chardata <= 'Z'))
    {
        led7_var.bShowBuff[led7_var.bCoordinateX++] = LED_LARGE_LETTER[chardata - 'A'];
    }
    else if (chardata == ':')
    {
        LED_STATUS |= LED_2POINT;
    }
    else if (chardata == ' ')
    {
        led7_var.bShowBuff[led7_var.bCoordinateX++] = 0;
    }
    else //if (chardata == '-')     //不可显示
    {
        led7_var.bShowBuff[led7_var.bCoordinateX++] = BIT(6);
    }
}

/*----------------------------------------------------------------------------*/
/**@brief   led7_drv 字符串显示函数
   @param   *str:字符串的指针   offset:显示偏移量
   @return  void
   @author  Change.tsai
   @note    void led7_show_string(u8 *str)
*/
/*----------------------------------------------------------------------------*/
void led7_show_string(u8 *str)
{
    while (0 != *str)
    {
        led7_show_char(*str++);
    }
}

/*----------------------------------------------------------------------------*/
/** @brief:
    @param:
    @return:
    @author:
    @note:
*/
/*----------------------------------------------------------------------------*/
void led7_show_string_menu(u8 menu)
{

    if(menu >= (sizeof(menu_string)/5))
    {
        printf("*strid(%d) is over!\n",menu);
    }
    else
    {
        led7_show_string((u8 *)menu_string[menu]);
    }
}

void led7_show_linin_main(u8 menu)
{
    led7_show_string_menu(menu);

#if REC_EN

    RECORD_OP_API * rec_var_p;
    REC_CTL * rec_ctl_var;

    rec_var_p = *(RECORD_OP_API **)UI_var.ui_buf_adr;
    if((UI_var.ui_buf_adr)&&(rec_var_p))
    {
        rec_ctl_var = rec_var_p->rec_ctl;

        LED_STATUS &= ~(LED_PLAY | LED_PAUSE);
        LED_STATUS &= ~(LED_SD|LED_USB);

        if((menu == MENU_AUX_MAIN)||(menu == MENU_BT_MAIN))
        {
            if((rec_ctl_var)&&(ENC_STOP !=rec_ctl_var->enable))
            {
                if (ENC_STAR == rec_ctl_var->enable)
                    LED_STATUS |= LED_PLAY;
                else if(ENC_PAUS == rec_ctl_var->enable)
                    LED_STATUS |= LED_PAUSE;

        led7_show_dev(rec_ctl_var->curr_device);
            }
        }
    }
#endif
}
/*----------------------------------------------------------------------------*/
/**@brief   Music 播放文件号显示函数
   @param   void
   @return  void
   @author  Change.tsai
   @note    void led7_show_filenumber(void)
*/
/*----------------------------------------------------------------------------*/
void led7_show_filenumber(void)
{
    MUSIC_DIS_VAR *music_var;

    music_var = (MUSIC_DIS_VAR*)UI_var.ui_buf_adr;

    if(music_var)
    {
        /*Music File Number info*/
        //printf("ui_music.ui_play_file_num = %u----\n",ui_music.ui_play_file_num);
        itoa4(music_var->ui_curr_file);
        led7_show_string((u8 *)bcd_number);
    }

}


/*----------------------------------------------------------------------------*/
/**@brief   红外输入文件号显示函数
   @param   void
   @return  void
   @author  Change.tsai
   @note    void led7_show_IR_number(void)
*/
/*----------------------------------------------------------------------------*/
void led7_show_IR_number(s32 arg)
{
    u16 ir_num;
    ir_num = (u16)(arg&0xffff);
    /*IR File Number info*/
    itoa4(ir_num);
    led7_show_string((u8 *)bcd_number);
}

/*----------------------------------------------------------------------------*/
/**@brief   Music模式 显示界面
   @param   void
   @return  void
   @author  Change.tsai
   @note    void led7_show_music_main(void)
*/
/*----------------------------------------------------------------------------*/
void led7_show_music_main(void)
{
    //led7_show_string((u8*)"MUSI");
    u32 play_time;
    MUSIC_DIS_VAR *music_var;

    music_var = (MUSIC_DIS_VAR*)UI_var.ui_buf_adr;

    if(music_var)
    {
        /*Music Play time info*/
        play_time = music_var->play_time;

        itoa2(play_time/60);
        led7_show_string((u8 *)bcd_number);

        itoa2(play_time%60);
        led7_show_string((u8 *)bcd_number);

        /* led7_show_dev(); */
    led7_show_dev(music_var->ui_curr_device);

        LED_STATUS |= LED_2POINT; ///LED_2POINT | LED_MP3;


        if (*music_var->ui_curr_statu == DECODER_PLAY)
        {
            LED_STATUS |= LED_PLAY;
            LED_STATUS &= ~LED_PAUSE;
            led7_var.bFlashIcon |= LED_2POINT;
        }
        else if (*music_var->ui_curr_statu == DECODER_PAUSE)
        {
            LED_STATUS &= ~LED_PLAY;
            LED_STATUS |= LED_PAUSE;
        }
    //
    //    if(mute)
    //    {
    //        led7_var.bFlashIcon |= LED_MP3;
    //        led7_var.bFlashChar = 0x0f;
    //    }
    //    else
    //    {
    //        led7_var.bFlashIcon &= ~LED_MP3;
    //        led7_var.bFlashChar = 0x00;
    //    }
    }
}



void led7_show_bt_main(void)
{

    static u8 cnt = 0 ;


    if(btstatus == 1)
    {
        led7_show_string((u8 *)" bt ");
    }
    else
    {
        switch(cnt)
        {

            case 0:
                led7_show_string((u8 *)" bt ");
                break ;

            case 1:
                led7_show_string((u8 *)"  bt");
                break ;

            case 2:
                led7_show_string((u8 *)" bt ");
                break ;
            case 3:
                led7_show_string((u8 *)"bt  ");
                break ;
        }
        cnt ++ ;
        if(cnt > 3)
        {
            cnt =0 ;
        }
    }

}

/*----------------------------------------------------------------------------*/
/**@brief   EQ显示函数
   @param   void
   @return  void
   @author  Change.tsai
   @note    void led7_show_eq(s32 arg)
*/
/*----------------------------------------------------------------------------*/
void led7_show_eq(s32 arg)
{
    u8 eq_cnt;
    eq_cnt = (u8)arg;
    led7_show_string((u8 *)other_string[0]);
    led7_show_char(eq_cnt%10 + '0');
}

/*----------------------------------------------------------------------------*/
/**@brief   循环模式显示函数
   @param   void
   @return  void
   @author  Change.tsai
   @note    void led7_show_playmode(s32 arg)
*/
/*----------------------------------------------------------------------------*/
void led7_show_playmode(s32 arg)
{
    u8 pm_cnt;
    pm_cnt = (u8)arg;
    led7_show_string((u8 *)&playmodestr[pm_cnt-FOP_MAX-1][0]);
}

/*----------------------------------------------------------------------------*/
/**@brief   音量显示函数
   @param   void
   @return  void
   @author  Change.tsai
   @note    void led7_show_volume(s32 vol)
*/
/*----------------------------------------------------------------------------*/
void led7_show_volume(s32 vol)
{
    u8 tmp_vol;

    tmp_vol = (u8)vol;
    led7_show_string((u8 *)other_string[1]);
    itoa2(tmp_vol);
    led7_show_string((u8 *)bcd_number);
}

/*----------------------------------------------------------------------------*/
/**@brief   FM 模式主界面
   @param   void
   @return  void
   @author  Change.tsai
   @note    void led7_show_fm_main(void)
*/
/*----------------------------------------------------------------------------*/
void led7_show_fm_main(void)
{
    /*FM - Frequency*/
 #if 1
    FM_MODE_VAR * fm_var;

    if(!UI_var.ui_buf_adr)
        return;

    fm_var = *(FM_MODE_VAR **)UI_var.ui_buf_adr;

    if(fm_var)
    {
        itoa4(fm_var->wFreq);

        if (fm_var->wFreq <= 999)
            bcd_number[0] = ' ';

        led7_show_string((u8 *)bcd_number);
        LED_STATUS |= LED_MHZ;

#if REC_EN
        RECORD_OP_API * rec_var_p;
        REC_CTL * rec_ctl_var;

        if((fm_var->fm_rec_op)&&(*(RECORD_OP_API **)(fm_var->fm_rec_op)))
        {
            rec_var_p = *(RECORD_OP_API **)fm_var->fm_rec_op;
            rec_ctl_var = rec_var_p->rec_ctl;

            if((rec_ctl_var)&&(ENC_STOP != rec_ctl_var->enable))
            {
        LED_STATUS &= ~(LED_PLAY | LED_PAUSE);
        LED_STATUS &= ~(LED_SD|LED_USB);

                /* led7_show_dev(); */
        led7_show_dev(rec_ctl_var->curr_device);
                if (ENC_STAR == rec_ctl_var->enable)
                    LED_STATUS |= LED_PLAY;
                else if(ENC_PAUS == rec_ctl_var->enable)
                    LED_STATUS |= LED_PAUSE;
            }

        }
#endif
    }

#endif // 0
}

/*----------------------------------------------------------------------------*/
/**@brief   FM 模式主界面
   @param   void
   @return  void
   @author  Change.tsai
   @note    void led7_show_fm_station(void)
*/
/*----------------------------------------------------------------------------*/
void led7_show_fm_station(void)
{
//    /*FM - Station*/
#if 1
    FM_MODE_VAR * fm_var;

    if(!UI_var.ui_buf_adr)
        return;

    fm_var = *(FM_MODE_VAR **)UI_var.ui_buf_adr;

    if(fm_var)
    {
        led7_show_string((u8 *)other_string[2]);
        itoa2(fm_var->wFreChannel);
        led7_show_string((u8 *)bcd_number);
    }
#endif
}

#if 1 //RTC_CLK_EN
/*----------------------------------------------------------------------------*/
/**@brief   RTC 显示界面
   @param   void
   @return  void
   @author  Change.tsai
   @note    void led7_show_RTC_main(void)
*/
/*----------------------------------------------------------------------------*/
void led7_show_RTC_main(void)
{
    RTC_SETTING * rtc_var;
    RTC_TIME *ui_time;

    rtc_var = (RTC_SETTING *)UI_var.ui_buf_adr;

    if(rtc_var)
    {
        ui_time = rtc_var->calendar_set.curr_rtc_time;

        itoa2(ui_time->bHour);
        led7_show_string((u8 *)bcd_number);
        itoa2(ui_time->bMin);
        led7_show_string((u8 *)bcd_number);

        led7_var.bFlashIcon |= LED_2POINT;
        LED_STATUS |= LED_2POINT;

        if(rtc_var->rtc_set_mode == RTC_SET_MODE)
        {
            if(rtc_var->calendar_set.coordinate == COORDINATE_MIN)
                led7_var.bFlashChar = BIT(0)|BIT(1);
            else
                led7_var.bFlashChar = BIT(2)|BIT(3);
        }
        else
            led7_var.bFlashChar = 0;
    }
}

/*----------------------------------------------------------------------------*/
/**@brief   Alarm 显示界面
   @param   void
   @return  void
   @author  Change.tsai
   @note    void led7_show_alarm(void)
*/
/*----------------------------------------------------------------------------*/
#if 1 //RTC_ALM_EN
void led7_show_alarm(void)
{
    RTC_SETTING * rtc_var;
    RTC_TIME *ui_time;
    rtc_var = (RTC_SETTING *)UI_var.ui_buf_adr;

    if(rtc_var)
    {
        puts("led7_show_alarm\n");

        ui_time = rtc_var->alarm_set.curr_alm_time;
        itoa2(ui_time->bHour);
        led7_show_string((u8 *)bcd_number);
        itoa2(ui_time->bMin);
        led7_show_string((u8 *)bcd_number);

        LED_STATUS |= LED_2POINT;

        if(rtc_var->rtc_set_mode == ALM_SET_MODE)
        {
            if(rtc_var->alarm_set.coordinate == COORDINATE_MIN)
                led7_var.bFlashChar = BIT(0)|BIT(1);
            else
                led7_var.bFlashChar = BIT(2)|BIT(3);
        }

        /*Alarm info - Switch On/Off*/
        if (rtc_var->alarm_set.alarm_sw)
        {
            LED_STATUS |= LED_PLAY;
        }
        else
        {
            LED_STATUS |= LED_PAUSE;
        }
    }
}
#endif
#endif

#if REC_EN
/*----------------------------------------------------------------------------*/
/**@brief   REC 显示界面
   @param   void
   @return  void
   @note    void led7_show_rec_start(void)
*/
/*----------------------------------------------------------------------------*/
static void led7_show_rec_start(REC_CTL * rec_ctl_var)
{
    u32 rec_time;

//    LED_STATUS &= ~(LED_PLAY | LED_PAUSE);
//    if(rec_ctl_var)
    {
        rec_time = rec_ctl_var->file_info.enc_time_cnt;

        itoa2(rec_time/60);
        led7_show_string((u8 *)bcd_number);

        itoa2(rec_time%60);
        led7_show_string((u8 *)bcd_number);

        /* led7_show_dev(); */
    led7_show_dev(rec_ctl_var->curr_device);

        LED_STATUS |= LED_2POINT; //| LED_PLAY;

        if (ENC_STAR == rec_ctl_var->enable)
            LED_STATUS |= LED_PLAY;
        else if (ENC_PAUS == rec_ctl_var->enable)
            LED_STATUS |= LED_PAUSE;
    }
}

/*----------------------------------------------------------------------------*/
/**@brief   REC 显示界面
   @param   void
   @return  void
   @note    void led7_show_rec_main(void)
*/
/*----------------------------------------------------------------------------*/
void led7_show_rec_main(void)
{
    RECORD_OP_API * rec_var_p;
    REC_CTL * rec_ctl_var;

    LED_STATUS &= ~(LED_PLAY | LED_PAUSE);
    LED_STATUS &= ~LED_2POINT; //| LED_PLAY;
    LED_STATUS &= ~(LED_SD|LED_USB);

    if(UI_var.ui_buf_adr)
    {
        rec_var_p = *(RECORD_OP_API **)UI_var.ui_buf_adr;
        if(rec_var_p)
        {
            rec_ctl_var = rec_var_p->rec_ctl;
            if((rec_ctl_var)&&(ENC_STOP != rec_ctl_var->enable))
            {
                led7_show_rec_start(rec_ctl_var);
                return;
            }
        }
    }

    led7_show_string((u8 *)other_string[4]);
}
#endif

void LED_drive7(void)
{
    u8 k,i,j,temp;
    k=0;

    led7_var.bShowBuff1[0]=0;
    led7_var.bShowBuff1[1]=0;
    led7_var.bShowBuff1[2]=0;
    led7_var.bShowBuff1[3]=0;
    led7_var.bShowBuff1[4]=0;
    led7_var.bShowBuff1[5]=0;
    led7_var.bShowBuff1[6]=0;
    led7_var.bShowBuff1[7]=0;
    led7_var.bShowBuff1[8]=0;
    led7_var.bShowBuff1[9]=0;
    led7_var.bShowBuff1[10]=0;
    led7_var.bShowBuff1[11]=0;


    for(i=0;i<5;i++)
    {
        temp = led7_var.bShowBuff[i];
        if (get_sys_halfsec())
        {
            if ((led7_var.bFlashIcon) && (i == 4))
            {
                temp = LED_STATUS & (~led7_var.bFlashIcon);
            }
            else if (led7_var.bFlashChar & BIT(i))
            {
                temp = 0x0;
            }
        }

        for(j=0;j<7;j++)
        {
            if(temp & bit_table[j])
            {
                led7_var.bShowBuff1[led_7[k][0]] |= bit_table[led_7[k][1]];
            }
            k++;
        }
        if(j == 7)
        {
            if(temp & bit_table[j])
                led7_var.bShowBuff[led_7[35][0]] |= bit_table[led_7[35][1]];
        }
    }
}

/*----------------------------------------------------------------------------*/
/**@brief   LED清屏函数
   @param   x:显示横坐标
   @return  void
   @author  Change.tsai
   @note    void led7_clear(void)
*/
/*----------------------------------------------------------------------------*/

void led7_clear(void)
	{
    LEDN_PORT0_OUT &= ~(BIT(LEDN_S0_BIT));
    LEDN_PORT0_DIR |=  (BIT(LEDN_S0_BIT));
    LEDN_PORT0_PU  &= ~(BIT(LEDN_S0_BIT));
    LEDN_PORT0_PD  &= ~(BIT(LEDN_S0_BIT));
    LEDN_PORT0_HD  &= ~(BIT(LEDN_S0_BIT));

    LEDN_PORT1_OUT &= ~(BIT(LEDN_S1_BIT));
    LEDN_PORT1_DIR |=  (BIT(LEDN_S1_BIT));
    LEDN_PORT1_PU  &= ~(BIT(LEDN_S1_BIT));
    LEDN_PORT1_PD  &= ~(BIT(LEDN_S1_BIT));
    LEDN_PORT1_HD  &= ~(BIT(LEDN_S1_BIT));

    LEDN_PORT2_OUT &= ~(BIT(LEDN_S2_BIT));
    LEDN_PORT2_DIR |=  (BIT(LEDN_S2_BIT));
    LEDN_PORT2_PU  &= ~(BIT(LEDN_S2_BIT));
    LEDN_PORT2_PD  &= ~(BIT(LEDN_S2_BIT));
    LEDN_PORT2_HD  &= ~(BIT(LEDN_S2_BIT));

    LEDN_PORT3_OUT &= ~(BIT(LEDN_S3_BIT));
    LEDN_PORT3_DIR |=  (BIT(LEDN_S3_BIT));
    LEDN_PORT3_PU  &= ~(BIT(LEDN_S3_BIT));
    LEDN_PORT3_PD  &= ~(BIT(LEDN_S3_BIT));
    LEDN_PORT3_HD  &= ~(BIT(LEDN_S3_BIT));

    LEDN_PORT4_OUT &= ~(BIT(LEDN_S4_BIT));
    LEDN_PORT4_DIR |=  (BIT(LEDN_S4_BIT));
    LEDN_PORT4_PU  &= ~(BIT(LEDN_S4_BIT));
    LEDN_PORT4_PD  &= ~(BIT(LEDN_S4_BIT));
    LEDN_PORT4_HD  &= ~(BIT(LEDN_S4_BIT));

    LEDN_PORT5_OUT &= ~(BIT(LEDN_S5_BIT));
    LEDN_PORT5_DIR |=  (BIT(LEDN_S5_BIT));
    LEDN_PORT5_PU  &= ~(BIT(LEDN_S5_BIT));
    LEDN_PORT5_PD  &= ~(BIT(LEDN_S5_BIT));
    LEDN_PORT5_HD  &= ~(BIT(LEDN_S5_BIT));

    LEDN_PORT6_OUT &= ~(BIT(LEDN_S6_BIT));
    LEDN_PORT6_DIR |=  (BIT(LEDN_S6_BIT));
    LEDN_PORT6_PU  &= ~(BIT(LEDN_S6_BIT));
    LEDN_PORT6_PD  &= ~(BIT(LEDN_S6_BIT));
    LEDN_PORT6_HD  &= ~(BIT(LEDN_S6_BIT));

    LEDN_PORT7_OUT &= ~(BIT(LEDN_S7_BIT));
    LEDN_PORT7_DIR |=  (BIT(LEDN_S7_BIT));
    LEDN_PORT7_PU  &= ~(BIT(LEDN_S7_BIT));
    	LEDN_PORT7_PD  &= ~(BIT(LEDN_S7_BIT));
    LEDN_PORT7_HD  &= ~(BIT(LEDN_S7_BIT));

    LEDN_PORT8_OUT &= ~(BIT(LEDN_S8_BIT));
    LEDN_PORT8_DIR |=  (BIT(LEDN_S8_BIT));
    LEDN_PORT8_PU  &= ~(BIT(LEDN_S8_BIT));
    	LEDN_PORT8_PD  &= ~(BIT(LEDN_S8_BIT));
    LEDN_PORT8_HD  &= ~(BIT(LEDN_S8_BIT));

    LEDN_PORT9_OUT &= ~(BIT(LEDN_S9_BIT));
    LEDN_PORT9_DIR |=  (BIT(LEDN_S9_BIT));
    LEDN_PORT9_PU  &= ~(BIT(LEDN_S9_BIT));
    	LEDN_PORT9_PD  &= ~(BIT(LEDN_S9_BIT));
    LEDN_PORT9_HD  &= ~(BIT(LEDN_S9_BIT));

    LEDN_PORT10_OUT &= ~(BIT(LEDN_S10_BIT));
    LEDN_PORT10_DIR |=  (BIT(LEDN_S10_BIT));
    LEDN_PORT10_PU  &= ~(BIT(LEDN_S10_BIT));
    	LEDN_PORT10_PD  &= ~(BIT(LEDN_S10_BIT));
    LEDN_PORT10_HD  &= ~(BIT(LEDN_S10_BIT));

    LEDN_PORT11_OUT &= ~(BIT(LEDN_S11_BIT));
    LEDN_PORT11_DIR |=  (BIT(LEDN_S11_BIT));
    LEDN_PORT11_PU  &= ~(BIT(LEDN_S11_BIT));
    	LEDN_PORT11_PD  &= ~(BIT(LEDN_S11_BIT));
    LEDN_PORT11_HD  &= ~(BIT(LEDN_S11_BIT));
	}


/*----------------------------------------------------------------------------*/
/**@brief   LED扫描函数
   @param   void
   @return  void
   @author  Change.tsai
   @note    void led7_scan(void *param)
*/
/*----------------------------------------------------------------------------*/
void led7_scan(void *param)
{
    static u8 cnt;
    u8 seg;

    LED_drive7();

    seg = led7_var.bShowBuff1[cnt];

    led7_clear();

    switch(cnt)
    {
    case 0:
        LEDN_PORT0_OUT |=  BIT(LEDN_S0_BIT);
        LEDN_PORT0_HD  |=  BIT(LEDN_S0_BIT);
        LEDN_PORT0_DIR &= ~BIT(LEDN_S0_BIT);
        break;

    case 1:
        LEDN_PORT1_OUT |=  BIT(LEDN_S1_BIT);
        LEDN_PORT1_HD  |=  BIT(LEDN_S1_BIT);
        LEDN_PORT1_DIR &= ~BIT(LEDN_S1_BIT);
        break;

    case 2:
        LEDN_PORT2_OUT |=  BIT(LEDN_S2_BIT);
        LEDN_PORT2_HD  |=  BIT(LEDN_S2_BIT);
        LEDN_PORT2_DIR &= ~BIT(LEDN_S2_BIT);
        break;

    case 3:
        LEDN_PORT3_OUT |=  BIT(LEDN_S3_BIT);
        LEDN_PORT3_HD  |=  BIT(LEDN_S3_BIT);
        LEDN_PORT3_DIR &= ~BIT(LEDN_S3_BIT);
        break;

    case 4:
        LEDN_PORT4_OUT |=  BIT(LEDN_S4_BIT);
        LEDN_PORT4_HD  |=  BIT(LEDN_S4_BIT);
        LEDN_PORT4_DIR &= ~BIT(LEDN_S4_BIT);
        break;

    case 5:
        LEDN_PORT5_OUT |=  BIT(LEDN_S5_BIT);
        LEDN_PORT5_HD  |=  BIT(LEDN_S5_BIT);
        LEDN_PORT5_DIR &= ~BIT(LEDN_S5_BIT);
        break;

    case 6:
        LEDN_PORT6_OUT |=  BIT(LEDN_S6_BIT);
        LEDN_PORT6_HD  |=  BIT(LEDN_S6_BIT);
        LEDN_PORT6_DIR &= ~BIT(LEDN_S6_BIT);
        break;

    case 7:
        LEDN_PORT7_OUT |=  BIT(LEDN_S7_BIT);
        LEDN_PORT7_HD  |=  BIT(LEDN_S7_BIT);
        LEDN_PORT7_DIR &= ~BIT(LEDN_S7_BIT);
        break;

    case 8:
        LEDN_PORT8_OUT |=  BIT(LEDN_S8_BIT);
        LEDN_PORT8_HD  |=  BIT(LEDN_S8_BIT);
        LEDN_PORT8_DIR &= ~BIT(LEDN_S8_BIT);
        break;

    case 9:
        LEDN_PORT9_OUT |=  BIT(LEDN_S9_BIT);
        LEDN_PORT9_HD  |=  BIT(LEDN_S9_BIT);
        LEDN_PORT9_DIR &= ~BIT(LEDN_S9_BIT);
        break;

    case 10:
        LEDN_PORT10_OUT |=  BIT(LEDN_S10_BIT);
        LEDN_PORT10_HD  |=  BIT(LEDN_S10_BIT);
        LEDN_PORT10_DIR &= ~BIT(LEDN_S10_BIT);
        break;

    case 11:
        LEDN_PORT11_OUT |=  BIT(LEDN_S11_BIT);
        LEDN_PORT11_HD  |=  BIT(LEDN_S11_BIT);
        LEDN_PORT11_DIR &= ~BIT(LEDN_S11_BIT);
        break;
    default :
        break;
    }

    if(seg & BIT(0))
    {
        LEDN_PORT0_OUT &= ~BIT(LEDN_S0_BIT);
        LEDN_PORT0_HD  |=  BIT(LEDN_S0_BIT);
        LEDN_PORT0_DIR &= ~BIT(LEDN_S0_BIT);

    }

    if(seg & BIT(1))
    {
        LEDN_PORT1_OUT &= ~BIT(LEDN_S1_BIT);
        LEDN_PORT1_HD  |=  BIT(LEDN_S1_BIT);
        LEDN_PORT1_DIR &= ~BIT(LEDN_S1_BIT);
    }

    if(seg & BIT(2))
    {
        LEDN_PORT2_OUT &= ~BIT(LEDN_S2_BIT);
        LEDN_PORT2_HD  |=  BIT(LEDN_S2_BIT);
        LEDN_PORT2_DIR &= ~BIT(LEDN_S2_BIT);
    }

    if(seg & BIT(3))
    {
        LEDN_PORT3_OUT &= ~BIT(LEDN_S3_BIT);
        LEDN_PORT3_HD  |=  BIT(LEDN_S3_BIT);
        LEDN_PORT3_DIR &= ~BIT(LEDN_S3_BIT);
    }

    if(seg & BIT(4))
    {
       LEDN_PORT4_OUT &= ~BIT(LEDN_S4_BIT);
       LEDN_PORT4_HD  |=  BIT(LEDN_S4_BIT);
       LEDN_PORT4_DIR &= ~BIT(LEDN_S4_BIT);
    }

    if(seg & BIT(5))
    {
        LEDN_PORT5_OUT &= ~BIT(LEDN_S5_BIT);
        LEDN_PORT5_HD  |=  BIT(LEDN_S5_BIT);
        LEDN_PORT5_DIR &= ~BIT(LEDN_S5_BIT);
    }

    if(seg & BIT(6))
    {
        LEDN_PORT6_OUT &= ~BIT(LEDN_S6_BIT);
        LEDN_PORT6_HD  |=  BIT(LEDN_S6_BIT);
        LEDN_PORT6_DIR &= ~BIT(LEDN_S6_BIT);
    }

    if(seg & BIT(7))
    {
        LEDN_PORT7_OUT &= ~BIT(LEDN_S7_BIT);
        LEDN_PORT7_HD  |=  BIT(LEDN_S7_BIT);
        LEDN_PORT7_DIR &= ~BIT(LEDN_S7_BIT);
    }

    if(seg & BIT(8))
    {
        LEDN_PORT8_OUT &= ~BIT(LEDN_S8_BIT);
        LEDN_PORT8_HD  |=  BIT(LEDN_S8_BIT);
        LEDN_PORT8_DIR &= ~BIT(LEDN_S8_BIT);
    }

    if(seg & BIT(9))
    {
        LEDN_PORT9_OUT &= ~BIT(LEDN_S9_BIT);
        LEDN_PORT9_HD  |=  BIT(LEDN_S9_BIT);
        LEDN_PORT9_DIR &= ~BIT(LEDN_S9_BIT);
    }

    if(seg & BIT(10))
    {
        LEDN_PORT10_OUT &= ~BIT(LEDN_S10_BIT);
        LEDN_PORT10_HD  |=  BIT(LEDN_S10_BIT);
        LEDN_PORT10_DIR &= ~BIT(LEDN_S10_BIT);
    }

    if(seg & BIT(11))
    {
        LEDN_PORT11_OUT &= ~BIT(LEDN_S11_BIT);
        LEDN_PORT11_HD  |=  BIT(LEDN_S11_BIT);
        LEDN_PORT11_DIR &= ~BIT(LEDN_S11_BIT);
    }

    cnt = (cnt >= 12) ? 0 : cnt+1;
}

#endif

led7_drv.h

Код:
#ifndef	_LED7_DRV_H_
#define _LED7_DRV_H_

#include "includes.h"

typedef struct _led7_VAR
{
    u8  bCoordinateX;
    u8  bFlashChar;
    u8  bFlashIcon;
    u8  bShowBuff[5];
    u8  bBrightness;
    u8  bShowBuff1[9];
}LED7_VAR;


//void set_LED_fade_out(void);
//void set_LED_all_on(void);

void led7_init(void);
void led7_scan(void *param);
void led7_clear_icon(void);
void led7_show_char(u8 chardata);
void led7_show_number(u8 number);
void led7_show_Hi(void);
///void led7_show_dev(void);
void led7_show_music_main(void);
void led7_show_RTC_main(void);
void led7_show_filenumber(void);
void led7_show_volume(s32 vol);
void led7_show_fm_main(void);
void led7_show_IR_number(s32);
void led7_show_pc_main(void);
void led7_show_pc_vol_up(void);
void led7_show_pc_vol_down(void);
void led7_show_aux_main(void);
void led7_show_eq(s32 arg);
void led7_show_playmode(s32 arg);
void led7_show_pause(void);
void led7_show_fm_station(void);
void led7_show_waiting(void);
void led7_show_alarm(void);
//void led7_show_nop(void);
void led7_show_rec_main(void);
void led7_show_linin_main(u8 menu);
void led7_clear(void);
void led7_show_string_menu(u8 menu);
void led7_setX(u8 X);
void led7_show_bt_main(void);

#define LED_7PIN_SEL         0
#define LED_12PIN_SEL        1
#define LED_12PIN_CA_SEL     1
#define LED_12PIN_CC_SEL     0

#define LED_STATUS  led7_var.bShowBuff[4]


#define LED_A   BIT(0)
#define LED_B	BIT(1)
#define LED_C	BIT(2)
#define LED_D	BIT(3)
#define LED_E	BIT(4)
#define LED_F	BIT(5)
#define LED_G	BIT(6)
#define LED_H	BIT(12)

//for LED0
#define LED_PLAY	LED_A
#define LED_PAUSE	LED_B
#define LED_USB    LED_C
#define LED_SD    LED_D
#define LED_2POINT	LED_E
#define LED_MHZ	    LED_F
#define LED_DOT    LED_G
#define LED_MP3     LED_H

#if LED_7PIN_SEL

#define  LEDN_PORT0_OUT     JL_PORTC->OUT
#define  LEDN_PORT0_HD      JL_PORTC->HD
#define  LEDN_PORT0_DIR     JL_PORTC->DIR
#define  LEDN_PORT0_PD      JL_PORTC->PD
#define  LEDN_PORT0_PU      JL_PORTC->PU

#define  LEDN_PORT1_OUT     JL_PORTA->OUT
#define  LEDN_PORT1_HD      JL_PORTA->HD
#define  LEDN_PORT1_DIR     JL_PORTA->DIR
#define  LEDN_PORT1_PD      JL_PORTA->PD
#define  LEDN_PORT1_PU      JL_PORTA->PU

#define  LEDN_PORT2_OUT     JL_PORTA->OUT
#define  LEDN_PORT2_HD      JL_PORTA->HD
#define  LEDN_PORT2_DIR     JL_PORTA->DIR
#define  LEDN_PORT2_PD      JL_PORTA->PD
#define  LEDN_PORT2_PU      JL_PORTA->PU

#define  LEDN_PORT3_OUT     JL_PORTC->OUT
#define  LEDN_PORT3_HD      JL_PORTC->HD
#define  LEDN_PORT3_DIR     JL_PORTC->DIR
#define  LEDN_PORT3_PD      JL_PORTC->PD
#define  LEDN_PORT3_PU      JL_PORTC->PU

#define  LEDN_PORT4_OUT     JL_PORTC->OUT
#define  LEDN_PORT4_HD      JL_PORTC->HD
#define  LEDN_PORT4_DIR     JL_PORTC->DIR
#define  LEDN_PORT4_PD      JL_PORTC->PD
#define  LEDN_PORT4_PU      JL_PORTC->PU

#define  LEDN_PORT5_OUT     JL_PORTC->OUT
#define  LEDN_PORT5_HD      JL_PORTC->HD
#define  LEDN_PORT5_DIR     JL_PORTC->DIR
#define  LEDN_PORT5_PD      JL_PORTC->PD
#define  LEDN_PORT5_PU      JL_PORTC->PU

#define  LEDN_PORT6_OUT     JL_PORTC->OUT
#define  LEDN_PORT6_HD      JL_PORTC->HD
#define  LEDN_PORT6_DIR     JL_PORTC->DIR
#define  LEDN_PORT6_PD      JL_PORTC->PD
#define  LEDN_PORT6_PU      JL_PORTC->PU

#define  LEDN_S0_BIT   0
#define  LEDN_S1_BIT   14
#define  LEDN_S2_BIT   15
#define  LEDN_S3_BIT   1
#define  LEDN_S4_BIT   2
#define  LEDN_S5_BIT   3
#define  LEDN_S6_BIT   4
#endif // LED_7PIN_SEL
#if LED_12PIN_SEL
//********** BIT0=PORT0 ***************//
#define  LEDN_PORT0_OUT     JL_PORTC->OUT
#define  LEDN_PORT0_HD      JL_PORTC->HD
#define  LEDN_PORT0_DIR     JL_PORTC->DIR
#define  LEDN_PORT0_PD      JL_PORTC->PD
#define  LEDN_PORT0_PU      JL_PORTC->PU
//*************************************//
//********** BIT1=PORT1 ***************//
#define  LEDN_PORT1_OUT     JL_PORTC->OUT
#define  LEDN_PORT1_HD      JL_PORTC->HD
#define  LEDN_PORT1_DIR     JL_PORTC->DIR
#define  LEDN_PORT1_PD      JL_PORTC->PD
#define  LEDN_PORT1_PU      JL_PORTC->PU
//*************************************//
//********** BIT2=PORT2 ***************//
#define  LEDN_PORT2_OUT     JL_PORTC->OUT
#define  LEDN_PORT2_HD      JL_PORTC->HD
#define  LEDN_PORT2_DIR     JL_PORTC->DIR
#define  LEDN_PORT2_PD      JL_PORTC->PD
#define  LEDN_PORT2_PU      JL_PORTC->PU
//*************************************//
//********** BIT3=PORT3 ***************//
#define  LEDN_PORT3_OUT     JL_PORTC->OUT
#define  LEDN_PORT3_HD      JL_PORTC->HD
#define  LEDN_PORT3_DIR     JL_PORTC->DIR
#define  LEDN_PORT3_PD      JL_PORTC->PD
#define  LEDN_PORT3_PU      JL_PORTC->PU
//*************************************//
//********** BIT4=PORT4 ***************//
#define  LEDN_PORT4_OUT     JL_PORTC->OUT
#define  LEDN_PORT4_HD      JL_PORTC->HD
#define  LEDN_PORT4_DIR     JL_PORTC->DIR
#define  LEDN_PORT4_PD      JL_PORTC->PD
#define  LEDN_PORT4_PU      JL_PORTC->PU
//*************************************//
//********** BIT5=PORT5 ***************//
#define  LEDN_PORT5_OUT     JL_PORTA->OUT
#define  LEDN_PORT5_HD      JL_PORTA->HD
#define  LEDN_PORT5_DIR     JL_PORTA->DIR
#define  LEDN_PORT5_PD      JL_PORTA->PD
#define  LEDN_PORT5_PU      JL_PORTA->PU
//*************************************//
//********** BIT6=PORT6 ***************//
#define  LEDN_PORT6_OUT     JL_PORTA->OUT
#define  LEDN_PORT6_HD      JL_PORTA->HD
#define  LEDN_PORT6_DIR     JL_PORTA->DIR
#define  LEDN_PORT6_PD      JL_PORTA->PD
#define  LEDN_PORT6_PU      JL_PORTA->PU
//*************************************//
//********** BIT7=PORT7 ***************//
#define  LEDN_PORT7_OUT     JL_PORTC->OUT
#define  LEDN_PORT7_HD      JL_PORTC->HD
#define  LEDN_PORT7_DIR     JL_PORTC->DIR
#define  LEDN_PORT7_PD      JL_PORTC->PD
#define  LEDN_PORT7_PU      JL_PORTC->PU
//*************************************//
//********** BIT8=PORT8 ***************//
#define  LEDN_PORT8_OUT     JL_PORTA->OUT
#define  LEDN_PORT8_HD      JL_PORTA->HD
#define  LEDN_PORT8_DIR     JL_PORTA->DIR
#define  LEDN_PORT8_PD      JL_PORTA->PD
#define  LEDN_PORT8_PU      JL_PORTA->PU
//*************************************//
//********** BIT9=PORT9 ***************//
#define  LEDN_PORT9_OUT     JL_PORTA->OUT
#define  LEDN_PORT9_HD      JL_PORTA->HD
#define  LEDN_PORT9_DIR     JL_PORTA->DIR
#define  LEDN_PORT9_PD      JL_PORTA->PD
#define  LEDN_PORT9_PU      JL_PORTA->PU
//*************************************//
//********** BIT10=PORT10 *************//
#define  LEDN_PORT10_OUT     JL_PORTA->OUT
#define  LEDN_PORT10_HD      JL_PORTA->HD
#define  LEDN_PORT10_DIR     JL_PORTA->DIR
#define  LEDN_PORT10_PD      JL_PORTA->PD
#define  LEDN_PORT10_PU      JL_PORTA->PU
//*************************************//
//********** BIT11=PORT11 *************//
#define  LEDN_PORT11_OUT     JL_PORTA->OUT
#define  LEDN_PORT11_HD      JL_PORTA->HD
#define  LEDN_PORT11_DIR     JL_PORTA->DIR
#define  LEDN_PORT11_PD      JL_PORTA->PD
#define  LEDN_PORT11_PU      JL_PORTA->PU
//*************************************//
//**********SET PORTS SoC**************//
#define  LEDN_S0_BIT      5
#define  LEDN_S1_BIT      4
#define  LEDN_S2_BIT      3
#define  LEDN_S3_BIT      2
#define  LEDN_S4_BIT      1
#define  LEDN_S5_BIT      15
#define  LEDN_S6_BIT      14
#define  LEDN_S7_BIT      0
#define  LEDN_S8_BIT      11
#define  LEDN_S9_BIT      10
#define  LEDN_S10_BIT     9
#define  LEDN_S11_BIT     4

/*******************************************/
#endif
#endif	/*	_LED_H_	*/

А вот с общим катодом не работает.. Казалось бы что может быть не так, просто делай обратную полярность и все, распиновка та же. Я где то туплю , но где...

Подпись автора

USMicro® 2026©

11

Вот для ОА работает

Код:
void LED_drive7(void)
{
    u8 k,i,j,temp;
    k=0;

    led7_var.bShowBuff1[0]=0;
    led7_var.bShowBuff1[1]=0;
    led7_var.bShowBuff1[2]=0;
    led7_var.bShowBuff1[3]=0;
    led7_var.bShowBuff1[4]=0;
    led7_var.bShowBuff1[5]=0;
    led7_var.bShowBuff1[6]=0;
    led7_var.bShowBuff1[7]=0;
    led7_var.bShowBuff1[8]=0;
    led7_var.bShowBuff1[9]=0;
    led7_var.bShowBuff1[10]=0;
    led7_var.bShowBuff1[11]=0;


    for(i=0;i<5;i++)
    {
        temp = led7_var.bShowBuff[i];
        if (get_sys_halfsec())
        {
            if ((led7_var.bFlashIcon) && (i == 4))
            {
                temp = LED_STATUS & (~led7_var.bFlashIcon);
            }
            else if (led7_var.bFlashChar & BIT(i))
            {
                temp = 0x0;
            }
        }

        for(j=0;j<7;j++)
        {
            if(temp & bit_table[j])
            {
                led7_var.bShowBuff1[led_7[k][0]] |= bit_table[led_7[k][1]];
            }
            k++;
        }
        if(j == 7)
        {
            if(temp & bit_table[j])
                led7_var.bShowBuff[led_7[35][0]] |= bit_table[led_7[35][1]];
        }
    }
}

А для ОК по идее просто нужно 1 и 0 местами поменять, но почему то пол дисплея тогда тупо не работает, но признаки жизни есть. Ткните носом меня куда смотреть.
Кстати, вот ОА
https://upforme.ru/uploads/001b/ca/8a/2/t426455.jpg
https://upforme.ru/uploads/001b/ca/8a/2/t466564.jpg
https://upforme.ru/uploads/001b/ca/8a/2/t210307.jpg

Подпись автора

USMicro® 2026©

12

BIOS написал(а):

Вопрос, а можно как то регулировать громкость PCM? ну тоесть еще со стороны декодера/проца который формирует I2S.  А то обычно регулируют аналоговый сигнал уже после I2S кодека...

Вопрос снят.

Подпись автора

USMicro® 2026©

13

BIOS написал(а):

А для ОК по идее просто нужно 1 и 0 местами поменять, но почему то пол дисплея тогда тупо не работает, но признаки жизни есть. Ткните носом меня куда смотреть.

Наверное тут кто-то забыл сменить тип массива bShowBuff1 с u8 до u16, также как и его размер с 9 до 12 элементов.
И ещё в led7_scan поменять тип переменной seg также на u16, и заменить bit_table[n] на макрос BIT(n), или его тоже подкорректировать.

Здесь сканирование реализовано так, что на определённый пин подаётся высокий уровень, а на остальные пины подаётся низкий уровень там, где надо зажечь сегмент. Короче говоря обычный чарлиплекс.

В случае с общим анодом, в каждом элементе массива используются только биты 0-3, которые соответствуют пинам с разрядами, а на сегменты используются элементы 4-11 у массива.

В случае же с общим катодом, тут уже наоборот - первые четыре элемента используются под выводы разрядов, а биты в них уже отвечают за сегменты.
Вот тут и проблема - пинов у нас 12 но бит только 8, соответственно последние четыре сегмента теряются, ибо не вмещаются (биты 4-11).


Выходит как-то так:

led7_drv.h
Код:
#ifndef	_LED7_DRV_H_
#define _LED7_DRV_H_

#include "includes.h"

/*====================================================================*/

#define LED_7PIN_SEL         0
#define LED_12PIN_SEL        1
#define LED_12PIN_CA_SEL     1
#define LED_12PIN_CC_SEL     0

#if LED_7PIN_SEL
#define LEDN_PORT0          JL_PORTC:0
#define LEDN_PORT1          JL_PORTA:14
#define LEDN_PORT2          JL_PORTA:15
#define LEDN_PORT3          JL_PORTC:1
#define LEDN_PORT4          JL_PORTC:2
#define LEDN_PORT5          JL_PORTC:3
#define LEDN_PORT6          JL_PORTC:4
#define LEDN_PORT_COUNT     7
#endif

#if LED_12PIN_SEL
#define LEDN_PORT0          JL_PORTC:5
#define LEDN_PORT1          JL_PORTC:4
#define LEDN_PORT2          JL_PORTC:3
#define LEDN_PORT3          JL_PORTC:2
#define LEDN_PORT4          JL_PORTC:1
#define LEDN_PORT5          JL_PORTA:15
#define LEDN_PORT6          JL_PORTA:14
#define LEDN_PORT7          JL_PORTC:0
#define LEDN_PORT8          JL_PORTA:11
#define LEDN_PORT9          JL_PORTA:10
#define LEDN_PORT10         JL_PORTA:9
#define LEDN_PORT11         JL_PORTA:4
#define LEDN_PORT_COUNT     12
#endif

/*====================================================================*/

typedef struct _led7_VAR
{
    u8  bCoordinateX;
    u8  bFlashChar;
    u8  bFlashIcon;
    u8  bShowBuff[5];
    u8  bBrightness;
    u16 bShowBuff1[LEDN_PORT_COUNT];
} LED7_VAR;

#define LED_STATUS  led7_var.bShowBuff[4]

#define LED_A           BIT(0)
#define LED_B           BIT(1)
#define LED_C           BIT(2)
#define LED_D           BIT(3)
#define LED_E           BIT(4)
#define LED_F           BIT(5)
#define LED_G           BIT(6)
#define LED_H           BIT(12)

//for LED0
#define LED_PLAY        LED_A
#define LED_PAUSE       LED_B
#define LED_USB         LED_C
#define LED_SD          LED_D
#define LED_2POINT      LED_E
#define LED_MHZ         LED_F
#define LED_DOT         LED_G
#define LED_MP3         LED_H

/*====================================================================*/

//void set_LED_fade_out(void);
//void set_LED_all_on(void);

void led7_init(void);
void led7_scan(void *param);
void led7_clear_icon(void);
void led7_show_char(char chardata);
void led7_show_number(u8 number);
void led7_show_Hi(void);
///void led7_show_dev(void);
void led7_show_music_main(void);
void led7_show_RTC_main(void);
void led7_show_filenumber(void);
void led7_show_volume(s32 vol);
void led7_show_fm_main(void);
void led7_show_IR_number(s32);
void led7_show_pc_main(void);
void led7_show_pc_vol_up(void);
void led7_show_pc_vol_down(void);
void led7_show_aux_main(void);
void led7_show_eq(s32 arg);
void led7_show_playmode(s32 arg);
void led7_show_pause(void);
void led7_show_fm_station(void);
void led7_show_waiting(void);
void led7_show_alarm(void);
//void led7_show_nop(void);
void led7_show_rec_main(void);
void led7_show_linin_main(u8 menu);
void led7_clear(void);
void led7_show_string_menu(u8 menu);
void led7_setX(u8 X);
void led7_show_bt_main(void);

#endif	/*	_LED_H_	*/
led7_drv.c
Код:
#include "ui/ui_api.h"

#if UI_ENABLE

#include "ui/ui_common.h"
#include "ui/led/led7_drv.h"
#include "fm_radio.h"
#include "dec/decoder_phy.h"
#include "music_ui.h"
#include "music.h"
#include "timer.h"
#include "key_drv/key.h"
#include "file_operate/file_op.h"
//#include "play_file.h"
#include "dac/dac.h"
#include "rtc_setting.h"
#include "sys_detect.h"

#if REC_EN
    #include "encode/encode.h"
#endif

LED7_VAR led7_var;


const JL_PORT_TypeDef *led7_ports[LEDN_PORT_COUNT] = {
    1 ? LEDN_PORT0,
    1 ? LEDN_PORT1,
    1 ? LEDN_PORT2,
    1 ? LEDN_PORT3,
    1 ? LEDN_PORT4,
    1 ? LEDN_PORT5,
    1 ? LEDN_PORT6,
#if LEDN_PORT_COUNT > 7
    1 ? LEDN_PORT7,
    1 ? LEDN_PORT8,
    1 ? LEDN_PORT9,
    1 ? LEDN_PORT10,
    1 ? LEDN_PORT11,
#endif
};

const char led7_port_bits[LEDN_PORT_COUNT] = {
    0 ? LEDN_PORT0,
    0 ? LEDN_PORT1,
    0 ? LEDN_PORT2,
    0 ? LEDN_PORT3,
    0 ? LEDN_PORT4,
    0 ? LEDN_PORT5,
    0 ? LEDN_PORT6,
#if LEDN_PORT_COUNT > 7
    0 ? LEDN_PORT7,
    0 ? LEDN_PORT8,
    0 ? LEDN_PORT9,
    0 ? LEDN_PORT10,
    0 ? LEDN_PORT11,
#endif
};

/* Numbers */
const u8 LED_NUMBER[10] =
{
    LED_A | LED_B | LED_C | LED_D | LED_E | LED_F,          /* 0 */
            LED_B | LED_C,                                  /* 1 */
    LED_A | LED_B |         LED_D | LED_E |         LED_G,  /* 2 */
    LED_A | LED_B | LED_C | LED_D |                 LED_G,  /* 3 */
            LED_B | LED_C |                 LED_F | LED_G,  /* 4 */
    LED_A |         LED_C | LED_D |         LED_F | LED_G,  /* 5 */
    LED_A |         LED_C | LED_D | LED_E | LED_F | LED_G,  /* 6 */
    LED_A | LED_B | LED_C,                                  /* 7 */
    LED_A | LED_B | LED_C | LED_D | LED_E | LED_F | LED_G,  /* 8 */
    LED_A | LED_B | LED_C | LED_D | LED_F | LED_G,          /* 9 */
};

/* Uppercase letters */
const u8 LED_LARGE_LETTER[26] =
{
    0x77,0x40,0x39,0x3f,0x79,///<ABCDE
    0x71,0x40,0x76,0x06,0x40,///<FGHIJ
    0x40,0x38,0x40,0x37,0x3f,///<KLMNO
    0x73,0x40,0x50,0x6d,0x78,///<PQRST
    0x3e,0x3e,0x40,0x76,0x40,///<UVWXY
    0x40///<Z
};

/* Lowercase letters */
const u8 LED_SMALL_LETTER[26] =
{
    0x77,0x7c,0x58,0x5e,0x79,///<abcde
    0x71,0x40,0x40,0x40,0x40,///<fghij
    0x40,0x38,0x40,0x54,0x5c,///<klmno
    0x73,0x67,0x50,0x40,0x78,///<pqrst
    0x3e,0x3e,0x40,0x40,0x40,///<uvwxy
    0x40///<z
};



#if LED_7PIN_SEL == 1
/* LSH24D17-1B-UR charlieplexed display */
const u8 led_7[36][2] = {
  {0,1},//1A
  {0,2},//1B
  {3,0},//1C
  {4,0},//1D
  {0,3},//1E
  {1,0},//1F
  {2,0},//1G

  {1,2},//2A
  {1,3},//2B
  {4,1},//2C
  {1,5},//2D
  {1,4},//2E
  {2,1},//2F
  {3,1},//2G

  {4,3},//3A
  {2,4},//3B
  {3,4},//3C
  {5,0},//3D
  {5,2},//3E
  {3,2},//3F
  {4,2},//3G

  {6,5},//4A
  {5,6},//4B
  {4,5},//4C
  {5,3},//4D
  {3,5},//4E
  {5,4},//4F
  {4,6},//4G

  {0,5},//LED_PLAY
  {2,5},//LED_PAUSE
  {5,1},//LED_USB
  {0,4},//LED_SD
  {2,3},//LED_2POINT
  {6,2},//LED_AUX
  {6,4},//.
  {2,6},//LED_MHz
};
#endif // LED_7PIN_SEL

#if LED_12PIN_SEL
/* Standard 12-pin 4-digit display */
const u8 led_7[36][2] = {
    {4,0},//1A
    {5,0},//1B
    {6,0},//1C
    {7,0},//1D
    {8,0},//1E
    {9,0},//1F
    {10,0},//1G

    {4,1},//2A
    {5,1},//2B
    {6,1},//2C
    {7,1},//2D
    {8,1},//2E
    {9,1},//2F
    {10,1},//2G

    {4,2},//3A
    {5,2},//3B
    {6,2},//3C
    {7,2},//3D
    {8,2},//3E
    {9,2},//3F
    {10,2},//3G

    {4,3},//4A
    {5,3},//4B
    {6,3},//4C
    {7,3},//4D
    {8,3},//4E
    {9,3},//4F
    {10,3},//4G

    {0,0},//LED_PLAY
    {0,0},//LED_PAUSE
    {0,0},//LED_USB
    {0,0},//SD
    {11,1},//:
    {0,0},//MHz
    {11,2},//.
    {0,0},//MP3
};
#endif

const char playmodestr[][5] =
{
    " ALL",
    " dev",
    "Fold",
    " ONE",
    " rAn",
};

const char menu_string[][5] =
{
    " HI ",
    "Lod ",
    "bLUE",
    " PC ",
    " UP ",
    " dN ",
    " AUX",
    "-AL-",

};
const char other_string[][5]=
{
    "Eq ",
    "V ",
    "P ",
    " NOP",
    " rec",
    " Sd ",
};

/*----------------------------------------------------------------------------*/
/**@brief   Music模式 设备显示
   @param   void
   @return  void
   @author  Change.tsai
   @note    void led7_show_dev(void)
*/
/*----------------------------------------------------------------------------*/
void led7_show_dev(u8 dev)
{
//    /*Music Device type*/
    /* MUSIC_DIS_VAR *music_var; */
    /* music_var = (MUSIC_DIS_VAR*)UI_var.ui_buf_adr; */

    /* if(music_var) */
    {
        if((dev == SD0_DEVICE)||(dev == SD1_DEVICE))
        {
            LED_STATUS |= LED_SD;
            /// led7_show_string(other_string[]);
        }
        else if(dev == USB_DEVICE)
        {
            LED_STATUS |= LED_USB;
        }
    }
}

/*----------------------------------------------------------------------------*/
/**@brief   led7_drv 状态位缓存清除函数
   @param   void
   @return  void
   @author  Change.tsai
   @note    void led7_clear_icon(void)
*/
/*----------------------------------------------------------------------------*/
void led7_clear_icon(void)
{
    led7_var.bFlashChar = 0;
    led7_var.bFlashIcon = 0;
    led7_var.bShowBuff[4] = 0;
}

/*----------------------------------------------------------------------------*/
/**@brief   led7_drv 显示坐标设置
   @param   x:显示横坐标
   @return  void
   @author  Change.tsai
   @note    void led7_setX(u8 X)
*/
/*----------------------------------------------------------------------------*/
void led7_setX(u8 X)
{
    led7_var.bCoordinateX = X;
}

/*----------------------------------------------------------------------------*/
/**@brief   LED 清屏函数
   @param   void
   @return  void
   @author  Change.tsai
   @note    void led7_show_null(void)
*/
/*----------------------------------------------------------------------------*/
void led7_show_null(void)
{
    led7_clear_icon();
    led7_var.bShowBuff[0] = 0;
    led7_var.bShowBuff[1] = 0;
    led7_var.bShowBuff[2] = 0;
    led7_var.bShowBuff[3] = 0;
}

/*----------------------------------------------------------------------------*/
/**@brief   led7_drv 扫描函数
   @param   void
   @return  void
   @author  Change.tsai
   @note    void led7_init(void)
*/
/*----------------------------------------------------------------------------*/
void led7_init(void)
{
    led7_clear();
    s32 ret;
	ret = timer_reg_isr_fun(timer2_hl,0,led7_scan,NULL);
	if(ret != TIMER_NO_ERR)
	{
    printf("led7_scan err = %x\n",ret);
	}
}

/*----------------------------------------------------------------------------*/
/**@brief   led7_drv 单个字符显示函数
   @param   chardata:显示字符
   @return  void
   @author  Change.tsai
   @note    void led7_show_char(u8 chardata)
*/
/*----------------------------------------------------------------------------*/
void led7_show_char(char chardata)
{
    //必须保证传入的参数符合范围,程序不作判断
    //if ((chardata < ' ') || (chardata > '~') || (led7_var.bCoordinateX > 4))
    //{
    //    return;
    //}
    if ((chardata >= '0') && (chardata <= '9'))
    {
        led7_var.bShowBuff[led7_var.bCoordinateX++] = LED_NUMBER[chardata - '0'];
    }
    else if ((chardata >= 'a') && (chardata <= 'z'))
    {
        led7_var.bShowBuff[led7_var.bCoordinateX++] = LED_SMALL_LETTER[chardata - 'a'];
    }
    else if ((chardata >= 'A') && (chardata <= 'Z'))
    {
        led7_var.bShowBuff[led7_var.bCoordinateX++] = LED_LARGE_LETTER[chardata - 'A'];
    }
    else if (chardata == ':')
    {
        LED_STATUS |= LED_2POINT;
    }
    else if (chardata == ' ')
    {
        led7_var.bShowBuff[led7_var.bCoordinateX++] = 0;
    }
    else //if (chardata == '-')     //不可显示
    {
        led7_var.bShowBuff[led7_var.bCoordinateX++] = BIT(6);
    }
}

/*----------------------------------------------------------------------------*/
/**@brief   led7_drv 字符串显示函数
   @param   *str:字符串的指针   offset:显示偏移量
   @return  void
   @author  Change.tsai
   @note    void led7_show_string(u8 *str)
*/
/*----------------------------------------------------------------------------*/
void led7_show_string(char *str)
{
    while (*str)
        led7_show_char(*str++);
}

/*----------------------------------------------------------------------------*/
/** @brief:
    @param:
    @return:
    @author:
    @note:
*/
/*----------------------------------------------------------------------------*/
void led7_show_string_menu(u8 menu)
{

    if(menu >= (sizeof(menu_string)/5))
    {
        printf("*strid(%d) is over!\n",menu);
    }
    else
    {
        led7_show_string(menu_string[menu]);
    }
}

void led7_show_linin_main(u8 menu)
{
    led7_show_string_menu(menu);

#if REC_EN

    RECORD_OP_API * rec_var_p;
    REC_CTL * rec_ctl_var;

    rec_var_p = *(RECORD_OP_API **)UI_var.ui_buf_adr;
    if((UI_var.ui_buf_adr)&&(rec_var_p))
    {
        rec_ctl_var = rec_var_p->rec_ctl;

        LED_STATUS &= ~(LED_PLAY | LED_PAUSE);
        LED_STATUS &= ~(LED_SD|LED_USB);

        if((menu == MENU_AUX_MAIN)||(menu == MENU_BT_MAIN))
        {
            if((rec_ctl_var)&&(ENC_STOP !=rec_ctl_var->enable))
            {
                if (ENC_STAR == rec_ctl_var->enable)
                    LED_STATUS |= LED_PLAY;
                else if(ENC_PAUS == rec_ctl_var->enable)
                    LED_STATUS |= LED_PAUSE;

        led7_show_dev(rec_ctl_var->curr_device);
            }
        }
    }
#endif
}
/*----------------------------------------------------------------------------*/
/**@brief   Music 播放文件号显示函数
   @param   void
   @return  void
   @author  Change.tsai
   @note    void led7_show_filenumber(void)
*/
/*----------------------------------------------------------------------------*/
void led7_show_filenumber(void)
{
    MUSIC_DIS_VAR *music_var;

    music_var = (MUSIC_DIS_VAR*)UI_var.ui_buf_adr;

    if(music_var)
    {
        /*Music File Number info*/
        //printf("ui_music.ui_play_file_num = %u----\n",ui_music.ui_play_file_num);
        itoa4(music_var->ui_curr_file);
        led7_show_string((char *)bcd_number);
    }

}


/*----------------------------------------------------------------------------*/
/**@brief   红外输入文件号显示函数
   @param   void
   @return  void
   @author  Change.tsai
   @note    void led7_show_IR_number(void)
*/
/*----------------------------------------------------------------------------*/
void led7_show_IR_number(s32 arg)
{
    u16 ir_num;
    ir_num = (u16)(arg&0xffff);
    /*IR File Number info*/
    itoa4(ir_num);
    led7_show_string((char *)bcd_number);
}

/*----------------------------------------------------------------------------*/
/**@brief   Music模式 显示界面
   @param   void
   @return  void
   @author  Change.tsai
   @note    void led7_show_music_main(void)
*/
/*----------------------------------------------------------------------------*/
void led7_show_music_main(void)
{
    //led7_show_string("MUSI");
    u32 play_time;
    MUSIC_DIS_VAR *music_var;

    music_var = (MUSIC_DIS_VAR*)UI_var.ui_buf_adr;

    if(music_var)
    {
        /*Music Play time info*/
        play_time = music_var->play_time;

        itoa2(play_time/60);
        led7_show_string((char *)bcd_number);

        itoa2(play_time%60);
        led7_show_string((char *)bcd_number);

        /* led7_show_dev(); */
    led7_show_dev(music_var->ui_curr_device);

        LED_STATUS |= LED_2POINT; ///LED_2POINT | LED_MP3;


        if (*music_var->ui_curr_statu == DECODER_PLAY)
        {
            LED_STATUS |= LED_PLAY;
            LED_STATUS &= ~LED_PAUSE;
            led7_var.bFlashIcon |= LED_2POINT;
        }
        else if (*music_var->ui_curr_statu == DECODER_PAUSE)
        {
            LED_STATUS &= ~LED_PLAY;
            LED_STATUS |= LED_PAUSE;
        }
    //
    //    if(mute)
    //    {
    //        led7_var.bFlashIcon |= LED_MP3;
    //        led7_var.bFlashChar = 0x0f;
    //    }
    //    else
    //    {
    //        led7_var.bFlashIcon &= ~LED_MP3;
    //        led7_var.bFlashChar = 0x00;
    //    }
    }
}



void led7_show_bt_main(void)
{

    static u8 cnt = 0;

    if(btstatus == 1)
    {
        led7_show_string(" bt ");
    }
    else
    {
        switch(cnt)
        {

            case 0:
                led7_show_string(" bt ");
                break ;

            case 1:
                led7_show_string("  bt");
                break ;

            case 2:
                led7_show_string(" bt ");
                break ;
            case 3:
                led7_show_string("bt  ");
                break ;
        }

        cnt = (cnt < 3) ? (cnt + 1) : 0;
    }
}

/*----------------------------------------------------------------------------*/
/**@brief   EQ显示函数
   @param   void
   @return  void
   @author  Change.tsai
   @note    void led7_show_eq(s32 arg)
*/
/*----------------------------------------------------------------------------*/
void led7_show_eq(s32 arg)
{
    u8 eq_cnt;
    eq_cnt = (u8)arg;
    led7_show_string(other_string[0]);
    led7_show_char(eq_cnt%10 + '0');
}

/*----------------------------------------------------------------------------*/
/**@brief   循环模式显示函数
   @param   void
   @return  void
   @author  Change.tsai
   @note    void led7_show_playmode(s32 arg)
*/
/*----------------------------------------------------------------------------*/
void led7_show_playmode(s32 arg)
{
    u8 pm_cnt;
    pm_cnt = (u8)arg;
    led7_show_string(&playmodestr[pm_cnt-FOP_MAX-1][0]);
}

/*----------------------------------------------------------------------------*/
/**@brief   音量显示函数
   @param   void
   @return  void
   @author  Change.tsai
   @note    void led7_show_volume(s32 vol)
*/
/*----------------------------------------------------------------------------*/
void led7_show_volume(s32 vol)
{
    u8 tmp_vol;

    tmp_vol = (u8)vol;
    led7_show_string(other_string[1]);
    itoa2(tmp_vol);
    led7_show_string((char *)bcd_number);
}

/*----------------------------------------------------------------------------*/
/**@brief   FM 模式主界面
   @param   void
   @return  void
   @author  Change.tsai
   @note    void led7_show_fm_main(void)
*/
/*----------------------------------------------------------------------------*/
void led7_show_fm_main(void)
{
    /*FM - Frequency*/
 #if 1
    FM_MODE_VAR * fm_var;

    if(!UI_var.ui_buf_adr)
        return;

    fm_var = *(FM_MODE_VAR **)UI_var.ui_buf_adr;

    if(fm_var)
    {
        itoa4(fm_var->wFreq);

        if (fm_var->wFreq <= 999)
            bcd_number[0] = ' ';

        led7_show_string((char *)bcd_number);
        LED_STATUS |= LED_MHZ;

#if REC_EN
        RECORD_OP_API * rec_var_p;
        REC_CTL * rec_ctl_var;

        if((fm_var->fm_rec_op)&&(*(RECORD_OP_API **)(fm_var->fm_rec_op)))
        {
            rec_var_p = *(RECORD_OP_API **)fm_var->fm_rec_op;
            rec_ctl_var = rec_var_p->rec_ctl;

            if((rec_ctl_var)&&(ENC_STOP != rec_ctl_var->enable))
            {
        LED_STATUS &= ~(LED_PLAY | LED_PAUSE);
        LED_STATUS &= ~(LED_SD|LED_USB);

                /* led7_show_dev(); */
        led7_show_dev(rec_ctl_var->curr_device);
                if (ENC_STAR == rec_ctl_var->enable)
                    LED_STATUS |= LED_PLAY;
                else if(ENC_PAUS == rec_ctl_var->enable)
                    LED_STATUS |= LED_PAUSE;
            }

        }
#endif
    }

#endif // 0
}

/*----------------------------------------------------------------------------*/
/**@brief   FM 模式主界面
   @param   void
   @return  void
   @author  Change.tsai
   @note    void led7_show_fm_station(void)
*/
/*----------------------------------------------------------------------------*/
void led7_show_fm_station(void)
{
//    /*FM - Station*/
#if 1
    FM_MODE_VAR * fm_var;

    if(!UI_var.ui_buf_adr)
        return;

    fm_var = *(FM_MODE_VAR **)UI_var.ui_buf_adr;

    if(fm_var)
    {
        led7_show_string(other_string[2]);
        itoa2(fm_var->wFreChannel);
        led7_show_string((char *)bcd_number);
    }
#endif
}

#if 1 //RTC_CLK_EN
/*----------------------------------------------------------------------------*/
/**@brief   RTC 显示界面
   @param   void
   @return  void
   @author  Change.tsai
   @note    void led7_show_RTC_main(void)
*/
/*----------------------------------------------------------------------------*/
void led7_show_RTC_main(void)
{
    RTC_SETTING * rtc_var;
    RTC_TIME *ui_time;

    rtc_var = (RTC_SETTING *)UI_var.ui_buf_adr;

    if(rtc_var)
    {
        ui_time = rtc_var->calendar_set.curr_rtc_time;

        itoa2(ui_time->bHour);
        led7_show_string((char *)bcd_number);
        itoa2(ui_time->bMin);
        led7_show_string((char *)bcd_number);

        led7_var.bFlashIcon |= LED_2POINT;
        LED_STATUS |= LED_2POINT;

        if(rtc_var->rtc_set_mode == RTC_SET_MODE)
        {
            if(rtc_var->calendar_set.coordinate == COORDINATE_MIN)
                led7_var.bFlashChar = BIT(0)|BIT(1);
            else
                led7_var.bFlashChar = BIT(2)|BIT(3);
        }
        else
            led7_var.bFlashChar = 0;
    }
}

/*----------------------------------------------------------------------------*/
/**@brief   Alarm 显示界面
   @param   void
   @return  void
   @author  Change.tsai
   @note    void led7_show_alarm(void)
*/
/*----------------------------------------------------------------------------*/
#if 1 //RTC_ALM_EN
void led7_show_alarm(void)
{
    RTC_SETTING * rtc_var;
    RTC_TIME *ui_time;
    rtc_var = (RTC_SETTING *)UI_var.ui_buf_adr;

    if(rtc_var)
    {
        puts("led7_show_alarm\n");

        ui_time = rtc_var->alarm_set.curr_alm_time;
        itoa2(ui_time->bHour);
        led7_show_string((char *)bcd_number);
        itoa2(ui_time->bMin);
        led7_show_string((char *)bcd_number);

        LED_STATUS |= LED_2POINT;

        if(rtc_var->rtc_set_mode == ALM_SET_MODE)
        {
            if(rtc_var->alarm_set.coordinate == COORDINATE_MIN)
                led7_var.bFlashChar = BIT(0)|BIT(1);
            else
                led7_var.bFlashChar = BIT(2)|BIT(3);
        }

        /*Alarm info - Switch On/Off*/
        if (rtc_var->alarm_set.alarm_sw)
        {
            LED_STATUS |= LED_PLAY;
        }
        else
        {
            LED_STATUS |= LED_PAUSE;
        }
    }
}
#endif
#endif

#if REC_EN
/*----------------------------------------------------------------------------*/
/**@brief   REC 显示界面
   @param   void
   @return  void
   @note    void led7_show_rec_start(void)
*/
/*----------------------------------------------------------------------------*/
static void led7_show_rec_start(REC_CTL * rec_ctl_var)
{
    u32 rec_time;

//    LED_STATUS &= ~(LED_PLAY | LED_PAUSE);
//    if(rec_ctl_var)
    {
        rec_time = rec_ctl_var->file_info.enc_time_cnt;

        itoa2(rec_time/60);
        led7_show_string((char *)bcd_number);

        itoa2(rec_time%60);
        led7_show_string((char *)bcd_number);

        /* led7_show_dev(); */
    led7_show_dev(rec_ctl_var->curr_device);

        LED_STATUS |= LED_2POINT; //| LED_PLAY;

        if (ENC_STAR == rec_ctl_var->enable)
            LED_STATUS |= LED_PLAY;
        else if (ENC_PAUS == rec_ctl_var->enable)
            LED_STATUS |= LED_PAUSE;
    }
}

/*----------------------------------------------------------------------------*/
/**@brief   REC 显示界面
   @param   void
   @return  void
   @note    void led7_show_rec_main(void)
*/
/*----------------------------------------------------------------------------*/
void led7_show_rec_main(void)
{
    RECORD_OP_API * rec_var_p;
    REC_CTL * rec_ctl_var;

    LED_STATUS &= ~(LED_PLAY | LED_PAUSE);
    LED_STATUS &= ~LED_2POINT; //| LED_PLAY;
    LED_STATUS &= ~(LED_SD|LED_USB);

    if(UI_var.ui_buf_adr)
    {
        rec_var_p = *(RECORD_OP_API **)UI_var.ui_buf_adr;
        if(rec_var_p)
        {
            rec_ctl_var = rec_var_p->rec_ctl;
            if((rec_ctl_var)&&(ENC_STOP != rec_ctl_var->enable))
            {
                led7_show_rec_start(rec_ctl_var);
                return;
            }
        }
    }

    led7_show_string(other_string[4]);
}
#endif

void LED_drive7(void)
{
    u8 i, j, temp;
    u8 dispseg = 0;

    for (i = 0; i < LEDN_PORT_COUNT; i++)
        led7_var.bShowBuff1[i] = 0;

    for (i = 0; i < 5; i++) {
        temp = led7_var.bShowBuff[i];

        if (get_sys_halfsec()) {
            if ((led7_var.bFlashIcon) && (i == 4)) {
                temp = LED_STATUS & (~led7_var.bFlashIcon);
            } else
            if (led7_var.bFlashChar & BIT(i)) {
                temp = 0x0;
            }
        }

        for (j = 0; j < 7; j++) {
            if(temp & BIT(j))
                led7_var.bShowBuff1[led_7[dispseg][0]] |= BIT(led_7[dispseg][1]);

            dispseg++;
        }

        /* ??? */
        if (j == 7) {
            if(temp & BIT(j))
                led7_var.bShowBuff[led_7[35][0]] |= BIT(led_7[35][1]);
        }
    }
}

/*----------------------------------------------------------------------------*/
/**@brief   LED清屏函数
   @param   x:显示横坐标
   @return  void
   @author  Change.tsai
   @note    void led7_clear(void)
*/
/*----------------------------------------------------------------------------*/

void led7_clear(void)
{
    for (int i = 0; i < LEDN_PORT_COUNT; i++) {
        JL_PORT_TypeDef *port = led7_ports[i];
        u16 mask = BIT(led7_port_bits[i]);

        port->OUT &= ~mask;         /* Low level */
        port->DIR |=  mask;         /* Input */
        port->PU  &= ~mask;         /* Pullup disable */
        port->PD  &= ~mask;         /* Pulldown disable */
        port->HD  &= ~mask;         /* Highdrive disable */
    }
}


/*----------------------------------------------------------------------------*/
/**@brief   LED扫描函数
   @param   void
   @return  void
   @author  Change.tsai
   @note    void led7_scan(void *param)
*/
/*----------------------------------------------------------------------------*/
void led7_scan(void *param)
{
    static u8 cnt;
    JL_PORT_TypeDef *port;
    u16 mask, seg;

    LED_drive7();

    seg = led7_var.bShowBuff1[cnt];

    led7_clear();

    /* Drive the scan pin high */
    port = led7_ports[cnt];
    mask = BIT(led7_port_bits[cnt]);

    port->OUT |=  mask;         /* High level */
    port->HD  |=  mask;         /* Highdrive enable */
    port->DIR &= ~mask;         /* Output */

    /* Drive the segment pin low */
    for (int i = 0; i < LEDN_PORT_COUNT; i++) {
        port = led7_ports[i];
        mask = BIT(led7_port_bits[i]);

        if (seg & BIT(i)) {
            port->OUT &= ~mask;         /* Low level */
            port->HD  |=  mask;         /* Highdrive enable */
            port->DIR &= ~mask;         /* Output */
        }
    }

    cnt = (cnt < LEDN_PORT_COUNT) ? (cnt + 1) : 0;
}

#endif
Подпись автора

水Mizu-DEC JLtech since 22.06.2019

14

kagaimiq написал(а):

В случае же с общим катодом, тут уже наоборот - первые четыре элемента используются под выводы разрядов, а биты в них уже отвечают за сегменты.

Но почему так? Ничего же не меняется. Просто другая полярность и все. 
Код кстати не компилируется,
https://upforme.ru/uploads/001b/ca/8a/2/t925462.png

Подпись автора

USMicro® 2026©

15

kagaimiq написал(а):

Вот тут и проблема - пинов у нас 12 но бит только 8, соответственно последние четыре сегмента теряются, ибо не вмещаются (биты 4-11).

Попробую на стандартном коде. Думаю что так и есть. Только почему так происходит, почему биты и сегменты местами меняются?

Подпись автора

USMicro® 2026©

16

BIOS написал(а):

Только почему так происходит, почему биты и сегменты местами меняются?

Я из "А для ОК по идее просто нужно 1 и 0 местами поменять" подумал, что это происходит примерно так:

ОА: led7_var.bShowBuff1[led_7[k][0]] |= bit_table[led_7[k][1]];
ОК: led7_var.bShowBuff1[led_7[k][1]] |= bit_table[led_7[k][0]];

И это по сути должно как раз так и работать, на сегментах низкий уровень, а на разрядах - высокий.

Подпись автора

水Mizu-DEC JLtech since 22.06.2019

17

kagaimiq написал(а):

ОА: led7_var.bShowBuff1[led_7[k][0]] |= bit_table[led_7[k][1]];
ОК: led7_var.bShowBuff1[led_7[k][1]] |= bit_table[led_7[k][0]];

И это по сути должно как раз так и работать, на сегментах низкий уровень, а на разрядах - высокий.

Да, оно и работает для ОА, но если меняю для ОК то пол дисплея идет лесом. Причем не первые 4 бита, а последние.
Я вот этот момент не понимаю, для ОА оно как то же работает, по сути просто мы меняем "полярность" же. Щас колупаю это дело.

Подпись автора

USMicro® 2026©

18

Интересный момент, если добавить пинов, было 12, стало 16, и просто на последние 4 новых повесит 4 предыдущих что не работают почему то с ОК, то ОК начинает работать как нужно. ..
Почему так происходит,

kagaimiq написал(а):

В случае же с общим катодом, тут уже наоборот - первые четыре элемента используются под выводы разрядов, а биты в них уже отвечают за сегменты.
Вот тут и проблема - пинов у нас 12 но бит только 8, соответственно последние четыре сегмента теряются, ибо не вмещаются (биты 4-11).

Но я всеравно не доганяю почему разряды и сегменты меняются местами в случае с ОК.  Почему работают новые пины 13-16? Но предыдущие 4 нет?

Подпись автора

USMicro® 2026©

19

const u16 bit_table[8] =
{
  0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,
};
Оно?

Подпись автора

USMicro® 2026©

20

BIOS написал(а):

Оно?

Туда ещё дописать 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000, 0x8000

А вообще bit_table[x] заменить на BIT(x), так как они делают по сути одно и тоже.

Подпись автора

水Mizu-DEC JLtech since 22.06.2019


Вы здесь » USMI » MCU, SoC, CPU Микроконтроллеры » Подключение разной периферии к JL SoC. SPI/I2C/I2S/PWM/UART/GPIO...