Jump to content

    

Recommended Posts

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

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

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

Share this post


Link to post
Share on other sites

##

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

Share this post


Link to post
Share on other sites
есть ряд дефайнов, которые зажигают в определенной позиции определенные числа

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

 

 

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
вокруг этой мысли кручусь. А сам массив какого типа?

 

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

 

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

 

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
Да, это 1621. Запустил я ее. Только там с памятью логика невнятная...

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

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

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this