|
|
  |
дефайны, нужно как-то свести в ф-ю |
|
|
|
May 8 2015, 08:57
|
Профессионал
    
Группа: Свой
Сообщений: 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 дефайнов. Как-то может через энумы и структуры?
|
|
|
|
|
May 8 2015, 11:05
|

Местный
  
Группа: Участник
Сообщений: 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 дефайнов, которые дефайнят абсолютно не связанные между собой константы, но это явно не тот случай.
|
|
|
|
|
May 8 2015, 19:05
|
Знающий
   
Группа: Свой
Сообщений: 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)); } (код не проверял)
|
|
|
|
|
May 10 2015, 06:52
|
Знающий
   
Группа: Свой
Сообщений: 526
Регистрация: 5-08-05
Пользователь №: 7 390

|
Цитата(Метценгерштейн @ May 9 2015, 20:47)  Да, это 1621. Запустил я ее. Только там с памятью логика невнятная... насколько понял, у символьных индикаторов на ее основе один семисегментный знак разбит на два адреса в 4битном озу. Один семисегментный знак - это 8 бит. Т.е. нужно преобразовать выводимый символ в 8 битное поле по таблице bcd, а затем вывести это поле тетрадами по нечетному/четному адресам.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|