реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> дефайны, нужно как-то свести в ф-ю
Метценгерштейн
сообщение May 8 2015, 08:57
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



есть ряд дефайнов, которые зажигают в определенной позиции определенные числа
Код
#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 дефайнов.
Как-то может через энумы и структуры?
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 8 2015, 09:01
Сообщение #2


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



##
P.S. это не исправление ненужного текста, а команда препроцессора, изучите ее и пользуйтесь на здоровье.
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение May 8 2015, 09:03
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



и что это значит?
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение May 8 2015, 11:05
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502



Цитата(Метценгерштейн @ 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 дефайнов, которые дефайнят абсолютно не связанные между собой константы, но это явно не тот случай.

Go to the top of the page
 
+Quote Post
smalcom
сообщение May 8 2015, 14:56
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



используйте массив констант
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение May 8 2015, 17:21
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



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

вокруг этой мысли кручусь. А сам массив какого типа?
Go to the top of the page
 
+Quote Post
psL
сообщение May 8 2015, 19:05
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 5-08-05
Пользователь №: 7 390



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

(код не проверял)
Go to the top of the page
 
+Quote Post
smalcom
сообщение May 9 2015, 03:24
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



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


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

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

во, чукча писатель. не заметил, что выше товарищ и пример уже показал.
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение May 9 2015, 17:47
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



да, psl, спасибо. Надо как-то так с макросами. Да, это 1621. Запустил я ее. Только там с памятью логика невнятная. Только через дефайны смог разумно поджигаемые сегменты описать.
Есть еще мысль- создать энум. В нем будут дефайны эти. Далее- структуру. Массив этих структур. Как-то так.
Go to the top of the page
 
+Quote Post
_pv
сообщение May 10 2015, 06:18
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



const int table[MAX_POS][MAX_DIGIT]={
{POS0_DIGIT0,POS0_DIGIT1, ...},
{POS1_DIGIT0,POS1_DIGIT1,...},
......
}

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

}
Go to the top of the page
 
+Quote Post
psL
сообщение May 10 2015, 06:52
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 5-08-05
Пользователь №: 7 390



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

насколько понял, у символьных индикаторов на ее основе один семисегментный знак разбит на два адреса в 4битном озу. Один семисегментный знак - это 8 бит.
Т.е. нужно преобразовать выводимый символ в 8 битное поле по таблице bcd, а затем вывести это поле тетрадами по нечетному/четному адресам.
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение May 11 2015, 17:16
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



спасибо всем за советы. После выходных буду пробовать.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 15:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.01445 секунд с 7
ELECTRONIX ©2004-2016