USMI

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

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


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


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

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

1

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

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

By Admin

2

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

3

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

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

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

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

By Admin

4

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

5

Ты о чем?

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

By Admin

6

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

7

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

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

By Admin

8

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

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

By Admin

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пиновых индикаторов с общим анодом и общим катодом, с яркостью и тд))).
Фотки чуть позже скину.

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

By Admin

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_	*/

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

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

By Admin

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://forumupload.ru/uploads/001b/ca/8a/2/t426455.jpg
https://forumupload.ru/uploads/001b/ca/8a/2/t466564.jpg
https://forumupload.ru/uploads/001b/ca/8a/2/t210307.jpg

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

By Admin

12

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

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

Вопрос снят.

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

By Admin

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://forumupload.ru/uploads/001b/ca/8a/2/t925462.png

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

By Admin

15

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

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

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

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

By Admin

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 бита, а последние.
Я вот этот момент не понимаю, для ОА оно как то же работает, по сути просто мы меняем "полярность" же. Щас колупаю это дело.

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

By Admin

18

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

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

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

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

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

By Admin

19

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

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

By Admin

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...