Перейти к содержанию
    

дефайны

есть ряд дефайнов, которые зажигают в определенной позиции определенные числа

#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 дефайнов.

Как-то может через энумы и структуры?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

##

P.S. это не исправление ненужного текста, а команда препроцессора, изучите ее и пользуйтесь на здоровье.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

есть ряд дефайнов, которые зажигают в определенной позиции определенные числа

#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 дефайнов, которые дефайнят абсолютно не связанные между собой константы, но это явно не тот случай.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

используйте массив констант

вокруг этой мысли кручусь. А сам массив какого типа?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если это продолжение про 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));
}

(код не проверял)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вокруг этой мысли кручусь. А сам массив какого типа?

 

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

 

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

 

во, чукча писатель. не заметил, что выше товарищ и пример уже показал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да, psl, спасибо. Надо как-то так с макросами. Да, это 1621. Запустил я ее. Только там с памятью логика невнятная. Только через дефайны смог разумно поджигаемые сегменты описать.

Есть еще мысль- создать энум. В нем будут дефайны эти. Далее- структуру. Массив этих структур. Как-то так.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

const int table[MAX_POS][MAX_DIGIT]={

{POS0_DIGIT0,POS0_DIGIT1, ...},

{POS1_DIGIT0,POS1_DIGIT1,...},

......

}

 

void function(int pos, int digit){

table[pos][digit]

 

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, это 1621. Запустил я ее. Только там с памятью логика невнятная...

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

Т.е. нужно преобразовать выводимый символ в 8 битное поле по таблице bcd, а затем вывести это поле тетрадами по нечетному/четному адресам.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

спасибо всем за советы. После выходных буду пробовать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...