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

 
 
> дефайны, нужно как-то свести в ф-ю
Метценгерштейн
сообщение 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
 
Start new topic
Ответов
psL
сообщение May 8 2015, 19:05
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 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



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

 


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


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