Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: дефайны
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Метценгерштейн
есть ряд дефайнов, которые зажигают в определенной позиции определенные числа
Код
#define POS_1_DIGIT_0  ...
#define POS_1_DIGIT_1  ...
#define POS_1_DIGIT_2  ...
#define POS_1_DIGIT_3  ...
#define POS_1_DIGIT_4  ...


как на базе их правильно сделать ф-ю, в которую передается номер позциции и число, которое зажечь надо?
Например, передаю Pos1, Dig3
Выбирается дефайн POS_1_DIGIT_3

Case switch- как последний вариант, т.к. всего 60 дефайнов.
Как-то может через энумы и структуры?
ViKo
##
P.S. это не исправление ненужного текста, а команда препроцессора, изучите ее и пользуйтесь на здоровье.
Метценгерштейн
и что это значит?
CrimsonPig
Цитата(Метценгерштейн @ May 8 2015, 09:57) *
есть ряд дефайнов, которые зажигают в определенной позиции определенные числа
Код
#define POS_1_DIGIT_0  ...
#define POS_1_DIGIT_1  ...
#define POS_1_DIGIT_2  ...
#define POS_1_DIGIT_3  ...
#define POS_1_DIGIT_4  ...


как на базе их правильно сделать ф-ю, в которую передается номер позциции и число, которое зажечь надо?
Например, передаю Pos1, Dig3
Выбирается дефайн POS_1_DIGIT_3

Case switch- как последний вариант, т.к. всего 60 дефайнов.
Как-то может через энумы и структуры?


Лучше всего править в консерватории. То есть править сам подход к написанию функции отображения чего-то на чем-то.
60 дефайнов для такого случая это не нормально.

Не, ну конечно бывают случаи, когда есть 100 дефайнов, которые дефайнят абсолютно не связанные между собой константы, но это явно не тот случай.

smalcom
используйте массив констант
Метценгерштейн
Цитата(smalcom @ May 8 2015, 17:56) *
используйте массив констант

вокруг этой мысли кручусь. А сам массив какого типа?
psL
Если это продолжение про HT1621, то может как-то так сделать?

Код
// сдвиги для каждой половины знака
#define SHIFT_HALFSIGN0    0
#define SHIFT_HALFSIGN1    4

// сегменты
#define SEG_A(x) ((x<<3)<<SHIFT_HALFSIGN1)
#define SEG_B(x) ((x<<2)<<SHIFT_HALFSIGN1)
#define SEG_C(x) ((x<<1)<<SHIFT_HALFSIGN1)
#define SEG_D(x) ((x<<0)<<SHIFT_HALFSIGN0)
#define SEG_E(x) ((x<<1)<<SHIFT_HALFSIGN0)
#define SEG_F(x) ((x<<2)<<SHIFT_HALFSIGN0)
#define SEG_G(x) ((x<<3)<<SHIFT_HALFSIGN0)
#define SEG_H(x) ((x<<0)<<SHIFT_HALFSIGN1)

// дешифратор:
const uint8_t bcd[] =
{
  SEG_A(1)|SEG_B(1)|SEG_C(1)|SEG_D(1)|SEG_E(1)|SEG_F(1)|SEG_G(0), //0
  SEG_A(0)|SEG_B(1)|SEG_C(1)|SEG_D(0)|SEG_E(0)|SEG_F(0)|SEG_G(0), //1
  SEG_A(1)|SEG_B(1)|SEG_C(0)|SEG_D(1)|SEG_E(1)|SEG_F(0)|SEG_G(1), //2
  SEG_A(1)|SEG_B(1)|SEG_C(1)|SEG_D(1)|SEG_E(0)|SEG_F(0)|SEG_G(1), //3  
  SEG_A(0)|SEG_B(1)|SEG_C(1)|SEG_D(0)|SEG_E(0)|SEG_F(1)|SEG_G(1), //4
  SEG_A(1)|SEG_B(0)|SEG_C(1)|SEG_D(1)|SEG_E(0)|SEG_F(1)|SEG_G(1), //5
  SEG_A(1)|SEG_B(0)|SEG_C(1)|SEG_D(1)|SEG_E(1)|SEG_F(1)|SEG_G(1), //6
  SEG_A(1)|SEG_B(1)|SEG_C(1)|SEG_D(0)|SEG_E(0)|SEG_F(0)|SEG_G(0), //7  
  SEG_A(1)|SEG_B(1)|SEG_C(1)|SEG_D(1)|SEG_E(1)|SEG_F(1)|SEG_G(1), //8
  SEG_A(1)|SEG_B(1)|SEG_C(1)|SEG_D(1)|SEG_E(0)|SEG_F(1)|SEG_G(1), //9
  SEG_A(1)|SEG_B(1)|SEG_C(1)|SEG_D(0)|SEG_E(1)|SEG_F(1)|SEG_G(1), //A
  SEG_A(0)|SEG_B(0)|SEG_C(1)|SEG_D(1)|SEG_E(1)|SEG_F(1)|SEG_G(1), //B
  SEG_A(1)|SEG_B(0)|SEG_C(0)|SEG_D(1)|SEG_E(1)|SEG_F(1)|SEG_G(0), //C
  SEG_A(0)|SEG_B(1)|SEG_C(1)|SEG_D(1)|SEG_E(1)|SEG_F(0)|SEG_G(1), //D
  SEG_A(1)|SEG_B(0)|SEG_C(0)|SEG_D(1)|SEG_E(1)|SEG_F(1)|SEG_G(1), //E
  SEG_A(1)|SEG_B(0)|SEG_C(0)|SEG_D(0)|SEG_E(1)|SEG_F(1)|SEG_G(1), //F
};

void lcd_put(int pos, int sign)
{
    uint8_t s=bcd[sign];
    uint8_t addr=pos<<1;
    
    write_nibble(  addr, 0x0F & (s >> SHIFT_HALFSIGN0));
    write_nibble(++addr, 0x0F & (s >> SHIFT_HALFSIGN1));
}

(код не проверял)
smalcom
Цитата(Метценгерштейн @ May 8 2015, 20:21) *
вокруг этой мысли кручусь. А сам массив какого типа?


всмысле какого типа? ну вещественные числа вам подойдут? сомневаюсь. а int32? да тоже врядли - этож какой индикатор нужен.

вкратце - это вы (жених), спросили у меня чем собсна невесту ... крутитесь вокруг идеи, что надо, но чем.

во, чукча писатель. не заметил, что выше товарищ и пример уже показал.
Метценгерштейн
да, psl, спасибо. Надо как-то так с макросами. Да, это 1621. Запустил я ее. Только там с памятью логика невнятная. Только через дефайны смог разумно поджигаемые сегменты описать.
Есть еще мысль- создать энум. В нем будут дефайны эти. Далее- структуру. Массив этих структур. Как-то так.
_pv
const int table[MAX_POS][MAX_DIGIT]={
{POS0_DIGIT0,POS0_DIGIT1, ...},
{POS1_DIGIT0,POS1_DIGIT1,...},
......
}

void function(int pos, int digit){
table[pos][digit]

}
psL
Цитата(Метценгерштейн @ May 9 2015, 20:47) *
Да, это 1621. Запустил я ее. Только там с памятью логика невнятная...

насколько понял, у символьных индикаторов на ее основе один семисегментный знак разбит на два адреса в 4битном озу. Один семисегментный знак - это 8 бит.
Т.е. нужно преобразовать выводимый символ в 8 битное поле по таблице bcd, а затем вывести это поле тетрадами по нечетному/четному адресам.
Метценгерштейн
спасибо всем за советы. После выходных буду пробовать.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.