Вам разьве не понятно для чего нужна данная таблица ? Где-же она магическая ? Тем более это константы, уточню, константы не для программы, а для меня. Эта таблица не изменится никогда, даже если будет меняться тип индикатора и расположение его выводов. Тогда вопрос - зачем, в моём вареанте, нужна читабельность таблицы ?Как я и предполагал, сплошь "магические числа" или побитовая инициализация.
А мне 10 секунд. Достаточно передефйнить выводы в начале файла.Теперь вопрос на засыпку: сколько времени понадобится Вам, чтобы переточить свою таблицу под другой вариант печатной платы или под другой индикатор? Я переделаю за минуту.
Где-же она не компактна, и чего тут оптимизировать ?С компактностью кода у Вас тоже не очень - оптимизировать- ненаоптимизироваться.
Ваша процедура индикации:Код: Выделить всё
void ind_update() { static char ind_num = 0; char tmp; ind_num ++; if(ind_num>3) ind_num = 0; ind_A1 =ANODE_INVERT; ind_A2 =ANODE_INVERT; ind_A3 =ANODE_INVERT; ind_A4 =ANODE_INVERT; if(ind[ind_num].A) ind_A =CATODE_INVERT; else ind_A =!CATODE_INVERT; if(ind[ind_num].B) ind_B =CATODE_INVERT; else ind_B =!CATODE_INVERT; if(ind[ind_num].C) ind_C =CATODE_INVERT; else ind_C =!CATODE_INVERT; if(ind[ind_num].D) ind_D =CATODE_INVERT; else ind_D =!CATODE_INVERT; if(ind[ind_num].E) ind_E =CATODE_INVERT; else ind_E =!CATODE_INVERT; if(ind[ind_num].F) ind_F =CATODE_INVERT; else ind_F =!CATODE_INVERT; if(ind[ind_num].G) ind_G =CATODE_INVERT; else ind_G =!CATODE_INVERT; if(ind[ind_num].H) ind_H =CATODE_INVERT; else ind_H =!CATODE_INVERT; if(ind_num==0) ind_A1 =!ANODE_INVERT; if(ind_num==1) ind_A2 =!ANODE_INVERT; if(ind_num==2) ind_A3 =!ANODE_INVERT; if(ind_num==3) ind_A4 =!ANODE_INVERT; }
Вот Ваша
Код: Выделить всё
void indikaciya(void)
{
LPC_GPIO1->DATA&=~(1<<ANODE_2|1<<ANODE_1|1<<ANODE_0);//Гашение всех разрядов
LPC_GPIO0->DATA|=(1<<SEG_a|1<<SEG_b|1<<SEG_c|1<<SEG_d|1<<SEG_e|1<<SEG_f|1<<SEG_g);
if (on_off==1)
{
phase++;
if (phase>2)
phase=0;
if (bcd_correct==1)
{
switch (phase)
{
case 0:
LPC_GPIO0->DATA&=segcode[bcd_temperatura[0]];
LPC_GPIO1->DATA|=(1<<ANODE_0);
break;
case 1:
LPC_GPIO0->DATA&=segcode[bcd_temperatura[1]];
LPC_GPIO1->DATA|=(1<<ANODE_1);
break;
case 2:
LPC_GPIO0->DATA&=segcode[bcd_temperatura[2]];
LPC_GPIO1->DATA|=(1<<ANODE_2);
break;
}
}
}
}
А теперь покажите как Вы переточите свой вариант за 1 минуту, если выводы индикаторов будут в разнопиздицу и на разных портах. Например аноды на 3-х разных портах и катоты на 2-х разных.
Да и вообще, считаю наш с Вами спор - глупой затеей. Каждый пишет программы так, как ему хочется/привык.
Все состояния битов после сброса, прописаны в ДШ. Если там написано 0, значит будет 0. Если написано 1, значит будет 1. И не важно по какой причине произошёл сброс. Но я тоже советую "жизнено важные" биты инить в начале программы. Хотя, сам лично, иногда "грешу"А вот это я бы назвал хождением по краю обрыва, - если после сброса какой-либо регистр содержит неизвестное значение (сбросов бывает много разных видов, кстати)


