------------------------------------------------------------------------
- Подпись автора
USMicro® 2026©
USMI |
Привет, Гость! Войдите или зарегистрируйтесь.
Вы здесь » USMI » MCU, SoC, CPU Микроконтроллеры » Подключение разной периферии к JL SoC. SPI/I2C/I2S/PWM/UART/GPIO...
------------------------------------------------------------------------
USMicro® 2026©
было б интересно к наушникам подключить i2s микрофон, а то там обычно не микрофон, а хз что.
было б интересно к наушникам подключить i2s микрофон, а то там обычно не микрофон, а хз что.
К какому чипу?
USMicro® 2026©
а там обычно ножек не хватает, да?
Ты о чем?
USMicro® 2026©
на мелких корпусах порты не выведены? мне было интересно 6956a
А вот хз. Там вроде не I2S. Хз вообще, вроде как в 698 и тд используют цифровые микрофоны. C ANC. Ну типа а-ля эирподсы со всеми свистоперделками)
Я возился только с электретными микрофонами. Вроде с головой хватало. Ну конечно же без ANC, но вроде всё хорошо было. Таже тестировал через звонки. Там напряжение питания нужно брать строго с ноги DACAVDD. И чувствительность этих микрофончиков очень сильно зависит от напряжения питания. Я игрался с этим, лучше переменник резистор поставить и протестировать в реальном времени. Еже чувствительность в блютуз конфиге настраивается.
USMicro® 2026©
Вопрос, а можно как то регулировать громкость PCM? ну тоесть еще со стороны декодера/проца который формирует I2S. А то обычно регулируют аналоговый сигнал уже после I2S кодека...
USMicro® 2026©
Играюсь с сегментными лед дисплеями, и заодно с таймерами.
У 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©
Короче, обычный 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©
Вот для ОА работает
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 местами поменять, но почему то пол дисплея тогда тупо не работает, но признаки жизни есть. Ткните носом меня куда смотреть.
Кстати, вот ОА


USMicro® 2026©
Вопрос, а можно как то регулировать громкость PCM? ну тоесть еще со стороны декодера/проца который формирует I2S. А то обычно регулируют аналоговый сигнал уже после I2S кодека...
Вопрос снят.
USMicro® 2026©
А для ОК по идее просто нужно 1 и 0 местами поменять, но почему то пол дисплея тогда тупо не работает, но признаки жизни есть. Ткните носом меня куда смотреть.
Наверное тут кто-то забыл сменить тип массива bShowBuff1 с u8 до u16, также как и его размер с 9 до 12 элементов.
И ещё в led7_scan поменять тип переменной seg также на u16, и заменить bit_table[n] на макрос BIT(n), или его тоже подкорректировать.
Здесь сканирование реализовано так, что на определённый пин подаётся высокий уровень, а на остальные пины подаётся низкий уровень там, где надо зажечь сегмент. Короче говоря обычный чарлиплекс.
В случае с общим анодом, в каждом элементе массива используются только биты 0-3, которые соответствуют пинам с разрядами, а на сегменты используются элементы 4-11 у массива.
В случае же с общим катодом, тут уже наоборот - первые четыре элемента используются под выводы разрядов, а биты в них уже отвечают за сегменты.
Вот тут и проблема - пинов у нас 12 но бит только 8, соответственно последние четыре сегмента теряются, ибо не вмещаются (биты 4-11).
Выходит как-то так:
Код:#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_ */
Код:#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
Вот тут и проблема - пинов у нас 12 но бит только 8, соответственно последние четыре сегмента теряются, ибо не вмещаются (биты 4-11).
Попробую на стандартном коде. Думаю что так и есть. Только почему так происходит, почему биты и сегменты местами меняются?
USMicro® 2026©
Только почему так происходит, почему биты и сегменты местами меняются?
Я из "А для ОК по идее просто нужно 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
ОА: 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©
Интересный момент, если добавить пинов, было 12, стало 16, и просто на последние 4 новых повесит 4 предыдущих что не работают почему то с ОК, то ОК начинает работать как нужно. ..
Почему так происходит,
В случае же с общим катодом, тут уже наоборот - первые четыре элемента используются под выводы разрядов, а биты в них уже отвечают за сегменты.
Вот тут и проблема - пинов у нас 12 но бит только 8, соответственно последние четыре сегмента теряются, ибо не вмещаются (биты 4-11).
Но я всеравно не доганяю почему разряды и сегменты меняются местами в случае с ОК. Почему работают новые пины 13-16? Но предыдущие 4 нет?
USMicro® 2026©
const u16 bit_table[8] =
{
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,
};
Оно?
USMicro® 2026©
Оно?
Туда ещё дописать 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...